删除Scrapy中包含查询字符串请求

kr98yfug  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(110)

我是新来的,我遇到了一个复杂的情况。
我的问题是,有时我有像https://sitename.com/path2/?param1=value1&param2=value2的链接,对我来说,查询字符串并不重要,我想从请求中删除它。
我指的是这部分网址:?param1=value1&param2=value2
经过一天的研究,我意识到这应该在middlewares.py文件(Downloader Middleware)(Source)中完成,因为Scrapy中的请求和回执都经过这个路径。
我试图编写一个代码,使请求和应答不带查询字符串,但我没有成功。
我代码不删除包含查询字符串请求
middlewares.py:

from w3lib.url import url_query_cleaner

class CleanUrlAgentDownloaderMiddleware:

    def process_response(self, request, response, spider):
        url_query_cleaner(response.url)
        return response

    def process_request(self, request, spider):
        url_query_cleaner(request.url)

我怎样才能使用w3lib.url库或Python代码来释放这些请求呢?
只是想让你知道我在settings.py中设置了我的类

68bkxrlz

68bkxrlz1#

因为字符串是不可变的,所以你的代码不会改变请求中的任何内容。

from w3lib.url import url_query_cleaner

class CleanUrlAgentDownloaderMiddleware:
    # No need for process response since it will have the same 
    # url as the request

    def process_request(self, request, spider):
        if "?" in request.url:
            return request.replace(url=url_query_cleaner(request.url))

或者,如果你想忽略在他们的url中有查询的请求,你可以

from scrapy.exceptions import IgnoreRequest
from urllib.parse import urlparse

class IgnoreQueryRequestMiddleware:
    def process_request(self, request, spider):
        if urlparse(request.url).query:
            raise IgnoreRequest

相关问题