scrapy
安装
pip install scrapy
框架由5部分组成:
引擎、下载器、spiders、调度器(schedule)、管道(pipeline)
创建scrapy项目
scrapy startproject myscrapy
settings文件中修改是否遵循robots协议
ROBOTSTXT_OBEY = False
创建spider,自动生成first.py
scrapy genspider frist first.com
Spider 属性
name: Spider名字
allowed_domains: 允许爬取的域名
start_urls: Spider启动时爬取的url列表
parse: 负责解析返回的响应,提取数据或进⼀步处理
运行
scrapy crawl football
保存到文件
scrapy crawl first -o first.json
scrapy基于lxml构建,支持xpath,css,正则表达式
Spider
1、 name:爬⾍的名字。
2、 allowed_domains:允许爬取的域名,不在此范围的链接不会被跟进爬取。
3、 start_urls:起始URL列表,当我们没有重写start_requests()⽅法时,就会从这个列表开始爬取。
4、 custom_settings:⽤来存放蜘蛛专属配置的字典,这⾥的设置会覆盖全局的设置。
5、 crawler:由from_crawler()⽅法设置的和蜘蛛对应的Crawler对象, Crawler对象包含了很多项⽬组件,利⽤它我们可以获取项⽬的配置信息,如调⽤crawler.settings.get()⽅法。
6、 settings:⽤来获取爬⾍全局设置的变量。
7、 start_requests():此⽅法⽤于⽣成初始请求,它返回⼀个可迭代对象。该⽅法默认是使⽤GET请求访问起始URL,如果起始URL需要使⽤POST请求来访问就必须重写这个⽅法,发送POST请求使⽤FormRequest⽅法
8、 parse():当Response没有指定回调函数时,该⽅法就会被调⽤,它负责处理Response对象并返回结果,从中提取出需要的数据和后续的请求,该⽅法需要返回类型为Request或Item的可迭代对象(⽣成器当前也包含在其中,因此根据实际需要可以⽤return或yield来产⽣返回值)。
9、 closed():当蜘蛛关闭时,该⽅法会被调⽤,通常⽤来做⼀些释放资源的善后操作。
middleware
1、调度器将Request发给Downloader下载之前,可以对Request进⾏修改process_request(request, spider)
2、下载后⽣成的Response发给Spider之前,可以对Response进⾏修改process_response(request, response, spider)
3、 Downloader或process_request()⽅法异常process_exception(request, exception, spider)
Pipeline
Image pipeline
get_media_requests(self,item, info):
ImagePipeline根据image_urls中指定的url进⾏爬取,可以通过get_media_requests为每个
url⽣成⼀个Request。如:
for image_url in item[‘image_urls’]:
self.default_headers[‘referer’] = image_url
yield Request(image_url, headers=self.default_headers)
item_completed(self, results, item, info):
图⽚下载完毕后,处理结果会以⼆元组的⽅式返回给item_completed()函数。这个⼆元组定义
如下:
(success, image_info_or_failure)
其中,第⼀个元素表示图⽚是否下载成功;第⼆个元素是⼀个字典。如:
def item_completed(self, results, item, info):
image_paths = [x[‘path’] for ok, x in results if ok]
if not image_paths:
raise DropItem(“Item contains no images”)
item[‘image_paths’] = image_paths
return item
分布式爬虫
爬取队列:使⽤Redis列表或有序集合 (默认是redis有序集合)
去重:使⽤Redis集合保存Request的指纹,提供重复过滤
中断续爬:调度器从Redis队列中取上次没有爬的继续爬取
使用分布式
安装scrapy-redis
pip install scrapy-redis
redis
有序集合,在集合的基础上,为每元素排序;元素的排序需要根据另外⼀个值来进⾏⽐较,所
以,对于有序集合,每⼀个元素有两个值,即:值和分数,分数专⻔⽤来做排序。