0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)

时间:2021-11-01 20:44:31

0.0、Scrapy基础

Python2:适合爬取非中文

Python3:适合爬取中文

Scrapy是一种快速的高级Web爬行和Web抓取框架,用于抓取网站并从其页面中提取结构化数据。它可用于各种用途,从数据挖掘到监控和自动化测试。

0.1、Scrapy 框架图

0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)

0.2、Scrapy主要包括了以下组件:

  • 引擎(Scrapy): 用来处理整个系统的数据流处理, 触发事务(框架核心)
  • 调度器(Scheduler): 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • 下载器(Downloader): 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
  • 爬虫(Spiders): 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
  • 项目管道(Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  • 下载器中间件(Downloader Middlewares): 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  • 爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
  • 调度中间件(Scheduler Middewares): 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

0.3、Scrapy简单示例如下:

我们将以最简单的方式运行蜘蛛,它在将访问并获取 http://quotes.toscrape.com上的名言(文本)、作者 :

import scrapy

class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = [
        'http://quotes.toscrape.com/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('small.author::text').get(),
            }

        next_page = response.css('li.next a::attr("href")').get()

        if next_page:
            yield response.follow(response.urljoin(next_page), self.parse)

将以上代码放在一个文本文件中,将其命名为quotes_spider.py ,并使用 以下命令运行蜘蛛:

scrapy runspider quotes_spider.py -o quotes.json

运行上述命令后,代码将在命令运行的目录下创建一个名为quotes.json的文件,该文件包含JSON格式的列表,其中包含文本和作者,如下所示(为了更好的可读性,此处重新格式化):

[
  {
    "text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d",
    "author": "Albert Einstein"
  },
  {
    "text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d",
    "author": "J.K. Rowling"
  },
  {
    "text": "\u201cThere are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.\u201d",
    "author": "Albert Einstein"
  },
  ...省略97条...
 ]

0.4、Scrapy运行流程如下:

当我们运行“scrapy runspider quotes_spider.py”命令时,Scrapy会查找Spider的定义并通过其爬虫引擎运行它;

通过向start_urls 属性中定义的URL发出请求(在上述示例中即:start_urls = ['http://quotes.toscrape.com/'])开始爬行,并调用默认回调方法parse,将响应对象作为参数进行传递;

在parse回调方法中,我们使用CSS Selector循环遍历quote元素,并将提取的名言文本和作者生成Python dict,除此之外我们还查找指向下一页的链接,将获得的下一页链接再次以同样的方式进行请求处理;

在这里,我们可以看到Scrapy的一个主要优点:请求是 异步调度与处理的。

这意味着Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作。

这也意味着即使某些请求失败或在处理错误时发生错误,其他请求也可以继续运行。

虽然这使得我们能够进行非常快速的爬网(以容错的方式同时发送多个并发请求),但Scrapy还可以通过一些设置让我们的蜘蛛以更加绅士的方式去爬网。

我们可以执行以下操作:在每个请求之间设置下载延迟,限制每个域或每个IP的并发请求数量,甚至使用自动限制扩展,以尝试自动解决这些问题。

注意:我们在这里使用的是Feed导出生成JSON文件,除此之外我们还可以轻松更改导出格式(例如XML或CSV),存储于后端服务(例如FTP或Amazon S3),还可以编写 item pipeline 用以将 items 存储在数据库中。

运行流程小结:

  1. 首先,引擎从调度器中取出一个链接(URL)用于接下来的抓取;
  2. 引擎把URL封装成一个请求(Request)传给下载器,下载器把资源下载下来,并封装成应答包(Response);
  3. 然后,爬虫解析Response;
  4. 若是解析出实体(Item),则交给实体管道进行进一步的处理;
  5. 若是解析出的是链接(URL),则把URL交给Scheduler等待抓取。

0.5、还有什么?

通过上述实践,我们已经了解了如何使用Scrapy从网站中提取和存储项目,但这只是表面。

Scrapy提供了许多强大的功能,可以帮助我们轻松高效地进行抓取,例如:

  1. 内置支持使用扩展的CSS选择器和XPath表达式,让我们可以高效地从HTML / XML源代码中选择和提取数据,并使用正则表达式提取辅助方法;

  2. 提供交互式Shell控制台(支持IPython),用于尝试使用CSS和XPath表达式来抓取数据,在编写或调试蜘蛛时非常有用;

  3. 内置支持以多种格式(JSON,CSV,XML)生成Feed导出并将其存储在多个后端服务(FTP、S3、数据库、本地文件系统)中;

  4. 强大的编码支持和自动检测,用于处理外部,非标准和损坏的编码声明;

  5. 强大的可扩展性支持,允许使用Signals(信号)和定义良好的API(中间件,扩展和 管道)插入自己的自定义功能;

  6. 诸多的内置扩展和中间件用于处理:

    1. Cookie和会话处理
    2. HTTP功能,如压缩,身份验证,缓存
    3. User-Agent 代理请求
    4. robots.txt
    5. 爬行深度限制...
  7. 一个Telnet控制台,用于连接到Scrapy进程内运行的Python控制台,用以调试爬虫;

  8. 还有其他好东西,比如可重复使用的蜘蛛,可以从Sitemaps(站点地图:网站管理员向搜索引擎通知可用于爬行的网站页面的一种简单方法。)和XML / CSV Feed中抓取网站,自动下载与抓取项目相关联的图像(或任何其他媒体)的媒体管道,缓存DNS解析器等等!

0.6、下一步是什么?

接下来的步骤是安装Scrapy, 按照教程学习如何创建一个完整的Scrapy项目。感谢加入社区,谢谢大家的关注!

原文链接:

0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)

OpsRoad(运维之路社区)

(完)