You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:54:06