如何用单个Scrapy爬虫实现多页商品爬取 运行无输出如何解决
Scrapy爬虫运行异常排查与修复方案
你遇到的问题由多个代码错误共同导致,逐一说明如下:
- 核心入口方法拼写错误
Scrapy规定的初始请求入口方法名为start_requests,你的代码中误写为start_reqeust(字母u和e顺序颠倒)。由于Scrapy无法识别自定义的错误命名方法,且你未定义默认的start_urls属性,爬虫启动后没有生成任何请求,直接结束,这是爬取0页、无日志文件生成的根本原因。
修复方式:将方法名修正为start_requests即可。 - 下一页请求参数类型错误
你通过列表筛选得到的next_page_url是列表类型,而response.follow方法的第一个入参要求是单个URL字符串,直接传入列表会触发请求报错,无法正常跳转下一页。
修复方式:先判断筛选后的列表非空,再取列表的第一个元素作为下一页URL传入。 - 页码提取逻辑健壮性不足
直接取URL最后一位作为当前页码的逻辑,在页码大于等于10(URL参数为p=10等多位数)时会完全失效,甚至触发int类型转换报错。建议直接通过分页元素的属性定位下一页链接,无需自行计算页码。
修复后完整可运行代码
import scrapy class QuotesSpider(scrapy.Spider): name = "acfc_spider" # 可选:添加请求头伪装浏览器,避免被反爬拦截 custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } # 修正方法名 def start_requests(self): urls =[ "https://www.acfc.com.vn/nam/promotion.html?p=2", "https://www.acfc.com.vn/nu/promotion.html?p=1", "https://www.acfc.com.vn/outlet.html?p=1", "https://www.acfc.com.vn/tre-em/khuyen-mai.html?p=1" ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) # 爬取商品详情 def parse_product_detail(self, response): with open('detail_product.txt', 'a', encoding='utf-8') as wr: wr.write(f'Crawled this detail product with URL {response.request.url}\n') # 解析列表页 def parse(self, response): with open('general_product.txt', 'a', encoding='utf-8') as wr: wr.write(f'{response.request.url}\n') # 提取当前页所有商品链接 list_of_product = response.css("li.item.product.product-item a::attr(href)").getall() for product_url in list_of_product: yield scrapy.Request(url=product_url, callback=self.parse_product_detail) # 更健壮的下一页提取逻辑:直接定位下一页按钮 next_page_url = response.css("li.item.pages-item-next a::attr(href)").get() if next_page_url: yield response.follow(next_page_url, self.parse)
补充优化建议
- 写文件时指定
encoding='utf-8'避免中文乱码 - 可直接使用Scrapy内置的Feed导出功能,无需手动操作IO写入文件,代码更简洁
- 可通过配置
DOWNLOAD_DELAY设置请求间隔,避免触发站点反爬策略
内容的提问来源于stack exchange,提问作者Chau Loi
相关产品推荐
相关产品推荐

