2017-04-10 25 views
0

我的scrapy腳本寫入我的MySQL數據庫而不是通過pipelines.py寫入我的MySQL數據庫嗎?這會減慢蜘蛛嗎?請注意,我懷疑items.py上有任何項目。通過splines v/s通過pipelines.py寫入數據庫

後續:如何以及何時調用pipelines.py?收益聲明後會發生什麼?

回答

1

它高度依賴於實現,但是如果您以不會阻塞太多的方式實現數據庫寫入,那麼沒有太多不同的性能。

但是,有一個非常巨大的結構差異。 Scrapy的設計哲學極力鼓勵使用中間件和管道,以保持蜘蛛清潔和易懂。換句話說,蜘蛛位應該抓取數據,中間件應該修改請求和響應,管道應該通過一些外部邏輯(比如將數據放入數據庫或文件)來管理返回的數據。

關於你的跟進問題:

如何以及何時被調用pipelines.py?收益聲明後會發生什麼?

看看Architectual Overview documentation page,如果你想深入瞭解你必須瞭解twisted asyncronious框架,因爲scrapy只是一個大的,它周圍的智能框架。

+0

「管道應該通過一些外部邏輯來管理返回的數據」 - 迂腐,但我會說,最好使用擴展,更具體地說是[Feed Export](https://doc.scrapy.org/en/latest /topics/feed-exports.html)。 [This](https://github.com/scrapy/scrapy/blob/d8672689761f0bb6c0550a841f35534265e87fee/scrapy/extensions/feedexport.py)是scrapy有其默認Feed輸出的地方。管道更多的是特定於領域的業務邏輯,可能會豐富或丟棄一個「Item」。 – neverlastn

+0

@neverlastn雖然你認爲飼料出口商應該在可用時應該使用,但並不意味着你不能通過管道進行異步出口 - 畢竟整個scrapy引擎都是在可隨時訪問的扭曲引擎上運行的。內置飼料出口商也很難擴展。我認爲更重要的是我的意思是「外部邏輯」,因爲任何不是頁面解析的東西,都不需要調用某些外部腳本或程序。 – Granitosaurus

+0

我可能會變得有點憤世嫉俗,但除了非常小的抓取之外,最簡單,足夠好的方法是轉儲到本地文件,並且在抓取結束時使用另一種技術來批量導入(例如,在單個SQL交易和鎖定一次)。否則,最終會出現大多數人無法正​​確使用的異步API,奇怪的性能問題以及每項VS每批次/作業導入的模型,這意味着插入性能不佳,並且您可能必須重複刪除或修復損壞的數據例如如果你的工作崩潰,你必須重新啓動。 – neverlastn

1

如果您希望獲得最佳性能,請將項目存儲在文件(例如csv)中,並在您的爬網完成批量時將其插入數據庫。對於csv數據,您可以使用mysqlimport(請參閱MySQL bulk insert from CSV data files)。建議的方法是在插入時不要阻塞。這將需要您使用使用Twisted RDBMS API的管道。