BeautifulSoup 及 lxml 是 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) 比較就好像是拿 jinja2 與 Django 相比。
Scrapy 僅僅支持 Python 2.7。Python2.6 的支持從 Scrapy 0.20 開始被廢棄了。
不。但是 Python 3.3+的支持已經(jīng)在計(jì)劃中了?,F(xiàn)在,Scrapy 支持 Python 2.7。
參見
Scrapy 支持那些 Python 版本?。
也許吧,不過我們不喜歡這個(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 0.8 開始)通過 HTTP 代理下載中間件對(duì) HTTP 代理提供了支持。參考 HttpProxyMiddleware
。
參考 Passing additional data to callback functions。
這是個(gè) Twisted bug,您需要安裝 pywin32。
參考 使用 FormRequest.from_response()方法模擬用戶登錄。
默認(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'
參考調(diào)試內(nèi)存溢出
。
另外,Python 自己也有內(nèi)存泄露,在 Leaks without leaks
有所描述。
參考上一個(gè)問題。
可以。參考 HttpAuthMiddleware
.
嘗試通過覆蓋 DEFAULT_REQUEST_HEADERS
設(shè)置來修改默認(rèn)的 Accept-Language 請(qǐng)求頭。
參考例子
。
是的。您可以使用 runspider
命令。例如,如果您有個(gè) spider 寫在 my_spider.py
文件中,您可以運(yùn)行:
scrapy runspider my_spider.py
詳情請(qǐng)參考 runspider
命令。
這些消息(以 DEBUG 所記錄)并不意味著有問題,所以你可以不修復(fù)它們。
這些消息由 Offsite Spider 中間件(Middleware)所拋出。 該(默認(rèn)啟用的)中間件篩選出了不屬于當(dāng)前 spider 的站點(diǎn)請(qǐng)求。
更多詳情請(qǐng)參見:OffsiteMiddleware
。
參見 Scrapyd
。
這取決于您的輸出有多大。參考 JsonItemExporter
文檔中的這個(gè)警告
。
我能在信號(hào)處理器(signal handler)中返回(Twisted)引用么?
有些信號(hào)支持從處理器中返回引用,有些不行。參考內(nèi)置信號(hào)參考手冊(cè)(Built-in signals reference)
來了解詳情。
999 是雅虎用來控制請(qǐng)求量所定義的返回值。 試著減慢爬取速度,將 spider 的下載延遲改為 2 或更高:
class MySpider(CrawlSpider):
name = 'myspider'
download_delay = 2
# [ ... rest of the spider code ... ]
或在 DOWNLOAD_DELAY
中設(shè)置項(xiàng)目的全局下載延遲。
pdb.set_trace()
來調(diào)試么?可以,但你也可以使用 Scrapy 終端。這能讓你快速分析(甚至修改) spider 處理返回的返回(response)。通常來說,比老舊的 pdb.set_trace()
有用多了。
更多詳情請(qǐng)參考 在 spider 中啟動(dòng) 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
更多詳情請(qǐng)參考 Feed exports
__VIEWSTATE
參數(shù)是什么?__VIEWSTATE 參數(shù)存在于 ASP.NET/VB.NET 建立的站點(diǎn)中。關(guān)于這個(gè)參數(shù)的作用請(qǐng)參考這篇文章。這里有一個(gè)爬取這種站點(diǎn)的樣例爬蟲。
使用 XPath 選擇器來分析大數(shù)據(jù)源可能會(huì)有問題。選擇器需要在內(nèi)存中對(duì)數(shù)據(jù)建立完整的 DOM 樹,這過程速度很慢且消耗大量內(nèi)存。
為了避免一次性讀取整個(gè)數(shù)據(jù)源,您可以使用 scrapy.utils.iterators
中的 xmliter
及 csviter
方法。 實(shí)際上,這也是 feed spider(參考 Spiders
)中的處理方法。
是的,Scrapy 接收并保持服務(wù)器返回來的 cookies,在之后的請(qǐng)求會(huì)發(fā)送回去,就像正常的網(wǎng)頁瀏覽器做的那樣。
更多詳情請(qǐng)參考 Requests and Responses
及 CookiesMiddleware
。
啟用 COOKIES_DEBUG
選項(xiàng)。
在回調(diào)函數(shù)中 raise CloseSpider
異常。 更多詳情請(qǐng)參見:CloseSpider
。
參考避免被禁止(ban)
。
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ù)。
也許您需要移除命名空間(namespace)。參見移除命名空間
。