2017-09-03 10 views
1

私はPythonとScrapyが新しく、FormRequestを使用して検索結果ページのタイトルを取得する単純なクローラにいくつかの問題があります。Scrapy:CSVのFormRequest、順番にまたは検索タームでエクスポート

基本的に、考えられるのは、検索語句で満たされたCSVを同じ形式で実行し、結果ページからタイトルを取得し、別の(または同じ)CSVにエクスポートすることです。

検索結果の出力は、希望どおり/期待通りです。

問題は、ページがスクラピー用に読み込まれる順番にタイトルをエクスポートすることです。つまり、元のCSVと比較して順序が間違っていて、元のCSVの行に戻すことはできません。私はStackOverflowの上での検索の束を行っているが、FormRequestを使用しての面で地雷に一致する問題を見つけるカント

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'^[^|]+(?=|)') 
      } 

は、ここに私のコードです。私はCONCURRENT_REQUESTSを1に設定しようとしましたが、それは助けになりませんでした。

移動する前に各FormRequestが完了するのを待つか、入力された検索語をその出力に含めるかのどちらかを強制する方法がありますか?

私のPythonの知識は進んでいないので、助けになるコードを簡単に微調整したいと思っています。

ご指摘いただければ幸いです。

答えて

0

最も簡単なのは、request.meta dictに元の行番号を追加して解析するときに出力するのが最も簡単な方法です。

(未テスト)このような何か:

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'^[^|]+(?=|)') 
      } 
関連する問題