2017-06-13 43 views
1

(很長一段時間用戶& &第一個問題& &緊張的問)是真如何將Scrapy Web爬網程序與Luigi數據管道集成?

我目前正在建設一個將被部署到它具有以下架構的單一AWS EC2實例Python的後端:


| ---- 數據源 ----- | Temp Storage | - 數據處理 --- | ----- DB ---- |

網絡爬蟲數據 ---- *保存到S3 * = \
API數據 ----------------- *保存到S3 * == >Lugi數據管道 - > MongoDB的


如上圖所示,我們獲取數據(即API請求,Scrapy網絡爬蟲,等...),但棘手的/困難的部分是未來不同的方式採用簡單的容錯方式將接收到的數據與Luigi數據管道連接起來。

有沒有辦法將網絡爬蟲的輸出集成到Luigi數據管道中?如果沒有,如何彌合HTTP數據獲取者與Luigi任務之間的差距,最好的方法是什麼?

任何意見,文件或文章將超級讚賞!另外,如果你需要更多的細節,我會盡快讓他們在這裏。

謝謝!

回答

2

我從來沒有使用luigi。但我確實使用scrapy。我會猜測真正的問題是你如何以合理的方式通知luigi有新的數據需要處理?

有一個類似的問題,你可以從這裏學到:When a new file arrives in S3, trigger luigi task 也許你們在同一個地方工作:)。

我強烈建議在scrapyd中託管您的蜘蛛並使用scrayd-client來驅動它。如果您嘗試在使用扭曲庫的其他工具中運行scrapy(不確定luigi如何),會彈出各種各樣的毛髮東西。我會使用scrayd-client來驅動蜘蛛,並讓你的蜘蛛發佈一個觸發器url,告訴luigi以某種方式啓動任務。

同樣,因爲我還沒有使用luigi,所以我不知道那裏的詳細信息......但是您不想忙於檢查/輪詢以查明工作是否完成。

我有一個django網絡應用程序,我啓動蜘蛛,存儲來自scrapyd-client的jobid,並在完成後得到一個json tap,然後使用芹菜和solr來獲取數據。

編輯包括來自下面的評論流水線代碼:

 for fentry in item['files']: 

      # open and read the file 
      pdf = open(rootdir+os.path.sep+fentry['path'],'rb').read() 

      # just in case we need cookies 
      cj  = CookieJar() 
      opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) 

      # set the content type 
      headers = { 
      'Content-Type': 'application/json' 
      } 

      #fill out the object 
      json_body = json.dumps({ 
      'uid' : 'indeed-'+item['indeed_uid'], 
      'url' : item['candidate_url'], 
      'first_name' : fname, 
      'last_name' : lname, 
      'pdf'  : base64.b64encode(pdf).decode(), 
      'jobid': spider.jobid 
      }).encode() 
      #, ensure_ascii=False) 

      # send the POST and read the result 
      request = urllib.request.Request('http://localhost:8080/api/someapi/', json_body, headers) 
      request.get_method = lambda: 'POST' 
      response = opener.open(request) 
+0

大點,我一定要不惜一切代價遠離投票站的路程。最後一個問題,你能詳細闡述一下JSON水龍頭嗎?當整個爬蟲程序完成時,或者在單個頁面被抓取並需要處理之後,會發生這種情況嗎?不過考慮個人頁面已經被取出後是否開始處理或是否將所有數據合併爲一個文件,等到以後?然而,我的直覺認爲後者是一個更容易出錯的解決方案/可能導致文件損壞。 –

+0

我做每個項目的項目刮(而不是蜘蛛結束)通過利用項目管道中scrapy。最佳的批處理/處理風格完全取決於您的後端。我在編輯後的答案中包含了來自相關管道的大部分process_item()函數以供參考。如果你不想爲每個項目做...你可以使用scrapy幾乎本地導出到json或csv,然後使用CloseSpider信號或類似的東西發送一個tap到服務器。 – RabidCicada

+0

如果你的項目非常簡單,那麼你不必使用管道只使用導出(內置管道像東西)https://doc.scrapy.org/en/latest/topics/exporters.html。然後你可以觸發SpiderClose或其他東西。 – RabidCicada

相關問題