scrapy.Request()无法爬取下页:同代码在quotes.toscrape.com仅爬8页无报错
解决Scrapy爬虫仅爬取8页的问题
嘿,我来帮你排查这个Scrapy爬虫只爬8页的问题!首先咱们先从你代码里的那个全局变量count = 8说起——这大概率是个坑!Scrapy是多线程异步爬取的,全局变量会被多个并发请求同时修改,很容易导致计数混乱,提前终止下一页的请求。
可能的问题原因
- 全局变量的并发冲突:你定义的
count是全局变量,在多请求并发时,多个parse函数会同时修改它的值,导致爬取到第8页就误触发了停止逻辑(如果你的代码里有相关判断的话)。 - 下一页链接提取错误:虽然quotes.toscrape.com的页面结构很规整,但如果你的XPath写得不对,可能在第8页之后提取不到下一页链接,导致爬取中断。
- settings配置限制:如果你的项目
settings.py里设置了CLOSESPIDER_PAGECOUNT = 8,那爬虫会严格只爬8页就停止。
修正后的代码示例
咱们把全局变量改成爬虫的实例属性,同时确保下一页链接提取正确:
import scrapy class QuotesSpiderSpider(scrapy.Spider): name = 'quotes_spider' allowed_domains = ['quotes.toscrape.com'] start_urls = ['http://quotes.toscrape.com/'] # 用实例属性存页数,避免全局变量的并发问题 current_page = 0 def parse(self, response): self.current_page += 1 self.logger.info(f"正在爬取第 {self.current_page} 页") # 提取并处理quote内容 quotes = response.xpath('//*[@class="quote"]') for quote in quotes: text = quote.xpath('.//*[@class="text"]/text()').get() author = quote.xpath('.//*[@class="author"]/text()').get() tags = quote.xpath('.//*[@class="tag"]/text()').getall() yield { 'text': text, 'author': author, 'tags': tags } # 正确提取下一页链接 next_page_href = response.xpath('//li[@class="next"]/a/@href').get() if next_page_href: # 用urljoin拼接绝对URL,避免相对路径问题 next_page_url = response.urljoin(next_page_href) yield scrapy.Request(url=next_page_url, callback=self.parse)
额外检查点
- 打开你的
settings.py,看看有没有设置CLOSESPIDER_PAGECOUNT、CLOSESPIDER_ITEMCOUNT这类限制爬取数量的配置,如果有,把它们注释掉或者调整到你需要的数值。 - 运行爬虫时可以打开日志(
scrapy crawl quotes_spider --logfile=spider.log),查看日志里是否有下一页请求的记录,以及是否有提取不到链接的提示。
这样修改后,你的爬虫应该能正常爬完quotes.toscrape.com的全部10页内容啦!
内容的提问来源于stack exchange,提问作者Vivek Kumar Sinha
相关产品推荐
相关产品推荐

