Scrapy日志显示已爬取页面但无数据,项目运行异常求助
从你的描述和代码来看,核心问题出在选择器不准确,再加上一些可以优化的细节,导致爬虫无法抓取到有效数据。下面一步步分析并解决:
1. 最关键的错误:目标容器选择器错误
你的爬虫里用了 response.css('div.row') 来定位帖子条目,但实际页面中,div.row 是页面布局的通用容器(比如头部、底部的布局行),并不是单个帖子的容器。这就导致你循环的job_list里的元素根本没有你要抓取的子节点,自然无法生成有效Item。
修复方法:
替换成准确的帖子容器选择器。根据你说Scrapy Shell操作正常,你在Shell里应该是用了正确的父选择器,比如实际帖子条目对应的是 div.ipsStreamItem(对应页面里的每个帖子卡片)。修改爬虫里的这一行:
job_list = response.css('div.ipsStreamItem') # 替换原来的 div.row
2. ItemLoader 默认处理器的优化
你在循环里每次都设置 job_loader.default_output_processor=TakeFirst(),这其实可以更优雅地放到你的 MemberItem 类里,避免重复代码:
# 在 pubg/items.py 里修改 MemberItem import scrapy from scrapy.loader.processors import TakeFirst class MemberItem(scrapy.Item): Upload_Date = scrapy.Field(output_processor=TakeFirst()) Source = scrapy.Field(output_processor=TakeFirst()) Headline = scrapy.Field(output_processor=TakeFirst()) Content = scrapy.Field(output_processor=TakeFirst()) Vote = scrapy.Field(output_processor=TakeFirst())
这样爬虫里就可以删掉 job_loader.default_output_processor=TakeFirst() 这一行了。
3. 管道代码的简化优化
你用了大量的 try-except 来处理字段缺失,其实可以用Scrapy Item的get()方法来简化,代码更简洁易读:
class PubgPipeline(object): def process_item(self, item, spider): # 处理日期 item['Upload_Date'] = item.get('Upload_Date', 'N/A') # 处理来源链接 item['Source'] = item.get('Source', 'N/A') # 处理标题 item['Headline'] = item.get('Headline', 'N/A') # 处理内容并清理换行符 content = item.get('Content', 'N/A') if content != 'N/A': item['Content'] = ''.join(c for c in content if c not in '\r\t\n') # 处理投票数并清理换行符 vote = item.get('Vote', 'N/A') if vote != 'N/A': item['Vote'] = ''.join(c for c in vote if c not in '\r\t\n') return item
4. 潜在的反爬问题:请求头不一致
有时候Scrapy默认的User-Agent会被网站识别为爬虫,返回的页面结构和你在Scrapy Shell里看到的不一样(Shell的User-Agent更像浏览器)。可以在settings.py里设置浏览器级别的User-Agent:
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'
验证步骤
- 先在Scrapy Shell里测试新的选择器:
scrapy shell https://forums.pubg.com/leaderboard/
然后执行 response.css('div.ipsStreamItem'),确认能拿到所有帖子条目;再测试子选择器比如 div.ipsStreamItem time::text,确认能抓取到日期。
2. 修改爬虫代码后,运行爬虫并查看日志:
scrapy crawl pubgspider -o result.json
此时应该能看到正常的Item输出,导出的文件也会有数据了。
内容的提问来源于stack exchange,提问作者lucifer

