如何解决使用Python递归抓取页面草率
我正在尝试制作一个程序,以在转到下一页时检索商品的标题和价格。
现在提取第一页的所有信息(标题,价格),但程序不会进入下一页
URL: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']
或完全删除此行。如果您想进一步了解此过滤器的工作原理,请查看源here。
最后,在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()
,它将返回一个列表,您需要对其进行迭代以产生所有可能的请求,但这是一个递归函数,因此最终将在每个递归步骤中执行。 li>
最好的选择是选择下一个按钮而不是页码:
next_page_url = response.xpath('//li[@class="page-item"]/a[contains(text(),"Next")]/@href').get()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。