Scrapy爬虫无法爬取目标URL但Scrapy Shell成功,爬Craigslist遇连接丢失错误
解决Scrapy爬取Craigslist时的ConnectionLost错误
这个ConnectionLost错误我在爬取Craigslist时遇到过好几次,基本都是反爬机制拦截或者请求配置太“生硬”导致的。给你几个针对性的解决思路:
1. 伪装请求头,模拟真实浏览器
Craigslist会严格检查请求的User-Agent,Scrapy默认的UA很容易被识别。你可以在settings.py里配置完整的请求头:
DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' }
选一个主流浏览器的UA,别用Scrapy自带的Scrapy/2.x.x (+https://scrapy.org)。
2. 放慢请求速度,避免触发频率限制
频繁的请求会被Craigslist直接断开连接。在settings.py里添加延迟和自动限速配置:
# 基础请求延迟(秒) DOWNLOAD_DELAY = 3 # 开启自动限速,根据响应速度调整请求间隔 AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_START_DELAY = 2 AUTOTHROTTLE_MAX_DELAY = 5
别贪快,Craigslist对爬虫的容忍度很低,3-5秒的间隔比较稳妥。
3. 使用代理IP规避IP封禁
如果你的IP已经被Craigslist标记,换代理是最直接的办法。可以在Spider的请求里添加代理:
def start_requests(self): url = 'https://tampa.craigslist.org/search/jjj?query=bookkeeper' yield scrapy.Request( url, meta={'proxy': 'http://your-proxy-ip:port'}, callback=self.parse )
也可以在settings.py里配置全局代理中间件,批量使用代理池。
4. 调整连接超时和TCP配置
有时候连接丢失是因为超时时间太短,或者TCP连接没有保持。在settings.py里添加:
# 延长下载超时时间 DOWNLOAD_TIMEOUT = 15 # 开启TCP保活,避免连接被主动断开 TCP_KEEPALIVE_ENABLED = True
5. 先手动验证请求是否正常
用curl命令测试目标URL,看看能不能正常返回内容:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" https://tampa.craigslist.org/search/jjj?query=bookkeeper
如果curl都拿不到内容,那可能是地区限制或者Craigslist临时屏蔽了这个搜索词;如果curl正常,那就是你的Scrapy配置有问题。
试试这些方法,我之前爬Craigslist的时候,加了请求头和延迟就解决了类似的连接丢失问题。要是还不行,再考虑升级代理池或者添加Cookie模拟登录(不过Craigslist一般不需要登录就能爬搜索页)。
内容的提问来源于stack exchange,提问作者Arindam Ghosh
相关产品推荐
相关产品推荐

