鍍金池/ 教程/ Python/ 常見問題(FAQ)
Benchmarking
命令行工具(Command line tools)
下載器中間件(Downloader Middleware)
信號(hào)(Signals)
Telnet 終端(Telnet Console)
初窺 Scrapy
數(shù)據(jù)收集(Stats Collection)
Scrapyd
通用爬蟲(Broad Crawls)
Item Loaders
試驗(yàn)階段特性
Scrapy 入門教程
自動(dòng)限速(AutoThrottle)擴(kuò)展
Settings
Scrapy 終端(Scrapy shell)
下載項(xiàng)目圖片
DjangoItem
調(diào)試(Debugging)Spiders
選擇器(Selectors)
Feed exports
Spiders Contracts
借助 Firefox 來爬取
Logging
Spiders
Ubuntu 軟件包
實(shí)踐經(jīng)驗(yàn)(Common Practices)
安裝指南
Item Exporters
擴(kuò)展(Extensions)
Items
Spider 中間件(Middleware)
異常(Exceptions)
例子
發(fā)送 email
架構(gòu)概覽
常見問題(FAQ)
Jobs:暫停,恢復(fù)爬蟲
核心 API
使用 Firebug 進(jìn)行爬取
Item Pipeline
Link Extractors
Web Service
調(diào)試內(nèi)存溢出

常見問題(FAQ)

Scrapy 相 BeautifulSoup 或 lxml 比較,如何呢?

BeautifulSouplxml 是 HTML 和 XML 的分析庫。Scrapy 則是 編寫爬蟲,爬取網(wǎng)頁并獲取數(shù)據(jù)的應(yīng)用框架(application framework)。

Scrapy 提供了內(nèi)置的機(jī)制來提取數(shù)據(jù)(叫做 選擇器(selectors))。 但如果您覺得使用更為方便,也可以使用 BeautifulSoup(或 lxml)。 總之,它們僅僅是分析庫,可以在任何 Python 代碼中被導(dǎo)入及使用。

換句話說,拿 Scrapy 與 BeautifulSoup (或 lxml) 比較就好像是拿 jinja2Django 相比。

Scrapy 支持那些 Python 版本?

Scrapy 僅僅支持 Python 2.7。Python2.6 的支持從 Scrapy 0.20 開始被廢棄了。

Scrapy 支持 Python 3 么?

不。但是 Python 3.3+的支持已經(jīng)在計(jì)劃中了?,F(xiàn)在,Scrapy 支持 Python 2.7。

參見

Scrapy 支持那些 Python 版本?。

Scrapy 是否從 Django 中”剽竊”了 X 呢?

也許吧,不過我們不喜歡這個(gè)詞。我們認(rèn)為 Django 是一個(gè)很好的開源項(xiàng)目,同時(shí)也是 一個(gè)很好的參考對(duì)象,所以我們把其作為 Scrapy 的啟發(fā)對(duì)象。

我們堅(jiān)信,如果有些事情已經(jīng)做得很好了,那就沒必要再重復(fù)制造輪子。這個(gè)想法,作為 開源項(xiàng)目及免費(fèi)軟件的基石之一,不僅僅針對(duì)軟件,也包括文檔,過程,政策等等。所以,與其自行解決每個(gè)問題,我們選擇從其他已經(jīng)很好地解決問題的項(xiàng)目中復(fù)制想法(copy idea) ,并把注意力放在真正需要解決的問題上。

如果 Scrapy 能啟發(fā)其他的項(xiàng)目,我們將為此而自豪。歡迎來抄(steal)我們!

Scrapy 支持 HTTP 代理么?

是的。(從 Scrapy 0.8 開始)通過 HTTP 代理下載中間件對(duì) HTTP 代理提供了支持。參考 HttpProxyMiddleware。

如何爬取屬性在不同頁面的 item 呢?

參考 Passing additional data to callback functions。

Scrapy 退出,ImportError: Nomodule named win32api

這是個(gè) Twisted bug,您需要安裝 pywin32

我要如何在 spider 里模擬用戶登錄呢?

參考 使用 FormRequest.from_response()方法模擬用戶登錄。

Scrapy 是以廣度優(yōu)先還是深度優(yōu)先進(jìn)行爬取的呢?

默認(rèn)情況下,Scrapy 使用 LIFO 隊(duì)列來存儲(chǔ)等待的請(qǐng)求。簡(jiǎn)單的說,就是深度優(yōu)先順序。深度優(yōu)先對(duì)大多數(shù)情況下是更方便的。如果您想以 廣度優(yōu)先順序 進(jìn)行爬取,你可以設(shè)置以下的設(shè)定:

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

我的 Scrapy 爬蟲有內(nèi)存泄露,怎么辦?

參考調(diào)試內(nèi)存溢出

另外,Python 自己也有內(nèi)存泄露,在 Leaks without leaks 有所描述。

如何讓 Scrapy 減少內(nèi)存消耗?

參考上一個(gè)問題。

我能在 spider 中使用基本 HTTP 認(rèn)證么?

可以。參考 HttpAuthMiddleware.

為什么 Scrapy 下載了英文的頁面,而不是我的本國語言?

嘗試通過覆蓋 DEFAULT_REQUEST_HEADERS 設(shè)置來修改默認(rèn)的 Accept-Language 請(qǐng)求頭。

我能在哪里找到 Scrapy 項(xiàng)目的例子?

參考例子。

我能在不創(chuàng)建 Scrapy 項(xiàng)目的情況下運(yùn)行一個(gè)爬蟲(spider)么?

是的。您可以使用 runspider 命令。例如,如果您有個(gè) spider 寫在 my_spider.py 文件中,您可以運(yùn)行:

scrapy runspider my_spider.py

詳情請(qǐng)參考 runspider 命令。

我收到了 “Filtered offsite request” 消息。如何修復(fù)?

這些消息(以 DEBUG 所記錄)并不意味著有問題,所以你可以不修復(fù)它們。

這些消息由 Offsite Spider 中間件(Middleware)所拋出。 該(默認(rèn)啟用的)中間件篩選出了不屬于當(dāng)前 spider 的站點(diǎn)請(qǐng)求。

更多詳情請(qǐng)參見:OffsiteMiddleware

發(fā)布 Scrapy 爬蟲到生產(chǎn)環(huán)境的推薦方式?

參見 Scrapyd

我能對(duì)大數(shù)據(jù)(large exports)使用 JSON 么?

這取決于您的輸出有多大。參考 JsonItemExporter 文檔中的這個(gè)警告

我能在信號(hào)處理器(signal handler)中返回(Twisted)引用么? 有些信號(hào)支持從處理器中返回引用,有些不行。參考內(nèi)置信號(hào)參考手冊(cè)(Built-in signals reference)來了解詳情。

reponse 返回的狀態(tài)值 999 代表了什么?

999 是雅虎用來控制請(qǐng)求量所定義的返回值。 試著減慢爬取速度,將 spider 的下載延遲改為 2 或更高:

class MySpider(CrawlSpider):

    name = 'myspider'

    download_delay = 2

    # [ ... rest of the spider code ... ]

或在 DOWNLOAD_DELAY 中設(shè)置項(xiàng)目的全局下載延遲。

我能在 spider 中調(diào)用 pdb.set_trace() 來調(diào)試么?

可以,但你也可以使用 Scrapy 終端。這能讓你快速分析(甚至修改) spider 處理返回的返回(response)。通常來說,比老舊的 pdb.set_trace()有用多了。

更多詳情請(qǐng)參考 在 spider 中啟動(dòng) shell 來查看 response。

將所有爬取到的 item 轉(zhuǎn)存(dump)到 JSON/CSV/XML 文件的最簡(jiǎn)單的方法?

dump 到 JSON 文件:

scrapy crawl myspider -o items.json

dump 到 CSV 文件:

scrapy crawl myspider -o items.csv

dump 到 XML 文件:

scrapy crawl myspider -o items.xml

更多詳情請(qǐng)參考 Feed exports

在某些表單中巨大神秘的__VIEWSTATE 參數(shù)是什么?

__VIEWSTATE 參數(shù)存在于 ASP.NET/VB.NET 建立的站點(diǎn)中。關(guān)于這個(gè)參數(shù)的作用請(qǐng)參考這篇文章。這里有一個(gè)爬取這種站點(diǎn)的樣例爬蟲。

分析大 XML/CSV 數(shù)據(jù)源的最好方法是?

使用 XPath 選擇器來分析大數(shù)據(jù)源可能會(huì)有問題。選擇器需要在內(nèi)存中對(duì)數(shù)據(jù)建立完整的 DOM 樹,這過程速度很慢且消耗大量內(nèi)存。

為了避免一次性讀取整個(gè)數(shù)據(jù)源,您可以使用 scrapy.utils.iterators 中的 xmlitercsviter 方法。 實(shí)際上,這也是 feed spider(參考 Spiders)中的處理方法。

Scrapy 自動(dòng)管理 cookies 么?

是的,Scrapy 接收并保持服務(wù)器返回來的 cookies,在之后的請(qǐng)求會(huì)發(fā)送回去,就像正常的網(wǎng)頁瀏覽器做的那樣。

更多詳情請(qǐng)參考 Requests and ResponsesCookiesMiddleware。

如何才能看到 Scrapy 發(fā)出及接收到的 Cookies 呢?

啟用 COOKIES_DEBUG 選項(xiàng)。

要怎么停止爬蟲呢?

在回調(diào)函數(shù)中 raise CloseSpider 異常。 更多詳情請(qǐng)參見:CloseSpider。

如何避免我的 Scrapy 機(jī)器人(bot)被禁止(ban)呢?

參考避免被禁止(ban)。

我應(yīng)該使用 spider 參數(shù)(arguments)還是設(shè)置(settings)來配置 spider 呢?

spider 參數(shù)設(shè)置(settings)都可以用來配置您的 spider。沒有什么強(qiáng)制的規(guī)則來限定要使用哪個(gè),但設(shè)置(settings)更適合那些一旦設(shè)置就不怎么會(huì)修改的參數(shù),而 spider 參數(shù)則意味著修改更為頻繁,在每次 spider 運(yùn)行都有修改,甚至是 spider 運(yùn)行所必須的元素 (例如,設(shè)置 spider 的起始 url)。

這里以例子來說明這個(gè)問題。假設(shè)您有一個(gè) spider 需要登錄某個(gè)網(wǎng)站來 爬取數(shù)據(jù),并且僅僅想爬取特定網(wǎng)站的特定部分(每次都不一定相同)。 在這個(gè)情況下,認(rèn)證的信息將寫在設(shè)置中,而爬取的特定部分的 url 將是 spider 參數(shù)。

我爬取了一個(gè) XML 文檔但是 XPath 選擇器不返回任何的 item

也許您需要移除命名空間(namespace)。參見移除命名空間。