Python--Scrapy
scrapy
spider
- 爬虫,负责生成Request以及对爬取结果解析并生成对应的Item
spider middleware
- 爬虫中间件,位于engine和spider之间,可以对响应和Item进行处理
engine
- 引擎,负责处理整个系统的数据流和事件
schelduler
- 调度器,负责维护Request队列及对Request的调度逻辑
downloader
- 下载器,负责根据Request从网络下载数据
downloader middleware
- 下载中间件,位于engine与downloader之间,可以对请求和响应进行处理
item pipline
- 项目管道,负责对Item进行清洗、验证、存储等工作
命令
- 创建项目:scrapy startproject 项目名称
- 创建爬虫:scrapy genspider 爬虫名称 域名
- 在spiders目录下生成一个类,这个类继承自scrapy.Spider
- 生成的类中包含3个属性和一个方法
- name: 爬虫名称,命名在项目中必须唯一
- allowed_domains: 此爬虫被允许爬取的域名
- start_urls: 初始请求的url
- parse(): 默认的对start_urls初始请求的解析方法
- 启动爬虫:scrapy crawl 爬虫名称
- 将爬取的Item存到文件:
- scrapy的Feed Exports提供了文件存储功能,支持格式:json,jsonline,xml,pickle等,还支持ftp, s3等远程输出
- 不用额外写代码,启动爬虫时指定文件名就可以了:scrapy crawl 爬虫名称 -o 文件名称
- 还可以通过自定义类继承ItemExporter来实现其他输出
- 当然,也可以用Item Pipeline自己编码写文件
API
Crawler
Spider
- 属性
- name: 爬虫名称,必须项目内唯一,一般以爬取的域名作为爬虫名称
- allowed_domains: 被允许爬取的域名
- start_urls: 初始urls,如果没有覆盖方法start_requests,则会以此属性作为初始爬取的url
- custom_settings: 这是一个类变量,是当前爬虫的专属配置,会覆盖全局配置
- crawler: 是一个Crawler对象,通过类方法from_crawler设置
- settings: 当前爬虫的配置信息
- 方法
- start_requests: 生成初始请求,默认的代码实现的是从start_urls属性生成对应的Request
- parse: 默认的解析函数,如果Request没有指定callback参数,就会调用此方法对Response进行解析,此方法需要返回字典或者Item或则Request
- closed: 当关闭Spider时,会调用此方法,一般用来进行收尾操作,比如释放资源
Request
- 构造参数
- url
- method: 默认GET
- header: 请求头
- cookies:
- callback: 回调方法,用来解析Response
- meta: 附加信息,可以用来传递额外的参数
- 字典类型,scrapy预留了一些特殊的key,在利用此字段时不要与那些key冲突,比如:proxy, max_retry_times
- 具体有哪些特殊可以,参考
- body: 请求体
- encoding: 默认utf-8
- prority: 优先级,默认是0,数值越大越先被Scheduler调度
- dont_filter: 不去重,默认为False
- errback: 错误处理方法
- flags: 请求的标志
- cb_kwargs: 回调方法的额外参数,可以作为字典传递
FormRequest
- post提交,表单格式,请求头Content-Type是application/x-www-form-urlencoded
- 构造参数:
- formdata: 表单数据
JsonRequest
- post提交,json格式,请求头Content-Type是application/json
- 构造参数:
- data: 请求数据
Response
- 属性
- url
- request
- status
- headers: 响应头
- body: 二进制数据
- certificate: SSL证书对象,是twisted.internet.ssl.Certificate类型对象
- ip_address
- meta: 附加信息,可以用来传递额外参数
- 方法
- urljoin
- follow
- follow_all
HtmlResponse
- 属性
- text
- encoding
- selector
- 方法
- xpth('xpath')
- css('css选择器')
- json(): Scrapy2.2新增方法
Item
- 自定义Item,需要继承Item
- 属性初始化用Field()
class PersonItem(Item):
age = Field()
name = Field()
Selector
-
xpath('xpath')
- 以xpath的方式定位并提取数据
- 返回的是SelectorList类型
- 文本: text()
- 属性: @属性名
-
css('css选择器')
- 以css选择器的方法进行定位并提取数据
- 返回的是SelectorList类型
- 文本: ::text
- 属性: ::attr(属性名)
-
xpath()和css()方法可以混搭链式调用
SelectorList
-
这是一个list的子类
-
里面存的是Selector对象
-
xpath('xpath')
-
css('css选择器')
-
extract()
- 将结果提取为字符串数组
-
extract_first(self, default=None)
- 返回结果中第一个元素的字符串形式
- 如果结果列表为空,则返回default
-
re()
- 正则方式定位并提取元素
-
re_first(default=None)
- 返回正则匹配结果中的第一个
- 如果匹配结果为空,则返回default
自定义Item Pipeline
-
定义类,并实现以下方法,其中process_item为主要方法
-
from_crawler(cls, crawler)
- 这是一个类方法,需要使用@classmethod标注
- 通过crawler.settings可以获取配置文件settings.py的配置信息,这个是一个字典类型数据
-
open_spider(self, spider)
- 当Spider被开启时,这个方法会被调用,主要进行一些初始化操作
-
process_item(self, item, spider)
- 当Spider生成Item时,Item就会被传递到此方法进行处理
- 一般实现Item Pipeline只需实现此方法即可
- 此方法必须返回包含数据的字典或者Item对象或者DropItem对象
-
close_spider(self, spider)
- 当Spider被关闭时,此方法会被调用,主要进行一些收尾操作,比如释放资源
-
-
在setting.py配置文件中进行配置
- 在ITEM_PIPELINES参数增加上面编写的类
ITEM_PIPELINES = { '类的全路径': 优先级数字, } # 优先级数字越小,越先被执行
自定义Downloader Middleware
-
定义类,实现至少以下方法中的一个
- process_request(request, spider)
- 返回值不同,对应的处理方式不一样
- None: 继续执行后续的中间件
- Response: 后续的中间件不被调用,执行已经被调用到的中间件的process_response方法
- Request: 本次请求结束,一个全新的Request放到调度队列等待调度
- IgnoreRequest: 所有中间件的process_expressoin依次执行,如果没有一个方法处理此异常,则Request的errback方法被执行,如果还是没有处理,则会忽略此异常
- 返回值不同,对应的处理方式不一样
- process_response(request, response, spider)
- 返回值
- Request: 后续的中间件process_reponse方法将不被执行,一个全新的Request放到调用队列等待调用
- Response: 后续的中间件prcocess_response方法继续执行
- IgnoreRequest: Request的errback被执行,如果没有被处理,则会忽略此异常
- 返回值
- process_exception(request, exception, spider)
- None: 后续中间件的process_exception继续被执行
- Response: 后续中间件的process_exception方法不被执行,而是执行后续中间件的process_response方法
- Request: 后续中间件的process_exception方法不被执行,一个全新的Request放到调用队列等待调用
- process_request(request, spider)
-
在setting.py配置文件中进行配置
- 在DOWNLOADER_MIDDLEWARES参数设置自己编写的类
DOWNLOADER_MIDDLEWAERS = { '类的全路径': 优先级数字, } # 优先级数字越小,则中间件越靠近engine,process_request方法越先被调用,process_response方法则约被后调用 -
在scrapy内置许多下载中间件,默认开启的中间件已经通过default_setting.py中定义的DOWNLOADER_MIDDLEWARES_BASE进行了设置。我们不要直接修改DOWNLOADER_MIDDLEWARES_BASE变量,而是通过DOWNLOADER_MIDDLEWAERS进行设置,并且,如果要关闭DOWNLOADER_MIDDLEWAERS_BASE中的中间件,也要在DOWNLOADER_MIDDLEWAERS中进行设置,把对应中间件的优先级设置为None即可
设置setting.py
- 默认的设置在:scrapy.setting 下的 default_setting.py文件中
- 每个Spider可以通过类属性custom_settings中设置自己特有的配置项