运行scrapy crawl Admission命令出现Filtered offsite request报错如何解决
Scrapy offsite请求拦截报错解决方案
报错原因
Scrapy的allowed_domains白名单机制会自动拦截所有不在域名白名单内的请求,你触发报错的核心问题是手动拼接URL时域名拼写错误,和配置的白名单不匹配:
- 配置的白名单域名:
www.worldometers.info(正确拼写,含字母e) - 拼接的请求域名:
www.worldomets.info(漏写字母e,不属于白名单范围)
修复方案
方案1(推荐):修正域名拼写+使用自动拼接工具
直接用Scrapy内置的response.urljoin()方法拼接相对路径,完全避免手动写域名导致的拼写错误,同时补充国家名称打印逻辑,满足你的需求:
import scrapy class AdmissionsSpider(scrapy.Spider): name = 'Admission' allowed_domains = ["www.worldometers.info"] start_urls = ['https://www.worldometers.info/population/countries-in-asia-by-population/'] def parse(self, response): countries=response.xpath("//td/a") for country in countries: name=country.xpath(".//text()").get() # 打印抓取到的国家名称 print(name) links=country.xpath(".//@href").get() # 自动拼接绝对URL,无需手动写域名 absolute_url = response.urljoin(links) yield scrapy.Request(url=absolute_url)
方案2(临时兼容):关闭请求过滤
如果确实需要请求白名单外的域名,可在构造Request时添加dont_filter=True参数,关闭当前请求的域名校验:
yield scrapy.Request(url=absolute_url, dont_filter=True)
内容的提问来源于stack exchange,提问作者Muhammad Zahid
相关产品推荐
相关产品推荐

