【python小练习】百度图片小爬虫

来源:互联网 发布:做淘宝客服简历 编辑:程序博客网 时间:2024/04/25 00:32

第一篇博客翻译了一个21行的单词纠错器,这次就给大家贡献一个21行的百度图片爬虫。(我仿佛很喜欢21这个数字嘛。。。)因为博主最近在做一个pix2pix的项目,需要很多图片作为原始训练集,因此想到了自己爬一个数据集。
因为博主本人的编程渣功底,所以这次的代码也相当于是一个玩具代码,试试通过识别url,正则匹配的一些简单的操作,实现爬取所需网络图片并且保存下来的功能,具体的一些爬虫的更高深的知识如果大家有兴趣,可以学习Beautiful soup和scrapy两个包的使用。编写更加无敌的爬虫。

老惯例,先把代码粘上,如果是想拿去用的同学,看到这一步就可以带着代码走了!~用的是python2.7~没啥依赖包 re和requests貌似都是自带的?

#-*- coding:utf-8 -*-import reimport requestsn=10for i in range(n):    tem=str(i*60)    url='https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA&pn='+tem+'&gsm=0'    html=requests.get(url).text    pic_url=re.findall('"objURL":"(.*?)",',html,re.S)    n=i*60    for each in pic_url:        print each        try:            pic=requests.get(each,timeout=80)        except requests.exceptions.ConnectionError:            print '打不开!哼'            continue        string='pictures\\'+str(n)+'.jpg'        fp=open(string,'wb')        fp.write(pic.content)        fp.close()        n=n+1

使用方式

简述一下这个代码的使用方式,首先,打开百度图片。搜索一个关键词,如“小黄人”。此时你会发现网址是一个很奇怪的东西:
“https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA&ct=201326592&v=index”
并且没有翻页按钮,是瀑布流的模式,会随着你往下滚鼠标而不断加载新的图片。这不利于我们严谨的编程思维,因此我们点击屏幕右上角的,传统翻页模式:

给我的蠢萌百度名字加个马赛克

此时你的网址还是一大堆你根本看不懂的东西!
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA&ct=201326592&v=flip

此时,我们翻到第二页,你发现,网址变成了:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA&pn=20&gsm=0
第三页,网址:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA&pn=40&gsm=0

终于发现了规律!秘密就在pn后面的数值上。但是这里需要注意,你有时候会发现“gsm=”后面的数值不是0,而是一些奇奇怪怪的乱码,我一开始以为是百度为了防止我们爬取它的图片故意这么设置的,后来发现,你把结尾的“gsm=”后面的东西改成0,仍然是你i需要的页面。此时,我们就可以愉快的把这个东西粘贴进代码中的url部分,开始搜集小黄图了!(误!小黄人)

在该代码所在的路径下,新建一个叫“picture”的文件夹,图片就会自动保存在这个文件夹中了!现在代码中每个循环会自动保存60张图,range(n)代表进行n次循环,你可以根据自己想要图片数更改这个值。最终得到的图片数约为60*n。然后运行这个代码,你就会发现小黄人”刷刷刷”写进你的硬盘啦~

以上就是使用这个代码的全部方法了咳咳不想知道原理的同学!你可以愉快的去爬取自己喜欢的图片了~~接下来我们假装介绍一下原理!~

一些原理

为了简便的介绍一下原理,我们考虑每一个单独的循环中发生的事情,请想象现在i=0。

    url='https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA&pn='+tem+'&gsm=0'    html=requests.get(url).text    pic_url=re.findall('"objURL":"(.*?)",',html,re.S)    n=i*60    for each in pic_url:        print each        try:            pic=requests.get(each,timeout=80)        except requests.exceptions.ConnectionError:            print '打不开!哼'            continue        string='pictures\\'+str(n)+'.jpg'        fp=open(string,'wb')        fp.write(pic.content)        fp.close()        n=n+1

首先我们通过request请求,解析url中存储的内容!

html=requests.get(url).text

然后发现得到这样一堆玩意:
debug时候看到的html中的内容
这些其实就是原网页解码的内容,经过分析我们会发现其中有很多长得很像图片地址的,”jpg“结尾的东西,分别是hoverURL,objURL和fromURL,通过把这三个关键词后面跟着的地址粘进浏览器我们发现”objURL“是最大最清晰的一个!因此,就是我们所需的下载地址啦。

接下来只需要写一个正则匹配的式子,把objURL后面跟着的,冒号开头,逗号结尾的中间的图片地址抓出来就好了!!~

pic_url=re.findall('"objURL":"(.*?)",',html,re.S)

接下来就是循环抓到的地址列表,一个一个的把图片显示并且保存下来。

        try:            pic=requests.get(each,timeout=80)        except requests.exceptions.ConnectionError:            print '喵喵喵,图片打不开'

有时候图片有可能打不开,在中间加一个timeout=80的控制符,就是尝试打80秒钟,打不开就输出”喵喵喵,图片打不开“
然后你就会get一个一会下载图片,一会喵喵卖萌的图片小爬虫啦~~

经过实践发现,每一个url抓取到的html中其实包含60张图片,是三页的内容,根据我们之前发现的pn后面的数值和页码之间的关系,我们就可以在整个程序外面再嵌套一个大循环,来作为自动翻页。每次pn后边的数字就是i*60(60张图片翻页一次,也就是更换url一次)。然后再设置一个n参数来给图片命名,存一张图片就让n++,保证每张图片按顺序命名。

接下来就尽情享受这个可爱的图片小爬虫吧。。。可怜的博主继续去处理图片制作训练集了TAT

3 0