Scrapy爬虫无法跳转至下一页仅能抓取第一页内容,应如何排查解决?
问题排查
你的代码存在4个明确问题,按优先级排序如下:
- 缩进错误:
rules配置、parse方法都没有缩进在CasaSpider类内部,属于全局定义,爬虫运行时无法读取到这两个配置,规则不生效、自定义解析逻辑也不会被触发。 - 错误重写内置方法:
CrawlSpider自带parse方法用于执行链接提取规则,你重写该方法会直接导致规则完全失效,详情页链接不会被自动提取抓取。 - 逻辑错位:你写的解析方法中,
title、price是房源详情页的字段,而分页链接存在于列表页,两类逻辑混写导致:列表页请求进入解析方法时提取不到房源字段,同时详情页内不存在分页链接,自然无法跳转到下一页。 - 细节错误:你先执行
response.urljoin(next_page)再判断next_page is not None,如果选择器没有获取到链接,next_page为None时urljoin会直接抛出异常,打断爬虫运行。
修正后代码
import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class CasaSpider(CrawlSpider): name = 'house' start_urls = ['https://www.casa.it/affitto/residenziale/napoli/montecalvario-avvocata-san-giuseppe-porto-pendino-mercato?sortType=date_desc'] # rules缩进放入类内部,回调方法改为自定义的parse_item rules = [ Rule(LinkExtractor(allow=(r'/immobili/.*'), deny=(r'/immagine-.*')), callback='parse_item', follow = False), ] # 重写start_urls处理方法,优先处理分页再提取当前页详情链接 def parse_start_url(self, response): next_page = response.css('a.paginator__page.tp-a--c.b-r--100.is-block.c-bg--w.tp-w--m.paginator__nav.next::attr(href)').get() if next_page is not None: next_page = response.urljoin(next_page) yield scrapy.Request(url=next_page, callback=self.parse_list_page) yield from super().parse_start_url(response) # 通用列表页处理方法 def parse_list_page(self, response): next_page = response.css('a.paginator__page.tp-a--c.b-r--100.is-block.c-bg--w.tp-w--m.paginator__nav.next::attr(href)').get() if next_page is not None: next_page = response.urljoin(next_page) yield scrapy.Request(url=next_page, callback=self.parse_list_page) yield from super().parse(response) # 自定义详情页解析方法,禁止命名为parse def parse_item(self, response): yield { 'title': response.xpath('//*[@id="__next"]/div[2]/div[2]/div[1]/div/h1/text()').get(), 'price': response.xpath('//*[@id="__next"]/div[2]/div[2]/div[1]/div/ul/li[1]/text()').get() }
内容的提问来源于stack exchange,提问作者J. Malik
相关产品推荐
相关产品推荐

