BeautifulSoup 及 lxml 是HTML和XML的分析庫。Scrapy則是 編寫爬蟲,爬取網頁並獲取數據的應用框架(application framework)。html
Scrapy提供了內置的機制來提取數據(叫作 選擇器(selectors))。 但若是您以爲使用更爲方便,也可使用 BeautifulSoup (或 lxml)。 總之,它們僅僅是分析庫,能夠在任何Python代碼中被導入及使用。python
換句話說,拿Scrapy與 BeautifulSoup (或 lxml) 比較就好像是拿 jinja2 與 Django 相比。git
Scrapy僅僅支持Python 2.7。 Python2.6的支持從Scrapy 0.20開始被廢棄了。github
不。可是Python 3.3+的支持已經在計劃中了。 如今,Scrapy支持Python 2.7。web
參見shell
Scrapy支持那些Python版本?.django
也許吧,不過咱們不喜歡這個詞。咱們認爲 Django 是一個很好的開源項目,同時也是 一個很好的參考對象,因此咱們把其做爲Scrapy的啓發對象。json
咱們堅信,若是有些事情已經作得很好了,那就不必再重複製造輪子。這個想法,做爲 開源項目及免費軟件的基石之一,不只僅針對軟件,也包括文檔,過程,政策等等。 因此,與其自行解決每一個問題,咱們選擇從其餘已經很好地解決問題的項目中複製想法(copy idea) ,並把注意力放在真正須要解決的問題上。api
若是Scrapy能啓發其餘的項目,咱們將爲此而自豪。歡迎來抄(steal)咱們!瀏覽器
是的。(從Scrapy 0.8開始)經過HTTP代理下載中間件對HTTP代理提供了支持。參考HttpProxyMiddleware
.
參考 Passing additional data to callback functions.
這是個Twisted bug ,您須要安裝 pywin32 。
參考 使用FormRequest.from_response()方法模擬用戶登陸.
默認狀況下,Scrapy使用 LIFO 隊列來存儲等待的請求。簡單的說,就是 深度優先順序 。深度優先對大多數狀況下是更方便的。若是您想以 廣度優先順序 進行爬取,你能夠設置如下的設定:
DEPTH_PRIORITY = 1SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'
參考 調試內存溢出.
另外,Python本身也有內存泄露,在 Leaks without leaks 有所描述。
參考上一個問題
能夠。參考 HttpAuthMiddleware
.
嘗試經過覆蓋 DEFAULT_REQUEST_HEADERS
設置來修改默認的 Accept-Language 請求頭。
參考 例子.
是的。您可使用 runspider
命令。例如,若是您有個 spider寫在 my_spider.py
文件中,您能夠運行:
scrapy runspider my_spider.py
詳情請參考 runspider
命令。
這些消息(以 DEBUG
所記錄)並不意味着有問題,因此你能夠不修復它們。
這些消息由Offsite Spider中間件(Middleware)所拋出。 該(默認啓用的)中間件篩選出了不屬於當前spider的站點請求。
更多詳情請參見: OffsiteMiddleware
.
參見 Scrapyd.
這取決於您的輸出有多大。參考 JsonItemExporter
文檔中的 這個警告
有些信號支持從處理器中返回引用,有些不行。參考 內置信號參考手冊(Built-in signals reference)來了解詳情。
999是雅虎用來控制請求量所定義的返回值。 試着減慢爬取速度,將spider的下載延遲改成 2
或更高:
class MySpider(CrawlSpider): name = 'myspider' download_delay = 2 # [ ... rest of the spider code ... ]
或在 DOWNLOAD_DELAY
中設置項目的全局下載延遲。
pdb.set_trace()
來調試麼?能夠,但你也可使用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
參數是什麼?__VIEWSTATE
參數存在於ASP.NET/VB.NET創建的站點中。關於這個參數的做用請參考 這篇文章 。這裏有一個爬取這種站點的 樣例爬蟲 。
使用XPath選擇器來分析大數據源可能會有問題。選擇器須要在內存中對數據創建完整的 DOM樹,這過程速度很慢且消耗大量內存。
爲了不一次性讀取整個數據源,您可使用 scrapy.utils.iterators
中的 xmliter
及 csviter
方法。 實際上,這也是feed spider(參考 Spiders)中的處理方法。
是的,Scrapy接收並保持服務器返回來的cookies,在以後的請求會發送回去,就像正常的網頁瀏覽器作的那樣。
更多詳情請參考 Requests and Responses 及 CookiesMiddleware 。
啓用 COOKIES_DEBUG
選項。
在回調函數中raise CloseSpider
異常。 更多詳情請參見: CloseSpider
。
參考 避免被禁止(ban).
spider參數 及 設置(settings) 均可以用來配置您的spider。 沒有什麼強制的規則來限定要使用哪一個,但設置(settings)更適合那些一旦設置就不怎麼會修改的參數, 而spider參數則意味着修改更爲頻繁,在每次spider運行都有修改,甚至是spider運行所必須的元素 (例如,設置spider的起始url)。
這裏以例子來講明這個問題。假設您有一個spider須要登陸某個網站來 爬取數據,而且僅僅想爬取特定網站的特定部分(每次都不必定相同)。 在這個狀況下,認證的信息將寫在設置中,而爬取的特定部分的url將是spider參數。
也許您須要移除命名空間(namespace)。參見 移除命名空間.
這是因爲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(例如,做爲類庫),該機制可能會失效。