使用Scrapy CrawlSpider爬取rusplast.com时数据未解析,求排查
问题分析与修正
你的爬虫代码存在以下几个关键问题:
拼写错误导致域名过滤失效
代码里的allowed_domailns是拼写错误,正确属性名应为allowed_domains。这个错误会让Scrapy的域名过滤机制失效,导致爬虫无法正确识别允许爬取的域名,进而无法获取目标页面数据。正则表达式未使用原始字符串,匹配规则失效
两个LinkExtractor的allow和deny参数里的正则表达式未使用原始字符串(r''),会导致转义字符失效。比如\d在普通字符串里无法被正则引擎正确识别为数字匹配,/?BRAND也无法正确匹配带参数的URL。第一个Rule逻辑冗余,干扰正常爬取
第一个Rule仅设置了allow和deny但未指定callback,默认会跟随匹配到的链接,但这个规则匹配范围过宽(只要包含abs-plastic的URL都会被跟随),会爬取大量无关页面,甚至覆盖第二个Rule的匹配逻辑。CSS选择器无容错处理,易引发报错
如果目标页面的h1标签不带有header类,response.css('h1.header::text').get()会返回None,调用.strip()时直接触发报错,导致数据解析失败。
修正后的代码
import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class RusplastSpider(CrawlSpider): name = 'rusplast_crawl' allowed_domains = ['rusplast.com'] # 修正拼写错误 start_urls = ['https://rusplast.com/catalog/abs-plastic/'] rules = ( # 直接匹配产品详情页URL,指定回调函数并允许跟随 Rule(LinkExtractor(allow=r'/abs-plastic/\d+/'), callback='parse_items', follow=True), # 若需处理分页,可添加如下规则(按需启用) # Rule(LinkExtractor(allow=r'/abs-plastic/\?PAGEN_1=\d+'), follow=True), ) def parse_items(self, response): # 增加容错处理,避免因元素不存在报错 product_name = response.css('h1.header::text').get() yield { 'Name': product_name.strip() if product_name else '无产品名称', }
额外建议
- 用Scrapy Shell测试选择器有效性:运行
scrapy shell https://rusplast.com/catalog/abs-plastic/[具体产品ID]/,输入response.css('h1.header::text').get()验证是否能获取到产品名称。 - 若网站有反爬机制,在
settings.py中添加USER_AGENT模拟真实浏览器请求。
内容的提问来源于stack exchange,提问作者Vladislav F.
相关产品推荐
相关产品推荐

