Scrapy 概览¶
Scrapy (/ˈskreɪpaɪ/) 是一个用于抓取网站并提取结构化数据的应用程序框架,这些数据可用于各种有用的应用程序,例如数据挖掘、信息处理或历史存档。
尽管 Scrapy 最初是为 网页抓取 设计的,但它也可以用于使用 API(例如 亚马逊联盟网络服务)提取数据,或用作通用的网络爬虫。
示例 Spider 演示¶
为了向您展示 Scrapy 提供的功能,我们将引导您完成一个 Scrapy Spider 的示例,使用最简单的方法来运行 Spider。
这是一个 Spider 的代码,它从网站 https://quotes.toscrape.com 抓取名人名言,并遵循分页。
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
"https://quotes.toscrape.com/tag/humor/",
]
def parse(self, response):
for quote in response.css("div.quote"):
yield {
"author": quote.xpath("span/small/text()").get(),
"text": quote.css("span.text::text").get(),
}
next_page = response.css('li.next a::attr("href")').get()
if next_page is not None:
yield response.follow(next_page, self.parse)
将其放入文本文件中,命名为 quotes_spider.py
等,然后使用 runspider
命令运行 Spider。
scrapy runspider quotes_spider.py -o quotes.jsonl
完成后,您将在 quotes.jsonl
文件中获得一个以 JSON Lines 格式存储的名言列表,包含文本和作者,如下所示:
{"author": "Jane Austen", "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"}
{"author": "Steve Martin", "text": "\u201cA day without sunshine is like, you know, night.\u201d"}
{"author": "Garrison Keillor", "text": "\u201cAnyone who thinks sitting in church can make you a Christian must also think that sitting in a garage can make you a car.\u201d"}
...
发生了什么?¶
当您运行命令 scrapy runspider quotes_spider.py
时,Scrapy 在其中查找 Spider 定义,并通过其爬虫引擎运行它。
爬取从向 start_urls
属性中定义的 URL 发出请求开始(在本例中,仅为 humor 类别中的名言的 URL),并调用默认的回调方法 parse
,并将响应对象作为参数传递。在 parse
回调中,我们使用 CSS 选择器循环遍历名言元素,生成一个包含提取的名言文本和作者的 Python 字典,查找指向下一页的链接,并使用相同的 parse
方法作为回调安排另一个请求。
在这里,您将注意到 Scrapy 的主要优势之一:请求是 异步调度和处理 的。这意味着 Scrapy 不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作。这也意味着,即使某个请求失败或在处理过程中发生错误,其他请求也可以继续进行。
虽然这使您可以进行非常快速的爬取(以容错的方式同时发送多个并发请求),但 Scrapy 还允许您通过 一些设置 控制爬取的礼貌性。您可以执行以下操作,例如设置每个请求之间的下载延迟,限制每个域或每个 IP 的并发请求数量,甚至 使用自动限流扩展 自动确定这些设置。
注意
这使用了 Feed 导出 来生成 JSON 文件,您可以轻松更改导出格式(例如 XML 或 CSV)或存储后端(例如 FTP 或 Amazon S3)。您还可以编写一个 Item Pipeline 将 Item 存储到数据库中。
其他功能?¶
您已经了解了如何使用 Scrapy 从网站提取和存储 Item,但这仅仅是表面。Scrapy 提供了许多强大的功能,使抓取变得简单高效,例如:
内置支持使用扩展的 CSS 选择器和 XPath 表达式从 HTML/XML 源 选择和提取 数据,并提供使用正则表达式进行提取的辅助方法。
一个 交互式 Shell 控制台(支持 IPython),用于尝试用于抓取数据的 CSS 和 XPath 表达式,这在编写或调试 Spider 时非常有用。
内置支持以多种格式(JSON、CSV、XML) 生成 Feed 导出 并将其存储在多个后端(FTP、S3、本地文件系统)中。
强大的编码支持和自动检测,用于处理外国、非标准和损坏的编码声明。
广泛的内置扩展和中间件,用于处理:
Cookie 和会话处理
HTTP 功能,如压缩、身份验证、缓存
用户代理伪装
robots.txt
爬取深度限制
等等
一个 Telnet 控制台,用于连接到 Scrapy 进程中运行的 Python 控制台,以检查和调试您的爬虫。
此外,还有其他功能,例如可重用的 Spider 用于从 站点地图 和 XML/CSV Feed 抓取站点,用于 自动下载图像(或任何其他媒体)与抓取的 Item 关联的媒体管道,缓存 DNS 解析器等等!
下一步?¶
接下来,您需要 安装 Scrapy,完成教程 以了解如何创建一个完整的 Scrapy 项目,并 加入社区。感谢您的关注!