[英]Recursively Scraping pages using Python (scrapy)
我正在嘗試制作一個程序,在轉到下一頁時檢索商品的標題和價格。
現在第一頁的所有信息(標題,價格)都被提取出來了,但程序不會進入下一頁
網址: https : //scrapingclub.com/exercise/list_basic/
import scrapy
class RecursiveSpider(scrapy.Spider):
name = 'recursive'
allowed_domains = ['scrapingclub.com/exercise/list_basic/']
start_urls = ['http://scrapingclub.com/exercise/list_basic//']
def parse(self, response):
card = response.xpath("//div[@class='card-body']")
for thing in card:
title = thing.xpath(".//h4[@class='card-title']").extract_first()
price = thing.xpath(".//h5").extract_first
yield {'price' : price, 'title' : title}
next_page_url = response.xpath("//li[@class='page-item']//a/@href")
if next_page_url:
absolute_nextpage_url = response.urljoin(next_page_url)
yield scrapy.Request(absolute_nextpage_url) ```
您應該在這種情況下添加執行日志,這將有助於確定您的問題。
我可以看到一些問題:
next_page_url = response.xpath("//li[@class='page-item']//a/@href")
if next_page_url:
absolute_nextpage_url = response.urljoin(next_page_url)
變量next_page_url
包含一個選擇器,而不是一個字符串。 您需要使用.get()
方法來提取具有相對 url 的字符串。
在此之后,我執行了它返回的代碼:
2020-09-04 15:19:34 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'scrapingclub.com': <GET https://scrapingclub.com/exercise/list_basic/?page=2>
它過濾請求,因為它認為它是非現場請求,即使它不是。 要修復它,只需使用allowed_domains = ['scrapingclub.com']
或完全刪除此行。 如果您想了解更多此過濾器的工作原理,請查看此處的來源。
最后,將這個片段放在 for 循環下是沒有意義的:
next_page_url = response.xpath("//li[@class='page-item']//a/@href").get() # I added the .get()
if next_page_url:
absolute_nextpage_url = response.urljoin(next_page_url)
yield scrapy.Request(absolute_nextpage_url)
get()
方法,它將返回next_page_url
第一項(現在是第 2 頁,但在下一個回調中將是第 1 頁,因此您永遠不會前進到第 3 頁)。getall()
它將返回一個列表,您需要迭代它以產生所有可能的請求,但這是一個遞歸函數,因此您最終會在每個遞歸步驟中執行此操作。最好的選擇是選擇下一個按鈕而不是頁碼:
next_page_url = response.xpath('//li[@class="page-item"]/a[contains(text(), "Next")]/@href').get()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.