Scrapy 一瞥
Scrapy (/ˈskreɪpaɪ/) 是一个用于抓取网站并提取结构化数据的应用框架,可用于数据挖掘、信息处理或历史存档等各种有用的应用。
尽管 Scrapy 最初是为网络爬取设计的,但它也可以用于通过 API(例如 Amazon Associates Web Services)提取数据,或者作为通用网络爬虫使用。
示例爬虫演示
为了向您展示 Scrapy 的功能,我们将通过运行爬虫的最简单方式,带您了解一个 Scrapy 爬虫示例。
以下是一个爬虫的代码,它抓取网站 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 命令运行该爬虫
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 会在其中寻找爬虫定义,并将其通过其爬虫引擎运行。
爬取过程始于对 start_urls 属性中定义的 URL(在本例中,仅为 humor 类别下的名言 URL)发起请求,并调用默认的回调方法 parse,将响应对象作为参数传递。在 parse 回调中,我们使用 CSS 选择器循环遍历名言元素,通过 yield 返回一个包含提取的名言文本和作者的 Python 字典,寻找下一页的链接,并安排另一个使用相同 parse 方法作为回调的请求。
在这里,您会注意到 Scrapy 的主要优势之一:请求是异步调度和处理的。这意味着 Scrapy 不需要等待一个请求完成并被处理,它可以在此期间发送另一个请求或做其他事情。这也意味着即使某个请求失败或在处理时发生错误,其他请求也可以继续进行。
虽然这使您能够进行非常快速的爬取(以容错的方式同时发送多个并发请求),但 Scrapy 还允许您通过一些设置来控制爬取的“礼貌程度”。您可以执行诸如设置每个请求之间的下载延迟、限制每个域名或每个 IP 的并发请求量,甚至使用自动节流扩展来尝试自动计算这些设置。
注意
这是通过使用 Feed 导出来生成 JSON 文件的,您可以轻松更改导出格式(例如 XML 或 CSV)或存储后端(例如 FTP 或 Amazon S3)。您还可以编写 Item Pipeline 将项目存储在数据库中。
还有什么?
您已经看到了如何使用 Scrapy 从网站提取并存储项目,但这只是冰山一角。Scrapy 提供了许多强大的功能,使爬取变得简单高效,例如
内置支持使用扩展的 CSS 选择器和 XPath 表达式从 HTML/XML 源中选择和提取数据,并提供使用正则表达式进行提取的辅助方法。
一个交互式 Shell 控制台(支持 IPython),用于尝试抓取数据的 CSS 和 XPath 表达式,这在编写或调试爬虫时非常有用。
内置支持以多种格式(JSON、CSV、XML)生成 Feed 导出,并将它们存储在多个后端(FTP、S3、本地文件系统)
强大的编码支持和自动检测,用于处理外国、非标准和损坏的编码声明。
广泛的内置扩展和中间件,用于处理
Cookie 和会话处理
HTTP 功能,如压缩、身份验证、缓存
User-Agent 伪装
robots.txt
爬取深度限制
以及更多
一个 Telnet 控制台,用于接入运行在 Scrapy 进程内部的 Python 控制台,以进行内省和调试您的爬虫
以及其他好东西,如通过 Sitemaps 和 XML/CSV feed 爬取网站的可重用爬虫,一个用于自动下载与抓取项相关的图像(或任何其他媒体)的媒体管道,一个缓存 DNS 解析器,以及更多!