Python 百度图片爬取

Python 百度图片爬取

还在为图片不够,一张张点下载发愁吗,这次我们图片一次爬到够!

这次的代码还是很常规的,只是链接的获取要有些技巧,直接代码解说。

"""这次从逻辑上层到逻辑底层讲解"""
if __name__=='__main__':
    headers={
    
    
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
    Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362',
        'Referer':'https://www.baidu.com/?tn=18029102_3_dg'
        }#设置必不可少的请求头
    name=input('请输入你要爬取图片的相关名:')
    num=int(input('请输入你要爬取的页数:'))
    print('爬取图片中……')
    pictureSpider(name,num)#爬虫入口,等会你就知道为啥要传这两个参数了
    print('程序执行完毕')
"""有必要说的就是程序可以美观但是人机交互还是要有的,这是个好习惯,没有提示的话那连作为作者的我们也会抓瞎,不知道错从何来"""      

这次导入的模块只有 requests 和 json。这里就讲一下抓包时的小技巧吧,也可以说是习惯吧。总所周知,数据的传送一般都是靠数据包这种的存在,不可能什么东西都能在网站的源代码中获得,json就是一种数据的传输方式,这次的爬取中就直接避开了网站源码的分析,变成了json数据处理的训练。

"""代码很精简,也就表明,这里面调用的函数代码会比较长"""
def pictureSpider(name,num):
    pic_urls=get_detail_url(name,num) #这是用来获取百度图片的json数据包内容
    print('图片下载中……')
    for url in pic_urls:#逐一下载返回的图片链接内容
        downloads(url)

看看如何实现 get_detail_url 和 downloads 这两个函数吧

"""我们先从短的开始吧,都是些常规操作,要是你不熟悉的话可以把这个作为模板"""
def downloads(url):
    name=url.split('/')[-1]#截取图片链接最后的字段作为图片名
    response =requests.get(url,headers=headers)
    #最好想清楚图片要存在哪里,自行修改
    with open('E:/Photo/{}'.format(name),'wb')as f:
        f.write(response.content)
    print(url+'下载成功')

准备好接受轰炸了吗

def get_detail_url(name,num):
    pic_urls=[] #用于存储图片链接
    for i in range(num):#输入的数字最好别太大,说不定已经被你爬完了,我的建议是30以内,计算是这样也已经有近千张图片了,你可以自己算算每个json有多少张图片
        index=i*30 #只是个索引,要分析比较网站才能知道,所以爬虫重在实战
        #由于此处会报错,故跳过
        if index==180:#这里是我在爬取idol时遇到的问题,你也可以自己做出调整
            continue
        url='http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&is=&fp=result&word={}&pn={}&rn=30'.format(name,index)
  
        try:
            response=requests.get(url,headers=headers)
            #过滤无效网址
            if len(response.text)>5000: #为了判断是不是我们需要的json网址
                data=json.loads(response.text,strict=False) #strict的意思大家可以自己查查,关于json的操作还是挺重要的
                thumb_urls=[]
                for i in range(30): #你猜到了吧,每个json差不多是30张图片链接
"""json的网站分析的时候可以用到谷歌浏览器的插件,可以方便很多哦,就是JSON Viewer,不知道的小伙伴请自行百度"""                
                    thumb_url=data['data'][i]['thumbURL']
                    thumb_urls.append(thumb_url)
                pic_urls.extend(thumb_urls)
                print(url+'访问成功')
            else:
                continue
        except:
            continue
    print('图片数据爬取完毕')
    return pic_urls

其实写这篇文章前我代码还是定向爬取我自己idol的写真,可是呢之前发现还可以做到普适化,根据输入获取响应图片,就有了这篇文章。

开始的 url 是这样的:
http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj
&ct=201326592&is=&fp=result&queryWord=%E8%A5%BF%E9%87%8E%E4%B8%83%E6%BF%91&cl=2&lm=-1&ie=utf-8&oe=utf8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=%E8%A5%BF%E9%87%8E%E4%B8%83%E6%BF%91&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn={}&rn=30

看上去是不是没有上面的那么美观,上面展示的是我缩减后的网址。
网址有时候并不是全部都是关键信息,我们可以人为对网址进行精简。

熟悉编码的小伙伴就知道这些%什么的这些字符串就是一些中文的字符,只是换了个编码方式,比如:
“胡歌”编码后就是 %E8%83%A1%E6%AD%8C

http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&is=&fp=result&word={}&pn={}&rn=30
这个网址里面最有用的就是word这个关键词了吧,这就是你要搜索的图片名。

要是问怎么精简网址,当然是自己删一部分试罗,这种方式是比较快的,貌似也有些网址提供这种服务吧。
哈哈哈,这也印证那句“三分天注定,七分靠打拼”,努力固然重要,有时候还是要有些运气的。大家慢慢体会吧。
最后附上一张成果图吧!
喜欢就点个赞,关注一下吧!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43594279/article/details/105825519