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

12次阅读

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

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

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

Scrapy 蜘蛛的执行起点由 start_urls 属性或自定义的 start_requests() 方法严格控制。若两者均未正确定义,Spider 将 完全不发起任何请求,导致看似“运行成功”实则零输出——这正是原代码中 scrapy crawl flipkart 无任何抓取结果的核心原因。

原代码中将起始 URL 定义为 urls = […],但 Scrapy 框架仅识别 start_urls(列表类型)或 start_requests()(生成器方法)。urls 是一个普通属性,对框架无意义,因此整个爬虫处于“静默挂起”状态。

✅ 正确做法是:将 urls 改为 start_urls,并确保其为列表类型。同时,需修正分页逻辑——原代码中 next_page 在类体顶层被静态计算(此时 page_no=2 已固化),导致所有后续请求均指向第 2 页,且无法动态递增。应将分页逻辑移入 parse() 方法内部,实现真正的翻页迭代。

以下是修复后的完整、可直接运行的 Spider 示例:

import scrapy  class FlipkartSpider(scrapy.Spider):     name = 'flipkart'     # ✅ 必须命名为 start_urls(Scrapy 内置识别)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(),}          # ✅ 动态生成下一页 URL(在 parse 中实时计算)current_page = response.url.split('page=')[-1]         current_page_num = int(current_page) if 'page=' in response.url else 1         next_page_num = current_page_num + 1          # 翻页上限建议设为 10(Flipkart 通常仅展示前几页有效结果)if next_page_num <= 10:             next_url = f"{response.url.split('&page=')[0]}&page={next_page_num}"             yield scrapy.Request(url=next_url, callback=self.parse)

⚠️ 重要注意事项

  • 动态渲染与反爬:Flipkart 大量依赖 JavaScript 渲染商品数据,且部署了 User-Agent 检测、IP 频率限制及验证码机制。上述 CSS 选择器仅适用于页面静态 HTML(可能已失效)。生产环境强烈建议配合 scrapy-splash 或切换至 Playwright/Selenium 进行无头浏览器渲染。
  • Selector 健壮性:Flipkart 频繁更新 DOM 结构(如 _2kHMtA、_4rR01T 等类名),需定期校验并使用更稳定的定位方式(如 data-id 属性或 XPath)。
  • 合规性提醒:请严格遵守 robots.txt(https://www.php.cn/link/4e707d76187a59849aa3ec1f2219a9aa)及《Flipkart 服务条款》,避免高频请求;商业用途务必获得官方授权。

总结:Scrapy 的 start_urls 是不可省略的启动契约,而非可选配置。掌握此基础机制,再结合动态分页、反爬适配与 Selector 维护,才能构建稳定可靠的电商数据采集流程。

text=ZqhQzanResources