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自己编码写文件
Extention 扩展
- 自定义扩展类
- 定义处理方法
- 定义from_crawler类方法,利用第二个参数crawler的signals对象将Scrapy的各个信号和已经定义的处理方法关联起来
- 在settings.py文件中配置
EXTENTIONS = { '扩展类的全路径': 优先级 }
规则化爬虫CrawlSpider
- 根据规则自动生成Request
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时,会调用此方法,一般用来进行收尾操作,比如释放资源
CrawlSpider
- rules: Rule集合,根据此字段自动抓取页面
Rule
- 构造参数
- link_extractor: LinkExtractor,从爬取页面提取新链接的规则
- callback: 回调方法,用来处理link_extractor提取的请求的返回信息
- cb_kwargs: 字典类型,可用来传递参数给回调方法
- follow: 布尔值,它指定根据该规则从response提取的链接是否需要跟进爬取
- process_links: 用来处理link_extractor提取到的链接,比如过滤
- process_request: 用来处理link_extractor提起到链接新生成的Request
- Errback: 当提取的Request在被处理的过程发生错误时,此参数指定的方法会被调用
LinkExtractor
- 构造参数
- allow:
- deny:
- allow_domains:
- deny_domains:
- deny_extensions: 提取的链接包含此参数指定的后缀,这些链接将被忽略
- restrict_xpaths:
- restrict_css:
- tags: 指定从哪些节点提取链接,默认是('a', 'area')
- attrs: 指定从哪些熟悉提取链接,默认是('href',)
- canonicalize:
- unique:
- process_value:
- strip:
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()
ItemLoader
- add_xpath/add_css/add_value--->数据--->Input Processor--->存入Item Loader--->load_item()--->Output Processor--->Item
- 构造参数
- item:
- selector:
- response:
- 方法
- add_xpath('item成员变量', 'xpath'): 根据xpath获取值并分配给item的成员变量
- add_css('item成员变量', 'css选择器'):
- add_value('item成员变量', '具体的值'):
- load_item: 根据上面分配给item的值生成最终的item实列
- 自定义ItemLoader
- 继承ItemLoader
- 给字段定义Input Processor(输入处理器)和Output Processor(输出处理器)
- 字段名_in = xxx: 设置字段的输入处理器
- 字段名_out = xxx: 设置字段的输出处理器
- default_output_processor = xxx: 设置默认的输出处理器
- Scrapy内置的Processor:scrapy.loader.processors
- Identity: 不进行任何处理
- TakeFirst: 返回列表的第一个非空值,类似extract_first
- Join: 相当于字符串的join方法
- Compose: 组合做个函数,输入值会被传入第一个函数,然后输出值再被传入下一个函数,以此类推,直到最后一个函数被调用
- MapCompose: 与Compose类似,但是可以迭代处理一个列表输入值,即输入的列表中的每一项都按Compose的方式走一遍,最后生成新的列表
- SelectJmes: 可以查询Json,需要安装jmespath库
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
ImagesPipeline
- 内置的图片下载并保存pipeline
- 需要在settings.py文件中设置IMAGE_STORE变量,配置图片下载后保存的目录
- ImagesPipeline默认读取item的image_urls字段,变量此字段生成下载图片的Request
- 如果自定义的item,图片字段不是image_urls,需要自定义pipeline
- 自定义pipeline,继承ImagesPipeline,实现如下方法:
- get_media_requests: 生成需要下载图片的Request
- file_path: 返回下载图片保存的图片路径,包括文件名
- item_completed: 单个item完成下载时的处理方法
自定义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中设置自己特有的配置项