scrapy爬取百度图片,解决ajax+json的异步问题

首先,我用爬虫的目的是为了学习图像处理,为制作自己的图像数据集,去训练分类器所用,所以这是一项基本技能吧,话不多说,下面就是我用scrapy框架去爬取百度图片的分类器

1.明确要爬取的对象是什么

1)找到json文件

百度图片采用的是ajax+json机制,单独一次访问返回的html只是一个空壳,需要的图片信息并不在其中,真真的图片信息被打包放在json文件当中,所以我们真正要解读的是json文件,而不是html

当你打开百度图片,并输入哈士奇关键字,然后用chrome的开发者工具,在Network下选中XHR类型,然后尝试用鼠标下滑网页,以刷出更多的图片,那么就可以看到服务器发过来的json文件,一下有两个以acjson?开头的json文件就是我们要解读的

2)如何解读json文件

我们直接用的pythonjson库,很方便地就可以解析json了,我们用浏览器是为了得到,请求服务器返回json文件的url,我们request这个url,服务器就会返回一个json

那么这个jsonurl在哪里呢?点击其中一个json,在右边的Headers下的General中就有一个Request URL,其内容就是JsonURL


2.创建scrapy工程,创建爬虫

scrapystartproject baidupic

cdbaidupic

scrapygenspider baidu_pic_get image.baidu.com

这样工程就创建完了


3.配置爬虫

1)编辑Items

只定义了一个URL

2)编辑spider文件

中间那么一大片就是jsonurl地址,爬虫第一个request不是去访问百度图片,而是直接去发送这个jsonrequest,然后直接对返回的json文件进行解读即可

注意,这个urlqueryWord,word内容配置成要查询的关键字,pn为查询第几页的意思3)编写pipline.py(其实不用改)

其实这就是项目生成时的pipline,不用做修改,因为这个piplinefilepipline,但是我们要处理并下载图片用的scrapyimagepipline,所以在setting中直接启用scrapy框架中默认的Imagepipline,而并没有启用用户定义的这个filepipline

4)配置setting.py

前面三行都是自动生成的,我们要做的是

添加第四行,启用ImagesPipline

添加第五行,指定下载Image的网址在ItemURL

添加第六行,指定图片文件放在哪里,这里指定放在当前目录下

添加第七行,指定输出的log信息放在哪里

最后把ROBOTSTXT_OBEY配置成False

4.运行爬虫

scrapycrawl baidu_pic_get -o result.csv

项目中得到一个result.csv文件,一个scrapy.log文件,以及一个full文件夹,里边存放着图片
result中存放着所有item的信息,我们只给item定义了一个URL,所以里边都是图片的url

但是full里边的图片文件名都很长,不方便处理,所以我们还需要一步图片重命名的操作

 

5.图片重命名

我写了一个rename_files.py

内容很简单,用了os.listdir,以及os.rename

结果,full文件夹下的图片名已经被改了
最后,我们的成果如下:

展开阅读全文

没有更多推荐了,返回首页