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

常見問題(FAQ)

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

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

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

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

Scrapy 支持那些 Python 版本?

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

Scrapy 支持 Python 3 么?

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

參見

Scrapy 支持那些 Python 版本?。

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

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

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

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

Scrapy 支持 HTTP 代理么?

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

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

參考 Passing additional data to callback functions。

Scrapy 退出,ImportError: Nomodule named win32api

這是個 Twisted bug,您需要安裝 pywin32

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

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

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

默認情況下,Scrapy 使用 LIFO 隊列來存儲等待的請求。簡單的說,就是深度優(yōu)先順序。深度優(yōu)先對大多數(shù)情況下是更方便的。如果您想以 廣度優(yōu)先順序 進行爬取,你可以設(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)存消耗?

參考上一個問題。

我能在 spider 中使用基本 HTTP 認證么?

可以。參考 HttpAuthMiddleware.

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

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

我能在哪里找到 Scrapy 項目的例子?

參考例子。

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

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

scrapy runspider my_spider.py

詳情請參考 runspider 命令。

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

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

這些消息由 Offsite Spider 中間件(Middleware)所拋出。 該(默認啟用的)中間件篩選出了不屬于當前 spider 的站點請求。

更多詳情請參見:OffsiteMiddleware

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

參見 Scrapyd。

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

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

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

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

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

class MySpider(CrawlSpider):

    name = 'myspider'

    download_delay = 2

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

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

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

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

更多詳情請參考 在 spider 中啟動 shell 來查看 response。

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

dump 到 JSON 文件:

scrapy crawl myspider -o items.json

dump 到 CSV 文件:

scrapy crawl myspider -o items.csv

dump 到 XML 文件:

scrapy crawl myspider -o items.xml

更多詳情請參考 Feed exports

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

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

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

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

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

Scrapy 自動管理 cookies 么?

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

更多詳情請參考 Requests and ResponsesCookiesMiddleware。

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

啟用 COOKIES_DEBUG 選項。

要怎么停止爬蟲呢?

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

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

參考避免被禁止(ban)。

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

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

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

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

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