BeautifulSoup 及 lxml 是 HTML 和 XML 的分析庫。Scrapy 則是 編寫爬蟲,爬取網(wǎng)頁并獲取數(shù)據(jù)的應用框架(application framework)。
Scrapy 提供了內(nèi)置的機制來提取數(shù)據(jù)(叫做 選擇器(selectors))。 但如果您覺得使用更為方便,也可以使用 BeautifulSoup(或 lxml)。 總之,它們僅僅是分析庫,可以在任何 Python 代碼中被導入及使用。
換句話說,拿 Scrapy 與 BeautifulSoup (或 lxml) 比較就好像是拿 jinja2 與 Django 相比。
Scrapy 僅僅支持 Python 2.7。Python2.6 的支持從 Scrapy 0.20 開始被廢棄了。
不。但是 Python 3.3+的支持已經(jīng)在計劃中了?,F(xiàn)在,Scrapy 支持 Python 2.7。
參見
Scrapy 支持那些 Python 版本?。
也許吧,不過我們不喜歡這個詞。我們認為 Django 是一個很好的開源項目,同時也是 一個很好的參考對象,所以我們把其作為 Scrapy 的啟發(fā)對象。
我們堅信,如果有些事情已經(jīng)做得很好了,那就沒必要再重復制造輪子。這個想法,作為 開源項目及免費軟件的基石之一,不僅僅針對軟件,也包括文檔,過程,政策等等。所以,與其自行解決每個問題,我們選擇從其他已經(jīng)很好地解決問題的項目中復制想法(copy idea) ,并把注意力放在真正需要解決的問題上。
如果 Scrapy 能啟發(fā)其他的項目,我們將為此而自豪。歡迎來抄(steal)我們!
是的。(從 Scrapy 0.8 開始)通過 HTTP 代理下載中間件對 HTTP 代理提供了支持。參考 HttpProxyMiddleware
。
參考 Passing additional data to callback functions。
這是個 Twisted bug,您需要安裝 pywin32。
參考 使用 FormRequest.from_response()方法模擬用戶登錄。
默認情況下,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'
參考調(diào)試內(nèi)存溢出
。
另外,Python 自己也有內(nèi)存泄露,在 Leaks without leaks
有所描述。
參考上一個問題。
可以。參考 HttpAuthMiddleware
.
嘗試通過覆蓋 DEFAULT_REQUEST_HEADERS
設(shè)置來修改默認的 Accept-Language 請求頭。
參考例子
。
是的。您可以使用 runspider
命令。例如,如果您有個 spider 寫在 my_spider.py
文件中,您可以運行:
scrapy runspider my_spider.py
詳情請參考 runspider
命令。
這些消息(以 DEBUG 所記錄)并不意味著有問題,所以你可以不修復它們。
這些消息由 Offsite Spider 中間件(Middleware)所拋出。 該(默認啟用的)中間件篩選出了不屬于當前 spider 的站點請求。
更多詳情請參見:OffsiteMiddleware
。
參見 Scrapyd
。
這取決于您的輸出有多大。參考 JsonItemExporter
文檔中的這個警告
。
我能在信號處理器(signal handler)中返回(Twisted)引用么?
有些信號支持從處理器中返回引用,有些不行。參考內(nèi)置信號參考手冊(Built-in signals reference)
來了解詳情。
999 是雅虎用來控制請求量所定義的返回值。 試著減慢爬取速度,將 spider 的下載延遲改為 2 或更高:
class MySpider(CrawlSpider):
name = 'myspider'
download_delay = 2
# [ ... rest of the spider code ... ]
或在 DOWNLOAD_DELAY
中設(shè)置項目的全局下載延遲。
pdb.set_trace()
來調(diào)試么?可以,但你也可以使用 Scrapy 終端。這能讓你快速分析(甚至修改) spider 處理返回的返回(response)。通常來說,比老舊的 pdb.set_trace()
有用多了。
更多詳情請參考 在 spider 中啟動 shell 來查看 response
。
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ù)的作用請參考這篇文章。這里有一個爬取這種站點的樣例爬蟲。
使用 XPath 選擇器來分析大數(shù)據(jù)源可能會有問題。選擇器需要在內(nèi)存中對數(shù)據(jù)建立完整的 DOM 樹,這過程速度很慢且消耗大量內(nèi)存。
為了避免一次性讀取整個數(shù)據(jù)源,您可以使用 scrapy.utils.iterators
中的 xmliter
及 csviter
方法。 實際上,這也是 feed spider(參考 Spiders
)中的處理方法。
是的,Scrapy 接收并保持服務器返回來的 cookies,在之后的請求會發(fā)送回去,就像正常的網(wǎng)頁瀏覽器做的那樣。
更多詳情請參考 Requests and Responses
及 CookiesMiddleware
。
啟用 COOKIES_DEBUG
選項。
在回調(diào)函數(shù)中 raise CloseSpider
異常。 更多詳情請參見:CloseSpider
。
參考避免被禁止(ban)
。
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ù)。
也許您需要移除命名空間(namespace)。參見移除命名空間
。