私はこのウェブサイトを掻いています:https://www.olx.com.ar/celulares-telefonos-cat-831とScrapy 1.4.0。私がスパイダーを動かすと、すべてがうまくいって「次のページ」の部分に行きます。ここでは、コードです:次のページのURLに従うのはなぜですか?
# -*- coding: utf-8 -*-
import scrapy
#import time
class OlxarSpider(scrapy.Spider):
name = "olxar"
allowed_domains = ["olx.com.ar"]
start_urls = ['https://www.olx.com.ar/celulares-telefonos-cat-831']
def parse(self, response):
#time.sleep(10)
response = response.replace(body=response.body.replace('<br>', ''))
SET_SELECTOR = '.item'
for item in response.css(SET_SELECTOR):
PRODUCTO_SELECTOR = '.items-info h3 ::text'
yield {
'producto': item.css(PRODUCTO_SELECTOR).extract_first().replace(',',' '),
}
NEXT_PAGE_SELECTOR = '.items-paginations-buttons a::attr(href)'
next_page = response.css(NEXT_PAGE_SELECTOR).extract_first().replace('//','https://')
if next_page:
yield scrapy.Request(response.urljoin(next_page),
callback=self.parse
)
私は何人かの人々がRequest
へdont_filter = True
属性を追加した他の質問で見てきたが、それは私のために動作しません。最初の2ページにスパイダーループを作成するだけです。 https:
が付いていないオリジナルのhrefを修正するためにreplace('//','https://')
部分を追加しました。これにはScrapyを続けることはできません。 また、スパイダーを実行すると、最初のページがスクラップされてから返されます。[scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET https://www.olx.com.ar/celulares-telefonos-cat-831-p-2> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
明らかにそうでない場合、2番目のページを複製するようにフィルタリングするのはなぜですか?
コメントにTarun Lalwaniソリューションを適用しました。私はその細部をあまり見逃してしまった!補正がうまくいき、ありがとう!
その奇妙なコード。 response.urljoinを使用する場合は、なぜ.replace( '//'、 'https://')が必要ですか?スパイダーのすべてのコードを入力してください。 – Verz1Lka
私はすでにhttpsの部分を使わずに試してみたところ、同じ結果が得られて問題はありません。私はウェブページや自分のコードについて何か不足しています。 –