2014-10-27 66 views
0

我正在編寫一個使用Scrapy和本地所有工程很好的Django Web應用程序,但我不知道如何建立一個生產環境,我的蜘蛛定期自動啓動(我的意思是一次蜘蛛完成它的工作,在一定時間後重新啓動......例如24小時後)。 目前我使用自定義Django的命令,它具有允許使用Django的ORM存儲刮下項目的主要目標發動我的蜘蛛,所以我跑:生產中的Scrapy + Django

python manage.py scrapy crawl myspider 

和結果存儲在我的Postgres數據庫。 我安裝scrapyd,因爲它似乎是在生產中運行scrapy 的首選方式,但不幸的是我不能在沒有編寫猴子補丁(我想避免)的情況下使用它,因爲它將JSON用於其Web服務API和我得到「modelX不是JSON序列化」的例外。 我看了看django-dynamic-scraper,但它似乎沒有被設計成靈活和可定製的Scrapy是,事實上在文檔他們說:

因爲它簡化了事情DDS並不適用於所有類型的 刮削器使用,但是它是非常適合的 比較常見的情況經常刮網站,更新的項目

我也想過用crontab來安排我的蜘蛛列表......但是在什麼區間,我應該跑我的蜘蛛?如果我的EC2實例(我將使用亞馬遜web服務託管我的代碼)需要重新啓動,我必須手動重新運行我的所有蜘蛛... mmmh ...事情變得複雜... 那麼...什麼可以成爲生產環境的有效設置?你如何處理它?你有什麼建議?

回答

0

我有同樣的問題,導致我在這裏你的。這是我的想法和我對我的項目所做的。

目前我使用自定義Django的命令,其中有 允許使用Django的ORM的存儲的主要目標刮 項目

這聽起來很有趣推出我的蜘蛛。我也想在Scrapy蜘蛛裏面使用Django的ORM,所以我確實在導入django之前設置好了它,然後再進行抓取。如果你從已經實例化的Django上下文中調用scrapy,我想這是不必要的。

我安裝scrapyd,因爲它似乎是運行在生產 scrapy的首選方式,但遺憾的是我不能沒有寫 猴子補丁(我想避免)

使用

我有使用subprocess.Popen的想法,用stdout和stderr重定向到PIPE。然後獲取stdout和stderr結果並處理它們。我不需要從輸出中收集項目,因爲蜘蛛已經通過管道將結果寫入數據庫。如果您以這種方式從Django調用scrapy進程,並且scrapy進程設置Django上下文以便它可以使用ORM,它會得到遞歸。

然後我試圖scrapyd是的,你必須HTTP請求火起來的scrapyd入隊的工作,但工作完成時,它沒有信號,你或者如果它處於未決狀態。這部分你必須檢查,我想這是一個猴子補丁的地方。

我也認爲使用crontab來安排我的蜘蛛......但在什麼 間隔應該運行我的蜘蛛?如果我的EC2實例(我要 使用亞馬遜web服務來託管我的代碼)需要重新啓動我必須 手動重新運行我的所有蜘蛛... mmmh ...事情變得複雜... 因此.. 。什麼可能是一個有效的生產環境設置? 你如何處理它?你有什麼建議?

我目前使用cron調度刮取。這不是用戶可以改變的東西,即使他們想要,但它也有其優點。這樣,我確信用戶不會縮短這段時間,並讓多個刮板同時工作。

我擔心在鏈中引入不必要的鏈接。 Scrapyd將成爲中間環節,看起來它現在正在做它的工作,但如果它不能承擔生產負擔,它也可能是薄弱環節。

考慮到你之前發佈過這個消息,我希望聽到你的解決方案是關於整個Django-Scrapy-Scrapyd集成的。

乾杯