class HomedepotcrawlSpider(CrawlSpider):
name = 'homeDepotCrawl'
#allowed_domains = ['homedepot.com']
start_urls =['https://www.homedepot.com/b/Appliances/ZLINE-Kitchen-and-Bath/N-5yc1vZbv1wZhsy?experienceName=default&Nao=0']
def parse(self, response):
for item in self.parseHomeDepot(response):
yield item
next_page_url = response.xpath('//link[@rel="next"]/@href').extract_first()
if next_page_url:
yield response.follow(url=next_page_url, callback=self.parse)
def parseHomeDepot(self, response):
items = response.css('.plp-pod')
for product in items:
item = HomedepotSpiderItem()
#get SKU
productSKU = product.css('.pod-plp__model::text').getall()
#get rid of all the stuff i dont need
productSKU = [x.strip(' ') for x in productSKU] #whiteSpace
productSKU = [x.strip('\n') for x in productSKU]
productSKU = [x.strip('\t') for x in productSKU]
productSKU = [x.strip(' Model# ') for x in productSKU] #gets rid of the model name
productSKU = [x.strip('\xa0') for x in productSKU] #gets rid of the model name
item['productSKU'] = productSKU
yield item
問題の説明
ここで私はこすりデータに取り組んできたことをプログラムの一部です。私はこのポストに含める必要があったとは思いませんでしたので、私は他のフィールドを掻き取るための私のコードを残しました。私はExcelにこのプログラムおよびエクスポートデータを実行すると、私は最初の240の項目(10ページ)を取得します。それは、(最初の行はラベルによって占有されている)私のスプレッドシートの241行に上がります。次いで、行242から出発し、最初の241行が再び繰り返されます。再び行482および722に。
スクレーパーは、第240アイテムを3回出力します
EDIT だから私はこするの間のログを探していた、それはすべてのページを掻き取っなっていたことが判明しました。最後のページには、次のとおりです。
そして、その後のログファイルがあり、再び掻き取ったばかりの最初のページを、表示されます。
私はExcelにエクスポートするために使用していることを、端末のコマンドは次のとおりです。
scrapy crawl homeDepotCrawl -t csv -o - > "(File Location)"
編集:私は、このコマンドを使用していた理由は、これはターゲットファイルが消去されますので、エクスポートするときは、Scrapyは、ファイルに掻き取ったデータを付加しているためであるとちょうどそれを再度作成します。
私はすべてのページを取得導出するために使用するコードは次のようになります。
<a class="hd-pagination__link" title="Next" href="/b/Appliances/ZLINE-Kitchen-and-Bath/N-5yc1vZbv1wZhsy?experienceName=default&Nao=24&Ns=None" data-pagenumber="2"></a>
もともと私は変わっsettings.py私のように、それは、この予期しない動作を引き起こしていたウェブサイトだと思ったROBOTSTXT_OBEY = 0
し、私は遅延を追加しましたが、それは何も変更しませんでした。
だから私はとの助けをしたいと思いますどのような:
CSV出力は最初の240の項目(10ページ)を取り、3回繰り返さ理由を-Figuring
クモは、最初の30を掻き取った後の最初のページに戻っていないことを確認 - どのように
私はこのような何かを示唆しています。主な違いは、私がページに保存されたJSONからの情報をつかんだと私は認識して自分自身をページ付けてるNao
オフセット製品です。コードはあまりにもはるかに短いです。
import requests,json,re
product_skus = set()
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'}
base_url = 'https://www.homedepot.com/b/Appliances/ZLINE-Kitchen-and-Bath/N-5yc1vZbv1wZhsy?experienceName=default&Nao=%s'
for page_num in range(1,1000):
url = base_url % (page_num*24)
res = requests.get(url, headers=headers)
json_data = json.loads(re.search(r'digitalData\.content=(.+);', res.text).group(1))
prev_len = len(product_skus)
for product in json_data['product']:
product_skus.add(product['productInfo']['sku'])
if len(product_skus) == prev_len: break # this line is optional and can determine when you want to break
ホーム・デポのページは次のようにまた、それは見え繰り返し使用すると、240の制限を見ている理由である(少なくとも、あなたが送信したもので)すべての10ページ。ここではそれを自分自身を閲覧からの例です: