2017-11-20 3 views
0

私は文書化(https://doc.scrapy.org/en/latest/topics/jobs.html)の助けを借りてScrapyでの一時停止/再開をうまく実装しました。例(How can i use multiple requests and pass items in between them in scrapy python)を適用することによって、複数のページを1つのCSVラインの1項目の値に塗りつぶすこともできます。しかし、私は両方の機能を一緒に動作させるようにはできないので、私は各アイテムについて2ページから掻き集めるスパイダーを持ち、一時停止して再起動することができます。アイテムごとに複数のページから1つのCSVファイルにスクレイピングするとき、Scrapy Pause/Resumeを実装するにはどうすればよいですか?

例としてwww.beeradvocate.comでの私の試みです。 urls_collection1とurls_collection2はそれぞれ40,000を超えるURLのリストです。

を最初のページから第2ページから

def parse1(self, response): 
    item = response.meta['item'] 
    item['gender_age'] = response.css('.userTitleBlurb .userBlurb').xpath('text()').extract_first() 
    yield item 

解析を

def start_requests(self): 
    urls_collection1 = pd.read_csv('urls_collection1.csv') 
    #example url_collection1: 'https://www.beeradvocate.com/community/members/sammy.3853/?card=1' 
    urls_collection2 = pd.read_csv('urls_collection2.csv') 
    #example url_collection2: 'https://www.beeradvocate.com/user/beers/?ba=Sammy' 

    for i in range(len(urls_collection1)): 
     item = item() 
     yield scrapy.Request(urls_collection1.iloc[i,0],callback=self.parse1, meta={'item': item}) 
     yield scrapy.Request(urls_collection2.iloc[i,0], callback=self.parse2, meta={'item': item}) 

     #To allow for pause/resume 
     self.state['items_count'] = self.state.get('items_count', 0) + 1 

解析を開始

def parse2(self,response): 
    item = response.meta['item'] 
    item['num_reviews'] = response.xpath('//*[@id="ba-content"]/div/b/text()[2]').extract_first() 
    return item 

E非常にうまくいくように見えるのは、解析1と解析2でスクレイプされたデータが、1つのアイテムと同じ行ではなく、異なる行で終了するという点です。

答えて

0

ことは、これを試してみてください:

def start_requests(self): 
    urls_collection1 = pd.read_csv('urls_collection1.csv') 
    #example url_collection1: 'https://www.beeradvocate.com/community/members/sammy.3853/?card=1' 
    urls_collection2 = pd.read_csv('urls_collection2.csv') 
    #example url_collection2: 'https://www.beeradvocate.com/user/beers/?ba=Sammy' 

    for i in range(len(urls_collection1)): 
     item = item() 
     yield scrapy.Request(urls_collection1.iloc[i,0], 
          callback=self.parse1, 
          meta={'item': item, 
            'collection2_url': urls_collection2.iloc[i,0]}) 

def parse1(self, response): 
    collection2_url = respones.meta['collection2_url'] 
    item = response.meta['item'] 
    item['gender_age'] = response.css('.userTitleBlurb .userBlurb').xpath('text()').extract_first() 
    yield Request(collection2_url, 
        callback=self.parse2, 
        meta={'item': item}) 

def parse2(self,response): 
    item = response.meta['item'] 
    item['num_reviews'] = response.xpath('//*[@id="ba-content"]/div/b/text()[2]').extract_first() 
    return item 
+0

こんにちは、お返事ありがとうございました。私は今これが私のために空のCSVファイルをもたらすのではないかと思います。おそらく、それは私がクモと呼ぶ方法ですか?コマンドは次のとおりです:scrap crawl myScraper -o scrape_raw.csv -t csv -s JOBDIR = job_201117 –

+0

スパイダーがリクエストをフィルタリングしているかどうか知っていますか?それは 'parse2'メソッドに到達しますか? – Wilfredo

+0

私は 'dont_filter = True'をcollection2_urlリクエストに追加しようとしました。ありがとう、私は自動リクエストのフィルタリングについて知らなかったし、何がうまくいかなかったかを理解するのに何時間も費やしていたでしょう! –

関連する問題