关于Python中Scrapy框架的allowed_domains失效问题如何解决
RT,我这边爬虫类继承的是基础 spider:
from scrapy.spiders import Spider
class DSpider(Spider):
然后也设置了:
allowed_domains=["baidu.com"]
结果发现,爬虫仍然会递归爬到其他网站上的链接,我这边肯定不是链接跳转过去的,是直接爬到其他网站了。 网上找了下原因,说我得去启用 OffsiteMiddleware,当然具体怎么设置值没找到。
class scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware
然后我看了下,我自己胡乱加了下配置:
SPIDER_MIDDLEWARES = {
'DomainSpider.middlewares.MyCustomSpiderMiddleware': 543,
'scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware': None,
}
结果报错:
exceptions.ImportError: No module named middlewares
似乎启用这个,我还得去建一个 middlewares.py ,然后往里面填充一些不必要的配置。 感觉这样很麻烦,不知道我是否走错弯路了,还请大佬们指点一下~ 非常感激!!!
关于Python中Scrapy框架的allowed_domains失效问题如何解决
看文档,你这个填 None 就是不启用啊,貌似类的导入位置也不对
我最近也遇到过allowed_domains失效的问题,排查后发现主要是这几个原因。
1. 最常见的坑:URL格式不匹配
allowed_domains检查的是URL的netloc部分(协议+主机名)。如果你的起始URL是https://www.example.com/page,那么配置应该是:
allowed_domains = ['www.example.com'] # 正确
# allowed_domains = ['example.com'] # 错误!少了www
# allowed_domains = ['https://www.example.com'] # 错误!不能带协议
2. 重定向到其他域名
如果目标网站做了301/302重定向到其他域名,Scrapy会跟随重定向,这时allowed_domains就失效了。可以在start_requests中设置dont_filter=False:
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url,
callback=self.parse,
dont_filter=False, # 启用域名过滤
meta={'dont_redirect': False})
3. 子域名处理
allowed_domains支持通配符,但要注意语法:
allowed_domains = ['.example.com'] # 匹配所有子域名:www.example.com, blog.example.com等
allowed_domains = ['example.com'] # 只匹配精确域名,不包含子域名
4. 检查中间件干扰
有些自定义中间件可能会绕过域名检查。检查你的settings.py:
# 确保这些中间件没有修改请求
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.offsite.OffsiteMiddleware': 100, # 这是负责域名过滤的中间件
}
调试建议:在parse方法开头加个打印,看看实际访问的域名:
def parse(self, response):
print(f"实际访问域名: {response.url}")
# ... 你的解析代码
如果还是不行,建议检查Scrapy日志中的DEBUG: Filtered offsite request信息。
总结:仔细检查URL格式和重定向问题。
SPIDER_MIDDLEWARES = 那行写在了 setting 里面,我这儿没有引入 middlewares 是没有生效的,不知道 allowed_domains 需要在啥时候生效,我看别人的好像也没提要加 middlewares。
真的没有大佬能解答一下? so 尴尬。。我后来以为是版本原因,升级了 scrapy 还是这样,

