Scrapy配置start_urls爬取文章运行报错如何修复
问题根因
手动访问正常但爬虫报错,核心是三个问题:
- Scrapy默认请求头携带
Scrapy版本标识,被网站基础反爬策略拦截,返回的不是正常的列表页内容,导致XPath匹配流程直接触发异常 - 列表页提取的文章链接是相对路径(无域名前缀),直接发起请求会访问无效地址
- 部分字段的XPath规则和详情页实际DOM结构不匹配,且未提取节点文本,就算请求成功也拿不到正确数据
修复方案
- 给爬虫配置模拟浏览器的请求头,绕过UA校验
- 对提取到的相对链接做域名拼接,生成合法的绝对访问地址
- 修正各字段XPath规则,补充文本提取逻辑
- 增加空值兜底,避免节点缺失时触发报错
修复后可正常运行的完整代码:
import scrapy from scrapy.crawler import CrawlerProcess class weeklymining(scrapy.Spider): name = 'weeklymining' # 配置模拟浏览器请求头,绕过基础反爬 custom_settings = { 'DEFAULT_REQUEST_HEADERS': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', } } start_urls = ['https://www.miningweekly.com/page/coal/page:'+str(x) for x in range(1,4)] def parse(self, response): # 提取所有文章详情页链接 for link in response.xpath('//*[@class="en-serif"]/a/@href'): article_url = response.urljoin(link.get()) yield scrapy.Request( url=article_url, callback=self.parse_item ) def parse_item(self, response): yield { # 修正XPath,补充/text()提取日期文本 'date': response.xpath('//*[@class="sml"]/p/span[1]/text()').get(default='').strip(), 'category': 'coal', # 修正标题XPath,匹配详情页h1节点 'title': response.xpath('//*[@class="article_title"]/h1/text()').get(default='').strip(), # 提取正文,过滤空文本 'text':''.join([x.get().strip() for x in response.xpath('//*[@id="article_content_container"]//p//text()') if x.get().strip()]) } if __name__ == '__main__': process = CrawlerProcess(settings={ 'FEED_URI': 'coal_article.json', 'FEED_FORMAT': 'json', 'LOG_LEVEL': 'INFO' }) process.crawl(weeklymining) process.start()
代码修改点说明
- 新增
custom_settings配置,替换默认Scrapy请求头为Chrome浏览器标识,同时配置基础Accept参数,模拟真实用户访问,绕过网站UA拦截 - 使用
response.urljoin()方法自动拼接提取到的相对链接和网站域名,避免访问无效地址 - 修正日期字段XPath,补充
/text()规则,直接提取日期文本而非整个span标签,同时增加空值兜底和去空格处理 - 修正标题字段XPath,匹配详情页实际的h1标题节点,原规则写的h2/a是列表页的标题匹配逻辑,不适用于详情页
- 正文提取逻辑增加空文本过滤,避免拼接大量无意义的空白字符
- 启动配置里增加了导出为json文件的设置,运行后可直接在同目录生成爬取结果文件,同时调整日志等级减少冗余输出
内容的提问来源于stack exchange,提问作者nomnomyang
相关产品推荐
相关产品推荐

