Scrapy中如何移除请求URL中的Query String?
解决Scrapy移除请求URL中Query String的问题
你的代码问题在于没有将url_query_cleaner处理后的URL赋值回请求对象,而且错误地在process_response中处理响应URL(这时候请求已经发送,修改响应URL毫无意义)。正确的做法是在请求发送前的process_request阶段修改请求的URL。
方法1:使用w3lib.url.url_query_cleaner
url_query_cleaner是纯函数,它不会修改传入的URL字符串,而是返回处理后的新URL。你需要将这个新URL赋值给request.url,才能真正修改请求的目标地址。
修改后的middlewares.py代码:
from w3lib.url import url_query_cleaner class CleanUrlAgentDownloaderMiddleware: def process_request(self, request, spider): # remove_all=True 表示移除所有Query参数,直接去掉?及后面的内容 cleaned_url = url_query_cleaner(request.url, remove_all=True) if cleaned_url != request.url: # 将处理后的URL赋值给请求对象 request.url = cleaned_url # 返回None,让Scrapy继续处理修改后的请求
方法2:手动解析URL(无需依赖w3lib)
如果不想用w3lib,可以用Python标准库urllib.parse手动处理URL:
from urllib.parse import urlparse, urlunparse class CleanUrlAgentDownloaderMiddleware: def process_request(self, request, spider): # 解析URL各部分 parsed = urlparse(request.url) # 重构URL,将query部分设为空字符串 cleaned_url = urlunparse(parsed._replace(query='')) if cleaned_url != request.url: request.url = cleaned_url
关键注意事项
- 中间件优先级:确保在
settings.py中正确启用中间件,设置合适的优先级(数字越小,中间件越先执行):DOWNLOADER_MIDDLEWARES = { '你的项目名.middlewares.CleanUrlAgentDownloaderMiddleware': 100, } - 避免重复处理:添加
cleaned_url != request.url的判断,避免对已经没有Query String的URL做无效修改。
内容的提问来源于stack exchange,提问作者Sardar
相关产品推荐
相关产品推荐

