• PythonScrapy


    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中设置自己特有的配置项
  • 相关阅读:
    用grunt搭建自动化的web前端开发环境-完整教程
    SQL Server:触发器详解
    利用junit对springMVC的Controller进行测试
    jquery-barcode:js实现的条码打印
    16个良好的 Bootstrap Angularjs 管理后台主题
    Spring Security 4 Hello World Annotation+XML
    intellij 13新建javaweb项目并用tomcat 7启动
    JavaScript类和继承:constructor属性
    javascript 的面相对象
    javascript call apply bind caller callee 的用法
  • 原文地址:https://www.cnblogs.com/yarightok/p/15885689.html
Copyright © 2020-2023  润新知