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=©right=&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这个关键词了吧,这就是你要搜索的图片名。
要是问怎么精简网址,当然是自己删一部分试罗,这种方式是比较快的,貌似也有些网址提供这种服务吧。
哈哈哈,这也印证那句“三分天注定,七分靠打拼”,努力固然重要,有时候还是要有些运气的。大家慢慢体会吧。
最后附上一张成果图吧!
喜欢就点个赞,关注一下吧!
上一篇: 总结关于数据库、表注意点