• Scrapy 爬虫框架学习笔记(未完,持续更新)


    Scrapy 爬虫框架

    Scrapy 是一个用 Python 写的 Crawler Framework 。它使用 Twisted 这个异步网络库来处理网络通信。

    Scrapy 框架的主要架构

    根据它官网上的设计架构图,一个完整的 Spider 主要分成 7 个部分:Scrapy EngineSchedulerDownloaderSpiderItem PipelineDownloader middlewaresSpider middlewares

    Scrapy 引擎( Engine ):负责控制数据流在系统种所有组件中流动,并在相应动作时触发事件。

    调度器( Scheduler ) :调度器从引擎中接收 Request 并将它们入队,以便之后引擎请求 Request 时提供给引擎。

    下载器( Downloader ):下载器负责获取页面数据并提供给引擎。

    Spider :是 Scrapy 用户用于分析 Response 并提取 Item 或者额外跟进 URL 的类。每个 Spider 负责处理特定(或一些)网站。

    Item Pipeline :负责处理被 Spider 提取出来的 Item 。例如数据持久化。

    Downloader middlewares 下载中间件:是引擎与下载器之间特定的钩子,处理 Downloader 传递给引擎的 Response 。

    Spider 中间件( Spider middlewares ):是引擎和 Spider 之间的特定钩子,处理 Spider 的输入( Response )和输出( Items 和 Response )。

    这些模块的之间的数据流向可以清楚地反应 Scrapy 的工作流程,具体如下:

    1. 引擎打开一个网站,找到处理该网站的 Spider 并向该 Spider 请求第一个要爬取的 URL 。
    2. 引擎从 Spider 中获取第一个要爬取的 URL 并通过调度器以 Request 进行调度。
    3. 引擎向调度器请求下一个要爬取的 URL 。
    4. 调度器返回下一个要爬取的 URL 给引擎,引擎将 URL 通过下载中间件转发给下载器。
    5. 一旦页面下载完成,下载器生成一个该页面的 Response ,并将器通过下载中间件发送给引擎。
    6. 引擎从下载器中接收到 Response 并通过 Spider 中间件发送给 Spider 处理。
    7. Spider 处理 Response 并返回爬取到的 Item 及新的 Request 给引擎。
    8. 引擎将爬取到的 Item 给 Item Pipeline ,将 Request 给调度器。
    9. 重复直到调度器中没有更多的 Request ,引擎关闭该网站。

    这和之前学习的普通的爬虫思路架构是很像的。

    安装 Scrapy 框架

    我用的 WSL2 ,直接安装即可。

    pip install scrapy
    

    Scrapy, Hello World!

    创建一个新的文件夹做项目的根路径。然后运行命令创建项目:

    scrapy startproject cnblogsSpider
    

    然后他就会生成如下的项目目录。

    .
    └── cnblogSpider
        ├── cnblogSpider => 该项目的 python 模块
        │   ├── __init__.py
        │   ├── items.py => Item 文件
        │   ├── middlewares.py => 中间件
        │   ├── pipelines.py => Pipeline 文件
        │   ├── settings.py => 配置文件
        │   └── spiders => 放置 Spider 文件的文件夹
        │       └── __init__.py
        └── scrapy.cfg => 项目部署文件
    

    在 Spiders 文件夹下创建一个文件 cnblogs_spider.py 然后编写如下代码:

    import scrapy
    
    
    class CnblogsSpider(scrapy.Spider):
    
        # * 爬虫的名字,必须唯一
        name = "cnblogs"
        allowed_domains = ["cnblogs.com"]
        
        # * 爬取入口 URL 列表,将会首先爬取这里面的 URL 
        start_urls = [
            "http://www.cnblogs.com/qiyeboy/default.html?page=1"
        ]
    
        # * 用来解析返回的 Response 数据的方法
        # * 每个 URL 相应后的 Response 都会传递给这个方法
        # * 进行提取 item 以及 URL Request 对象
        def parse(self, response):
            pass
    
    

    在 cnBlogsSpider 文件夹下执行:

    scrapy crawl cnblogs
    

    第一个爬虫就成功完成了。

    Scrapy 命令行工具

    scrapy shell 分为两种类型的命令,一种是必须在 Scrapy 项目下运行的,一种是全局命令。

    startproject 命令:

    语法scrapy startproject myproject

    功能就是创建项目。

    settings 命令:

    语法scrapy settings [options]

    在项目运行时,运行这个命令将会输出项目的设定值,否则就输出 Scrapy 的默认设定。

    scrapy settings --get BOT_NAME
    # cnblogSpider
    scrapy settings --get DOWNLOAD_DELAY
    # 0
    

    runspider 命令:

    语法scrapy runspider <spider_file.py>

    在没有创建项目的情况下,运行一个编写好的 Spider 模块。

    shell 命令:

    语法scrapy shell [url]

    用于启动 Scrapy shell , URL 可选。

    scrapy shell "http://www.cnblogs.com/qiyeboy/default.html?page=1"
    

    fetch 命令:

    语法scrapy fetch <url>

    使用 Scrapy 下载器下载给定的 URL ,并将内容送到终端。

    如果是在项目内运行,会用项目内下载器的配置,如果不是就会用默认的 Scrapy Downloader 配置。

    scrapy fetch --nolog "http://www.cnblogs.com/qiyeboy/default.html?page=1"
    scrapy fetch --nolog --headers "http://www.cnblogs.com/qiyeboy/default.html?page=1"
    

    view 命令:

    语法scrapy view <url>

    在浏览器中打开给定的 URL ,并以 Scrapy spider 获取到的形式展现。

    scrapy view "http://www.cnblogs.com/qiyeboy/default.html?page=1"
    

    bench 命令:

    语法scrapy bench

    测试 Scrapy 在硬件上的效率。

    Spider 模块

    Spider 模块最重要的一个功能就是从 Downloader 中处理好的 Response 数据提取出想要的 Item 或者是新的 URL 。 Scrapy 框架提供了 Selector 来帮助我们提取数据。

    在不使用框架的时候,我们使用的是 BeautifulSoup 或者是 XPath 完成网页数据的提取。而在 Scrapy 的框架下,内置了这些数据提取的工具,让我们可以直接使用内置的选择器来完成数据的提取。

    Selector 的用法

    四个基本用法

    xpath(query) :传入 XPath 表达式,返回表达式对应的所有节点的 selector list 列表。

    css(query) :传入 CSS 表达式,返回表达式对应的所有节点的 selector list 列表。

    extract() :序列化节点为 Unicode 字符串。

    re(regex) :根据传入的正则表达式对数据进行提取

    这个是 Scrapy 里面的 Selector 最常用的 4 个方法。在 Spider 文件里的 parse(self, response) 方法里,只要将传入的 Response 传入 Selector 里,就能构建一个 Selector 。

    selector = Selector(response)
    

    由于 XPath 和 CSS 查询非常普遍, Scrapy 在 Request 里内置了两个可以直接调用的方法: xpath(query) -> SelectorList ,和 css(query) -> SeletorList 。它们返回的都是选择器列表。于是我们可以使用这种简写方式跳过构造 Selector 。

    我们尝试从 HTML 页面上提取信息,改写一下 parse(response) 方法:

    def parse(self, response):
        papers = response.xpath(".//*[@class='day']")
        for paper in papers:
            url = paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]
            title = paper.xpath(".//*[@class='postTitle']/a/span/text()").extract()[0]
            time = paper.xpath(".//*[@class='dayTitle']/a/text()").extract()[0]
            content = paper.xpath(".//*[@class='postCon']/div/text()").extract()[0]
            print(url, title, time, content)
    

    运行 scrapy crawl cnblogs 然后就可以发现成功获取了数据:

    Selector 提取数据

  • 相关阅读:
    开源高性能网络库Libevent的简介
    网络IO之阻塞、非阻塞、同步、异步总结【转】
    C语言20150620
    EF那点事
    SSO单点登录的实现原理是怎样的
    SQL索引器
    基础数学知识
    hibernate优化笔记(随时更新)
    JAVA中保留小数的多种方法
    Hibernate的session缓存和对象的四种状态
  • 原文地址:https://www.cnblogs.com/hyong-bingbing/p/14828345.html
Copyright © 2020-2023  润新知