Scrapy CrawlSpider仅爬取4条数据问题排查求助
问题分析与解决方案
你的爬虫仅输出4条数据,核心原因集中在链接爬取逻辑、反爬应对以及内容提取逻辑这几个方面:
1. 链接提取规则存在缺陷
当前规则Rule(LinkExtractor(allow='detail'), callback='parse_item', follow=True)有两个关键问题:
- 匹配范围混乱:所有包含"detail"字符串的链接都会被抓取,其中混杂了大量非产品页的无效链接
- 缺失中间页面爬取:首页直接指向产品详情页的链接极少,网站的产品大多嵌套在分类页、列表页之后,你的规则没有跟进这些中间页面,自然无法获取到大量产品链接
2. 未适配网站反爬策略
O'Reilly Auto网站大概率有反爬机制:
- 会校验请求的
User-Agent,Scrapy默认UA容易被识别拦截 - 存在请求频率限制,短时间大量请求会被限制访问
- 部分产品列表依赖JavaScript动态加载,Scrapy默认无法解析这类内容
3. 详情页内容提取逻辑单一
你使用的CSS选择器div.pdp-header.product-name-wrap h1::text仅适配了部分产品页的结构,部分产品的名称可能用了不同的HTML标签,导致这部分数据被过滤。
修正后的代码示例
import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class ProductspiderSpider(CrawlSpider): name = "productspider" allowed_domains = ["oreillyauto.com"] start_urls = ["https://www.oreillyauto.com/"] # 配置反爬相关参数 custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'DOWNLOAD_DELAY': 2, # 设置请求延迟,降低被封风险 'COOKIES_ENABLED': True, 'LOG_LEVEL': 'DEBUG' # 开启调试日志,方便排查问题 } rules = ( # 跟进分类页链接,遍历所有产品分类 Rule(LinkExtractor(allow=r'/category/|/shop-by-category/'), follow=True), # 跟进搜索/列表页链接,获取分页内的产品链接 Rule(LinkExtractor(allow=r'/search/|/results/'), follow=True), # 精准匹配产品详情页,调用解析函数,不跟进详情页内的无关链接 Rule(LinkExtractor(allow=r'/detail/[\w-]+/'), callback='parse_item', follow=False), ) def parse_item(self, response): if response.status == 404: self.logger.warning(f'Page not found: {response.url}') return # 增加备选选择器,覆盖更多产品页结构 name = response.css('div.pdp-header.product-name-wrap h1::text').get() or \ response.css('h1.product-name::text').get() if name: yield {'name': name.strip(), 'product_url': response.url} else: self.logger.warning(f'No product name found at: {response.url}')
额外调试建议
- 使用
scrapy shell https://www.oreillyauto.com/测试链接提取器,确认LinkExtractor能正确抓取分类、列表页链接 - 如果网站有大量JS动态加载内容,可配合
scrapy-playwright渲染页面 - 查看Scrapy调试日志,检查是否存在请求被拦截、链接未匹配等异常情况
内容的提问来源于stack exchange,提问作者Oliver Musgrove
相关产品推荐
相关产品推荐

