
本文详解 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/ 目录下。