Scrapy请求URL与响应URL不一致问题求助及解决方法咨询
我来帮你拆解这个问题的根源,以及对应的解决办法:
问题根源解析
首先要注意:你请求URL里的#q:jaren+60是URL锚点(fragment)——这部分内容是给浏览器解析用的,不会被发送到服务器。所以服务器返回的响应自然不会包含这个锚点,这就是你看到响应URL缺失查询部分的核心原因。
你添加的meta={'dont_redirect': True}不起作用,是因为这个问题根本和重定向无关:服务器从始至终都没收到过这个锚点参数,自然也不会在响应里返回它。
另外,这个网站的搜索逻辑大概率是依赖JS读取锚点后再加载对应内容,或者它实际支持的查询参数格式是标准的GET参数(比如?q=jaren+60),而非锚点形式。
具体解决办法
1. 改用标准GET查询参数构造URL
把锚点里的查询内容转换成标准的URL查询字符串形式,比如将:https://www.marktplaats.nl/l/huis-en-inrichting/kasten-dressoirs/p/2/#q:jaren+60
修改为:https://www.marktplaats.nl/l/huis-en-inrichting/kasten-dressoirs/p/2/?q=jaren+60
你可以先在Scrapy Shell里测试这个修正后的URL:
scrapy shell "https://www.marktplaats.nl/l/huis-en-inrichting/kasten-dressoirs/p/2/?q=jaren+60"
之后查看response.url,会发现它和请求URL完全一致,查询参数被正确保留了。
2. 调整爬虫代码中的URL生成逻辑
在构造下一页URL时,不要用锚点传递参数,而是用标准的查询字符串拼接方式。可以借助urllib.parse模块来更规范地生成URL:
from urllib.parse import urlencode, urljoin import scrapy class MarktplaatsSpider(scrapy.Spider): name = 'marktplaats' # ... 其他爬虫初始化代码 ... def parse(self, response): # ... 解析当前页面广告信息的代码 ... # 构造带查询参数的下一页URL示例 base_next_page = "https://www.marktplaats.nl/l/huis-en-inrichting/kasten-dressoirs/p/2/" query_params = {'q': 'jaren+60'} next_page_url = urljoin(base_next_page, '?' + urlencode(query_params)) yield scrapy.Request(next_page_url, callback=self.parse)
3. 确认网站实际请求逻辑(可选)
如果上面的方法效果不佳,建议打开浏览器的开发者工具(Network面板),访问目标页面时观察实际发送的请求——看看网站是否通过AJAX接口加载搜索结果,找到真正携带查询参数的API接口URL,直接用这个URL构造Scrapy请求即可。
内容的提问来源于stack exchange,提问作者Hans

