
本文详解 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 维护,才能构建稳定可靠的电商数据采集流程。










