2017-09-03 61 views
1

我是Python和Scrapy的新手,並且遇到了一些簡單的搜尋器問題,我使用FormRequest來獲取搜索結果頁面上的標題。Scrapy:從CSV導出FormRequest,按順序導出或與搜索字詞導出

基本上,這個想法是讓csv充滿搜索條件,並通過相同的表單運行它們,從結果頁面獲取標題,然後導出到不同(或相同)的csv。

搜索工作正常 - 輸出符合預期/預期。

問題是,它按照scrapy爲頁面加載的順序導出標題,這意味着它們與原始csv相比無序,並且我無法將它們與原始csv中的行匹配回來。

這裏是我的代碼:

from scrapy.item import Item, Field 
from scrapy.http import FormRequest 
from scrapy.spider import Spider 

class ExampleSpider(Spider): 
    name = "examplecsv" 
    allowed_domains = ["examplewebsite.com"] 
    start_urls = ["https://www.examplewebsite.com"] 

    def parse(self, response): 
     with open('addresses.csv') as fp: 
      for line in fp: 
       yield FormRequest.from_response(response, 
             formdata={'examplesearchfield':line}, 
             clickdata={'id': 'clickexamplesearch'}, 
             callback=self.parse1) 

    def parse1 (self, response): 

     for title in response.css('title'): 
      yield { 

       'title':title.css('title::text').re(r'^[^|]+(?=|)') 
      } 

我已經做了一堆在計算器上搜索的,但無法找到匹配礦用FormRequest方面存在問題。我嘗試將CONCURRENT_REQUESTS設置爲1,但這沒有幫助。

有沒有辦法強迫scrapy等待每個FormRequest在繼續之前完成,或者包含輸入搜索詞及其輸出?

我的Python知識不是先進的,所以我希望有一個簡單的代碼調整,將有助於。

任何指導將不勝感激。

回答

0

最簡單的可能是在request.meta字典中添加原始行號,並在解析時輸出它。

像這樣(未經):

from scrapy.item import Item, Field 
from scrapy.http import FormRequest 
from scrapy.spider import Spider 

class ExampleSpider(Spider): 
    name = "examplecsv" 
    allowed_domains = ["examplewebsite.com"] 
    start_urls = ["https://www.examplewebsite.com"] 

    def parse(self, response): 
     with open('addresses.csv') as fp: 
      for i, line in enumerate(fp, start=1): 
       yield FormRequest.from_response(response, 
             formdata={'examplesearchfield':line}, 
             clickdata={'id': 'clickexamplesearch'}, 
             callback=self.parse1, 
             meta={'lineno': i}) 

    def parse1 (self, response): 

     for title in response.css('title'): 
      yield { 

       'title':title.css('title::text').re(r'^[^|]+(?=|)'), 
       'lineno': response.meta['lineno'] 
      } 
0

您可以將CSV數據添加到您的請求中,並將其包含在最終收益中。 這將創建一個不需要「將它們重新匹配」的輸出。

from scrapy.item import Item, Field 
from scrapy.http import FormRequest 
from scrapy.spider import Spider 

class ExampleSpider(Spider): 
    name = "examplecsv" 
    allowed_domains = ["examplewebsite.com"] 
    start_urls = ["https://www.examplewebsite.com"] 

    def parse(self, response): 
     with open('addresses.csv') as fp: 
      for line in fp: 
       yield FormRequest.from_response(response, 
             formdata={'examplesearchfield':line}, 
             clickdata={'id': 'clickexamplesearch'}, 
             meta={'line' : line }, 
             callback=self.parse1) 

    def parse1 (self, response): 

     for title in response.css('title'): 
      yield { 
       'line' : response.meta.get('line') 
       'title':title.css('title::text').re(r'^[^|]+(?=|)') 
      }