Scrapy常見問題(FAQ)

常見問題(FAQ)

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

BeautifulSoup 及 lxml 是HTML和XML的分析庫。Scrapy則是 編寫爬蟲,爬取網頁並獲取數據的應用框架(application framework)。html

Scrapy提供了內置的機制來提取數據(叫作 選擇器(selectors))。 但若是您以爲使用更爲方便,也可使用 BeautifulSoup (或 lxml)。 總之,它們僅僅是分析庫,能夠在任何Python代碼中被導入及使用。python

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

Scrapy支持那些Python版本?

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

Scrapy支持Python 3麼?

不。可是Python 3.3+的支持已經在計劃中了。 如今,Scrapy支持Python 2.7。web

參見shell

Scrapy支持那些Python版本?.django

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

也許吧,不過咱們不喜歡這個詞。咱們認爲 Django 是一個很好的開源項目,同時也是 一個很好的參考對象,因此咱們把其做爲Scrapy的啓發對象。json

咱們堅信,若是有些事情已經作得很好了,那就不必再重複製造輪子。這個想法,做爲 開源項目及免費軟件的基石之一,不只僅針對軟件,也包括文檔,過程,政策等等。 因此,與其自行解決每一個問題,咱們選擇從其餘已經很好地解決問題的項目中複製想法(copy idea) ,並把注意力放在真正須要解決的問題上。api

若是Scrapy能啓發其餘的項目,咱們將爲此而自豪。歡迎來抄(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是以廣度優先仍是深度優先進行爬取的呢?

默認狀況下,Scrapy使用 LIFO 隊列來存儲等待的請求。簡單的說,就是 深度優先順序 。深度優先對大多數狀況下是更方便的。若是您想以 廣度優先順序 進行爬取,你能夠設置如下的設定:

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

個人Scrapy爬蟲有內存泄露,怎麼辦?

參考 調試內存溢出.

另外,Python本身也有內存泄露,在 Leaks without leaks 有所描述。

如何讓Scrapy減小內存消耗?

參考上一個問題

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

能夠。參考 HttpAuthMiddleware.

爲何Scrapy下載了英文的頁面,而不是個人本國語言?

嘗試經過覆蓋 DEFAULT_REQUEST_HEADERS 設置來修改默認的 Accept-Language 請求頭。

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

參考 例子.

我能在不建立Scrapy項目的狀況下運行一個爬蟲(spider)麼?

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

scrapy runspider my_spider.py

詳情請參考 runspider 命令。

我收到了 「Filtered offsite request」 消息。如何修復?

這些消息(以 DEBUG 所記錄)並不意味着有問題,因此你能夠不修復它們。

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

更多詳情請參見: OffsiteMiddleware.

發佈Scrapy爬蟲到生產環境的推薦方式?

參見 Scrapyd.

我能對大數據(large exports)使用JSON麼?

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

我能在信號處理器(signal handler)中返回(Twisted)引用麼?

有些信號支持從處理器中返回引用,有些不行。參考 內置信號參考手冊(Built-in signals reference)來了解詳情。

reponse返回的狀態值999表明了什麼?

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

class MySpider(CrawlSpider):

    name = 'myspider'

    download_delay = 2

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

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

我能在spider中調用 pdb.set_trace() 來調試麼?

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

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

將全部爬取到的item轉存(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 參數是什麼?

__VIEWSTATE 參數存在於ASP.NET/VB.NET創建的站點中。關於這個參數的做用請參考 這篇文章 。這裏有一個爬取這種站點的 樣例爬蟲 。

分析大XML/CSV數據源的最好方法是?

使用XPath選擇器來分析大數據源可能會有問題。選擇器須要在內存中對數據創建完整的 DOM樹,這過程速度很慢且消耗大量內存。

爲了不一次性讀取整個數據源,您可使用 scrapy.utils.iterators 中的 xmliter 及 csviter 方法。 實際上,這也是feed spider(參考 Spiders)中的處理方法。

Scrapy自動管理cookies麼?

是的,Scrapy接收並保持服務器返回來的cookies,在以後的請求會發送回去,就像正常的網頁瀏覽器作的那樣。

更多詳情請參考 Requests and Responses 及 CookiesMiddleware 。

如何才能看到Scrapy發出及接收到的Scrapy呢?

啓用 COOKIES_DEBUG 選項。

要怎麼中止爬蟲呢?

在回調函數中raise CloseSpider 異常。 更多詳情請參見: CloseSpider 。

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

參考 避免被禁止(ban).

我應該使用spider參數(arguments)仍是設置(settings)來配置spider呢?

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

這裏以例子來講明這個問題。假設您有一個spider須要登陸某個網站來 爬取數據,而且僅僅想爬取特定網站的特定部分(每次都不必定相同)。 在這個狀況下,認證的信息將寫在設置中,而爬取的特定部分的url將是spider參數。

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

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

我獲得錯誤: 「不能導入name crawler「

這是因爲Scrapy修改,去掉了單例模式(singletons)所引發的。 這個錯誤通常是由從 scrapy.project導入 crawler 的模塊引發的(擴展,中間件,pipeline或spider)。 例如:

from scrapy.project import crawlerclass SomeExtension(object):
    def __init__(self):
        self.crawler = crawler
        # ...

這種訪問crawler對象的方式已經被捨棄了,新的代碼應該使用 from_crawler 類方法來移植,例如:

class SomeExtension(object):

    @classmethod
    def from_crawler(cls, crawler):
        o = cls()
        o.crawler = crawler
        return o

Scrapy終端工具(command line tool)針對舊的導入機制提供了一些支持(給出了廢棄警告), 但若是您以不一樣方式使用Scrapy(例如,做爲類庫),該機制可能會失效。

相關文章
相關標籤/搜索