我们要爬取的网站为http://image.so.com/z?ch=photography,打开开发者工具,页面往下拉,观察到出现了如图所示Ajax请求

其中list就是图片的详细信息,接着观察到每个Ajax请求的sn值会递增30,当sn为30时,返回前30张图片,当sn为60时,返回第31到60张图片,所以我们每次抓取时需要改变sn的值。接下来实现这个项目。
首先新建一个项目:scrapy startproject images360
新建一个Spider:scrapy genspider images images.so.com
在settings.py中定义爬取的最大量:MAX_PAGE=10
定义一个Item以接收Spider返回的Item:

修改images.py:

利用urlencode()方法将data转化为URL的get参数,每次爬取30张图片直到爬取完成。
修改settings.py中ROBOTSTXT_OBEY变量为False,这个变量代表是否遵守网站的爬取规则,若不修改则无法爬取。
接下来我们要把爬取到的数据存入数据库,新建数据库以及表的操作在此不再赘述。创建好数据库及表后,我们需实现一个Item Pipeline以实现存入数据库的操作:

这里需要在settings.py中添加几个关于MySQL配置的变量,如下所示:
MYSQL_HOST = 'localhost'
MYSQL_DATABASE = 'images360'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASSWORD = '123456'
scrapy提供了专门处理下载的Pipeline。首先定义存储文件的路径,在settings.py中添加:IMAGES_STORE = './images'
定义ImagePipeline:

get_media_requests()方法取出Item对象的URL字段,生成Request对象发送给Scheduler,等待执行下载。
file_path()方法返回图片保存的文件名。
item_complete()方法当图片下载成功时返回Item说明下载成功,否则抛出DropItem异常,忽略这张图片。
最后需在settings.py文件中设置ITEM_PIPELINES以启动item管道:

网友评论