Scrapy

  步骤
    1.建立工程和 Spider 模版
      scrapy startproject 名称
      cd 名称
      scrapy genspider 爬虫名称 爬取的地址
      进一步修改 spiders/爬虫文件
    2.编写 Spider
      配置 爬虫文件
      修改对返回页面的处理
      修改对新增URL爬取请求的处理
    3.编写 ITEM Pinpelines
      配置 pipelines.py 文件
      定义对爬取项(Seraped Item)的处理类
 
  配置并发连接选项
    settings.py
      CONCURRENT_REQUESTS Downloader 最大并发请求下载数量,默认为32
      CONCURRENT_ITEMS Item Pinpeline 最大并发 ITEM 处理数量,默认100
      CONCURRENT_REQUESTS_PER_DOMAIN 每个目标域名最大的并发请求数量,默认8
      CONCURRENT_REQUESTS_PER_IP 每个目标IP最大并发请求数量,默认0,非0有效
 
  requests vs Scrapy
    相同点
      两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线
      两者可用性都好,文档丰富,入门简单
      两者都没有处理js,提交表单,应对验证码等功能(可扩展)
 
  全局命令
    startproject
      语法: scrapy startproject <project_name>
      这个命令是scrapy最为常用的命令之一,它将会在当前目录下创建一个名为 <project_name>的项目。
 
    settings
      语法: scrapy settings [options]
      该命令将会输出Scrapy默认设定,当然如果你在项目中运行这个命令将会输出项目的设定值。
 
    runspider
      语法: scrapy runspider <spider_file.py>
      在未创建项目的情况下,运行一个编写在Python文件中的spider。
 
    shell
      语法: scrapy shell [url]
      以给定的URL(如果给出)或者空(没有给出URL)启动Scrapy shell。
      例如,scrapy shell http://www.baidu.com将会打开百度URL,
      并且启动交互式命令行,可以用来做一些测试。
 
    fetch
      语法: scrapy fetch <url>
      使用Scrapy下载器(downloader)下载给定的URL,并将获取到的内容送到标准输出。简单的来说,就是打印url的html代码。
 
    view
      语法: scrapy view <url>
      在你的默认浏览器中打开给定的URL,并以Scrapy spider获取到的形式展现。 有些时候spider获取到的页面和普通用户看到的并不相同,一些动态加载的内容是看不到的, 因此该命令可以用来检查spider所获取到的页面。
 
    version
      语法: scrapy version [-v]
      输出Scrapy版本。配合 -v 运行时,该命令同时输出Python, Twisted以及平台的信息。
 
  --项目命令
    crawl
      语法: scrapy crawl <spider_name>
      使用你项目中的spider进行爬取,即启动你的项目。这个命令将会经常用到,我们会在后面的内容中经常使用。
 
    check
      语法: crapy check [-l] <spider>
      运行contract检查,检查你项目中的错误之处。
 
    list
      语法: scrapy list
      列出当前项目中所有可用的spider。每行输出一个spider。
 
    genspider
      语法: scrapy genspider [-t template] <name> <domain>
      在当前项目中创建spider。该方法可以使用提前定义好的模板来生成spider。您也可以自己创建spider的源码文件。
 
    view使用浏览器打开网页
      scrapy view http://www.baidu.com
 
    shell命令, 进入scrpay交互环境
      #进入该url的交互环境
      scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/
      之后便进入交互环境
      我们主要使用这里面的response命令, 例如可以使用
      response.xpath() #括号里直接加xpath路径
 
    runspider命令用于直接运行创建的爬虫, 并不会运行整个项目
      scrapy runspider 爬虫名称
 
  为什么Scrapy 采用命令行创建和运行爬虫?
    命令行(不是图形界面)更容易自动化,合适脚本控制
    本质上, Scrapy 是给程序员用的,功能(而不是界面)更重要
 
  生成的工程目录
    python123demo/ 外层目录
    scrapy.cfg 部署 Scrapy 爬虫的配置文件
    python123demo/ Scrapy 框架的用户自定义 python代码
      __init__.py 初始化脚本
      items.py Items 代码模版(继承类)
      middlewares.py Middlewares 代码模版(继承类)
      pipelines.py Pipelines 代码模版(继承类)
      settings.py Scrapy 爬虫的配置文件
      spiders/ Spiders 代码模版目录(继承类)
        __init__.py 初始文件,无需修改
        __pycache__/ 缓存目录,无需修改
 
 
    parse() 用于处理响应,解析内容形成字典,发现新的URL爬取请求
 
Scrapy 爬虫的数据类型
  Request 类
    class scrapy.http.Request()
      Request 对象表示一个HTTP请求
      由 Spider 生成,由 Downloader 执行
 
    .url Request 对应的请求URL
    .method 对应的请求方法,‘GET’'POST'等
    .headers 字典类型风格的请求头
    .body 请求内容主体,字符串类型
    .meta 用户添加的扩展信息,在 Scrapy 内部,模块间传递信息使用
    .copy() 复制该请求
 
  Response 类
    class scrapy.http.Response()
      Response 对象表示一个HTTP请求
      由 Downloader 生成,由 Spider 执行
 
    .url Response 对应的请求URL
    .status HTTP 状态码,默认200
    .headers Response 对应的头部信息
    .body Response 对应的内容信息,字符串类型
    .flags 一组标记
    .request 产生 Response 类型对应的 Response 对象
    .copy() 复制该请求
 
  Item 类
    class scrapy.item.Request()
    Item 对象表示一个从HTML页面中提取的信息内容
    由 Spider 生成,由 Item Pinpeline 执行
    Item 类似字典类型,可以按照字典类型操作
 
CSS Selector 的基本使用
  <html>.css('a::attr(href)').extract()
 
Scrapy 爬虫框架结构
  Downloader Middleware
    目的:实施 Engine,Scheduler,Downloader 之间进行用户可配置的控制
    功能:修改,丢弃,新增请求或响应
 
  Spider
    解析 Downloader 返回的响应 (Response)
    产生爬取项 (scraped item)
    产生额外的爬取请求 (Request)
 
  Item Pinpelines
    以流水线方式处理 Spider 产生的爬取项
    有一组操作顺序组成,类似流水线,每个操作是一个 Item Pinpeline 类型
    可能操作包括:清理,检验和查重爬取项中的HTML数据,将数据存储到数据库
    需要用户编写配置代码
 
  Spider Middleware
    目的:对请求和爬取项的再处理
    功能:修改,丢弃,新增请求或爬取项
    需要用户编写配置代码
 
yield 关键字
  yield 生成器
    生成器是一个不断产生值的函数
    包含yield语句的函数是一个生成器
    生成器每次产生一个值(yield语句),函数被冻结,被唤醒后在产生一个值
 
  为何要有生成器?
    生成器相比一次列多所有内容的优势
      更节省存储空间
      响应更迅速
      使用更灵活
 
原文地址:https://www.cnblogs.com/mysterious-killer/p/9895514.html