悠悠楠杉
Scrapy爬虫返回空数组?5个排查思路与解决方案
01/18
正文:
当你满怀期待运行Scrapy爬虫,却发现items.py里空空如也时,先别急着怀疑人生。以下是经过实战验证的排查路径,帮你快速定位问题根源。
1. 检查请求是否真正成功
空数组往往意味着爬虫根本没拿到目标数据。首先在parse方法中加入调试代码:
python
def parse(self, response):
print(response.status) # 必须返回200
print(response.text[:500]) # 查看原始HTML片段
# 或保存到本地排查
with open('debug.html', 'w', encoding='utf-8') as f:
f.write(response.text)
如果status不是200,可能是:
- 目标网站需要登录(检查Cookies)
- 触发了反爬(尝试添加USER_AGENT和Referer)
- 请求URL拼写错误(打印response.url确认)
2. XPath/CSS选择器失效
即使响应码200,错误的解析规则也会导致空结果。例如:
python
# 错误示范:动态加载内容无法直接选取
title = response.xpath('//div[@class="title"]/text()').get()
# 解决方案:
# 1. 改用浏览器复制绝对XPath(右键->检查->Copy XPath)
# 2. 查看网页源码确认元素是否存在于静态HTML中
# 3. 尝试更宽松的选择器,如://*[contains(@class,"title")]3. 动态加载数据捕获
现代网站普遍使用Ajax或JavaScript渲染数据。解决方案:
- 方案A:在开发者工具→Network中查找XHR请求,直接模拟API调用
- 方案B:启用Scrapy+Selenium组合(需安装scrapy-selenium中间件)
python
from selenium.webdriver import ChromeOptions
from scrapy_selenium import SeleniumRequest
class DynamicSpider(scrapy.Spider):
def start_requests(self):
yield SeleniumRequest(
url="https://example.com",
wait_time=3,
screenshot=True # 可保存截图辅助调试
)4. 反爬机制突破
高频访问或特征明显的请求头会触发反爬:
- 随机UA和代理IP池(推荐scrapy-fake-useragent库)
- 降低下载延迟:DOWNLOAD_DELAY = 2
- 启用Cookies中间件:COOKIES_ENABLED = True
5. 数据校验与日志增强
在Pipeline阶段添加验证逻辑,避免空数据入库:
python
class ValidatePipeline:
def process_item(self, item, spider):
if not item.get('title'):
spider.logger.warning(f"空数据丢弃:{item}")
raise DropItem()
return item终极调试技巧:在Scrapy Shell中实时测试(命令行输入scrapy shell "url"),逐步验证每个选择器。
通过这五层过滤,你的爬虫将告别空数组困境。记住,优秀的爬虫工程师不是不会遇到问题,而是掌握了系统化的排查方法论。
