如何正确使用 Scrapy 爬取 Flipkart 商品数据(避免无响应问题)

2次阅读

如何正确使用 Scrapy 爬取 Flipkart 商品数据(避免无响应问题)

本文详解 scrapy 爬虫无法启动的根本原因——缺失 start_urls 或 start_requests(),并提供可运行的修复代码、分页逻辑优化及反爬注意事项。

本文详解 scrapy 爬虫无法启动的根本原因——缺失 start_urls 或 start_requests(),并提供可运行的修复代码、分页逻辑优化及反爬注意事项。

Scrapy 框架要求 Spider 类必须显式声明初始请求入口,否则爬虫将静默退出、不发起任何 http 请求——这正是原代码“运行无报错但完全不抓取”的核心原因。原代码中定义了 urls = […],但 Scrapy 仅识别标准属性 start_urls(字符串列表)或自定义方法 start_requests()。未匹配该约定时,parse() 方法永远不会被调用,后续所有 CSS 选择器和分页逻辑均失效。

✅ 正确写法:使用 start_urls 启动爬虫

只需将 urls 改为 start_urls,Scrapy 即自动为每个 URL 创建 Request 并交由 parse() 处理:

import scrapy  class FlipkartSpider(scrapy.Spider):     name = 'flipkart'     # ✅ 关键修正:必须命名为 start_urls     start_urls = [         'https://www.flipkart.com/televisions/pr?sid=ckf%2Cczl&p[]=facets.brand%255B%255D%3DMi&otracker=categorytree&p[]=facets.serviceability[]%3Dtrue&p[]=facets.availability%255B%255D%3DExclude%2BOut%2Bof%2BStock&otracker=nmenu_sub_TVs%20%26%20Appliances_0_Mi'     ]      def parse(self, response):         # 提取当前页商品         for product in response.css("div._2kHMtA"):             yield {                 'name': product.css("div._4rR01T::text").get(),                 'price': product.css('div._30jeq3._1_WHN1::text').get(),                 'rating': product.css("div._3LWZlK::text").get(),             }          # ✅ 安全分页:检查下一页是否存在,避免硬编码页码         next_page_link = response.css('a._1LKTO3::attr(href)').get()         if next_page_link:             yield response.follow(next_page_link, callback=self.parse)

? 为什么原分页逻辑失败?
原代码在类体中预计算 next_page(page=2),但该变量在 Spider 实例化时即固化,无法随每次 parse() 调用动态更新;且未校验翻页链接是否真实存在,易导致 404 或无限重试。

⚠️ 重要注意事项

  • Flipkart 反爬严格:直接请求大概率返回 403 Forbidden 或验证码页面。生产环境必须添加:
    • 合理 DOWNLOAD_DELAY(如 1.5 秒)
    • 随机 User-Agent(通过 scrapy-user-agents 中间件或自定义 headers)
    • 代理池支持(避免 IP 封禁)
  • HTML 结构易变:Flipkart 频繁更新 CSS 类名(如 _2kHMtA、_4rR01T)。建议:
    • 使用更稳定的定位方式(如 data-id 属性、XPath 路径)
    • 在 parse() 中添加日志验证选择器有效性:
      self.logger.info(f"Found {len(response.css('div._2kHMtA'))} products")
  • 遵守 robots.txt:访问 https://www.flipkart.com/robots.txt 可见其明确禁止 /search、/pr 等路径的爬取。商业用途需获得书面授权。

✅ 总结

问题点 修复方案
无初始请求 urls → start_urls
分页逻辑错误 改用 response.css(…).get() 动态提取下一页链接
缺乏反爬适配 添加 DOWNLOAD_DELAY、User-Agent 轮换、错误重试机制
结构脆弱 增加选择器存在性校验与日志监控

运行命令保持不变:

scrapy crawl flipkart -o products.json

确保先通过 scrapy startproject myproject 初始化项目,并将 Spider 放入 myproject/spiders/ 目录下。

text=ZqhQzanResources