私は文書化(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つのアイテムと同じ行ではなく、異なる行で終了するという点です。
こんにちは、お返事ありがとうございました。私は今これが私のために空のCSVファイルをもたらすのではないかと思います。おそらく、それは私がクモと呼ぶ方法ですか?コマンドは次のとおりです:scrap crawl myScraper -o scrape_raw.csv -t csv -s JOBDIR = job_201117 –
スパイダーがリクエストをフィルタリングしているかどうか知っていますか?それは 'parse2'メソッドに到達しますか? – Wilfredo
私は 'dont_filter = True'をcollection2_urlリクエストに追加しようとしました。ありがとう、私は自動リクエストのフィルタリングについて知らなかったし、何がうまくいかなかったかを理解するのに何時間も費やしていたでしょう! –