我正在尝试制作一个程序,以在转到下一页时检索商品的标题和价格。
现在,第一页的所有信息(标题,价格)均已提取,但程序不会转到下一页
网址: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()
method,它将返回到next_page_url
第一项(现在是第2页,但是在下一个回调中将是第1页,因此您将永远不会前进到第3页)。getall()
它,将返回一个列表,您需要对其进行迭代以产生所有可能的请求,但这是一个递归函数,因此最终需要在每个递归步骤中执行此操作。最好的选择是选择下一个按钮而不是页码:
next_page_url = response.xpath('//li[@class="page-item"]/a[contains(text(), "Next")]/@href').get()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句