開源精選 – 一個(gè)高效的Python爬蟲框架Scrapy(開源python爬蟲軟件)
開源精選 | 一個(gè)高效的Python爬蟲框架Scrapy(開源python爬蟲軟件)
《開源精選》是我們分享Github、Gitee等開源社區(qū)中優(yōu)質(zhì)項(xiàng)目的欄目,包括技術(shù)、學(xué)習(xí)、實(shí)用與各種有趣的內(nèi)容。本期推薦的 scrapy是一個(gè)快速的高級(jí)網(wǎng)頁抓取和網(wǎng)頁抓取框架,用于抓取網(wǎng)站并從其頁面中提取結(jié)構(gòu)化數(shù)據(jù)。它可用于廣泛的用途,從數(shù)據(jù)挖掘到監(jiān)控和自動(dòng)化測試。
框架示例
Scrapy 是一個(gè)用于抓取網(wǎng)站和提取結(jié)構(gòu)化數(shù)據(jù)的應(yīng)用程序框架,可用于各種有用的應(yīng)用程序,如數(shù)據(jù)挖掘、信息處理或歷史存檔。
下面是一個(gè)爬蟲的代碼,它從網(wǎng)站http://quotes.toscrape.com 中抓取名言 ,遵循分頁:
import scrapyclass QuotesSpider(scrapy.Spider): name = 'quotes' start_urls = [ 'http://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)
將其放入一個(gè)文本文件中,將其命名為類似名稱 quotes_spider.py 并使用以下 runspider 命令運(yùn)行:
scrapy runspider quotes_spider.py -o quotes.jl
完成后,您將在 quotes.jl 文件中獲得 JSON 行格式的引號(hào)列表,其中包含文本和作者,如下所示:
{"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"}...
蜘蛛中間件
Spider 中間件是 Scrapy 蜘蛛處理機(jī)制的鉤子框架,可以在其中插入自定義功能來處理發(fā)送給Spider進(jìn)行處理的響應(yīng)以及處理從蜘蛛生成的請(qǐng)求和項(xiàng)目。
架構(gòu)概覽
數(shù)據(jù)流:
執(zhí)行流程:
- 該引擎獲取從最初請(qǐng)求爬行蜘蛛。
- 該引擎安排在請(qǐng)求調(diào)度程序和要求下一個(gè)請(qǐng)求爬行。
- 該計(jì)劃返回下一請(qǐng)求的引擎。
- 該引擎發(fā)送請(qǐng)求到 下載器,通過下載器中間件。
- 頁面完成下載后,下載器生成一個(gè)響應(yīng)(帶有該頁面)并將其發(fā)送到引擎,通過下載器中間件。
- 該引擎接收來自響應(yīng)下載器并將其發(fā)送到所述 蜘蛛進(jìn)行處理,通過蜘蛛中間件。
- 該蜘蛛處理響應(yīng)并返回旗下的項(xiàng)目和新的要求(跟隨)的引擎,通過蜘蛛中間件。
- 該引擎發(fā)送處理的項(xiàng)目,以項(xiàng)目管道,然后把處理的請(qǐng)求的調(diào)度,并要求今后可能請(qǐng)求爬行。
- 該過程重復(fù)(從第 1 步開始),直到不再有來自Scheduler 的請(qǐng)求 。
安裝指南
Scrapy 需要 Python 3.6 ,CPython 實(shí)現(xiàn)(默認(rèn))或 PyPy 7.2.0 實(shí)現(xiàn)。
安裝 Scrapy
如果您使用的是Anaconda或Miniconda,則可以從conda– forge頻道安裝該軟件包,該頻道具有適用于 Linux、Windows 和 macOS 的最新軟件包。
要使用 安裝 Scrapy conda,請(qǐng)運(yùn)行:
conda install -c conda-forge scrapy
或者,如果您已經(jīng)熟悉 Python 包的安裝,則可以使用以下命令從 PyPI 安裝 Scrapy 及其依賴項(xiàng):
pip install Scrapy
注意:Scrapy 是用純 Python 編寫的,并且依賴于一些關(guān)鍵的 Python 包
- lxml,一個(gè)高效的 XML 和 HTML 解析器
- parsel,一個(gè)寫在 lxml 之上的 HTML/XML 數(shù)據(jù)提取庫,
- w3lib,用于處理 URL 和網(wǎng)頁編碼的多用途助手
- 扭曲,一個(gè)異步網(wǎng)絡(luò)框架
- 密碼學(xué)和pyOpenSSL,處理各種網(wǎng)絡(luò)級(jí)安全需求
核心API
爬蟲API
Scrapy API 的主要入口點(diǎn)是Crawler 對(duì)象,通過from_crawler類方法傳遞給擴(kuò)展。該對(duì)象提供對(duì)所有 Scrapy 核心組件的訪問,它是擴(kuò)展訪問它們并將其功能掛鉤到 Scrapy 的唯一方法。
設(shè)置 API
設(shè)置 Scrapy 中使用的默認(rèn)設(shè)置優(yōu)先級(jí)的鍵名和優(yōu)先級(jí)的字典。
每個(gè)項(xiàng)目都定義了一個(gè)設(shè)置入口點(diǎn),為其提供了一個(gè)用于標(biāo)識(shí)的代碼名稱和一個(gè)整數(shù)優(yōu)先級(jí)。在Settings類中設(shè)置和檢索值時(shí),較大的優(yōu)先級(jí)比較小的優(yōu)222222先級(jí)更高 。
蜘蛛加載器API
這個(gè)類負(fù)責(zé)檢索和處理跨項(xiàng)目定義的蜘蛛類。
可以通過在SPIDER_LOADER_CLASS項(xiàng)目設(shè)置中指定它們的路徑來使用自定義蜘蛛加載器 。他們必須完全實(shí)現(xiàn)scrapy.interfaces.ISpiderLoader接口以保證無錯(cuò)執(zhí)行。
信號(hào) API
將接收器的功能連接到信號(hào)。
信號(hào)可以是任何對(duì)象,盡管 Scrapy 帶有一些預(yù)定義的信號(hào),這些信號(hào)記錄在信號(hào) 部分。
統(tǒng)計(jì)收集器 API
scrapy.statscollectors模塊下有幾個(gè)可用的統(tǒng)計(jì)收集器 ,它們都實(shí)現(xiàn)了StatsCollector 類定義的統(tǒng)計(jì)收集器 API (它們都繼承自)。
更多參考:https://github.com/scrapy/scrapy