使用Scrapy 1.5.0与Python 2.7.14处理URL时遇爬虫错误求解决
常见Scrapy 1.5.0 + Python 2.7.14 URL处理错误及解决方案
由于你暂时没有提供FootLockerSpider的具体代码和完整错误信息,我先整理了几种这个环境下高频出现的URL相关问题及修复方案,你可以对照排查:
1. URL格式不合法(缺失协议、含非法字符)
典型错误表现
会抛出ValueError: Invalid URL,或者被Scrapy的OffsiteMiddleware拦截,提示Filtered offsite request to xxx。
修复方案
- 确保所有请求URL包含完整协议头(
http://或https://),比如不要写www.footlocker.com,必须写https://www.footlocker.com。 - 对含特殊字符的URL做编码处理,用Python 2.7的
urllib.quote()方法:import urllib raw_url = "https://www.footlocker.com/search?q=shoe size 10" # 保留URL中的关键分隔符,只编码特殊字符 encoded_url = urllib.quote(raw_url, safe=':/?=&') yield scrapy.Request(encoded_url, callback=self.parse)
2. 相对URL未正确拼接为绝对URL
典型错误表现
请求发送到无效地址(比如把/product/123拼成了your-spider-domain.com/product/123),或者抛出Missing scheme in request url错误。
修复方案
用Scrapy自带的response.urljoin()方法拼接:
def parse(self, response): relative_url = response.css('a.product-link::attr(href)').extract_first() absolute_url = response.urljoin(relative_url) yield scrapy.Request(absolute_url, callback=self.parse_product)
或者直接使用response.follow()(Scrapy 1.5已支持),它会自动处理相对URL:
def parse(self, response): yield response.follow(response.css('a.product-link::attr(href)').extract_first(), callback=self.parse_product)
3. Python 2.7字符串编码问题导致URL乱码
典型错误表现
URL含中文/非ASCII字符时出现乱码,请求返回404或被服务器拒绝。
修复方案
Python 2.7中区分str和unicode类型,处理URL时先转为unicode再编码为UTF-8:
# 示例:处理含中文的搜索关键词 search_keyword = u"篮球鞋" encoded_keyword = search_keyword.encode('utf-8') url = "https://www.footlocker.com/search?q=" + urllib.quote(encoded_keyword) yield scrapy.Request(url, callback=self.parse_search)
4. 重定向处理异常
典型错误表现
请求被多次重定向导致超时,或Scrapy无法自动处理重定向返回错误状态码。
修复方案
在settings.py中调整重定向配置:
# 设置最大允许重定向次数 REDIRECT_MAX_TIMES = 5 # 确保重定向中间件启用(默认启用,若被禁用需开启) DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600, }
如果需要手动处理重定向,可以在请求中添加meta参数禁止自动重定向:
yield scrapy.Request(url, callback=self.handle_redirect, meta={'dont_redirect': True})
如果你能补充FootLockerSpider的代码片段和完整错误栈,我可以给出更精准的修复建议。
内容的提问来源于stack exchange,提问作者traiantomescu
相关产品推荐
相关产品推荐

