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放到调用队列等待调用
  • 在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中设置自己特有的配置项
posted @ 2022-02-12 11:04  liDB  阅读(63)  评论(0编辑  收藏  举报