【问题标题】:Drop requests that include query string in Scrapy在 Scrapy 中删除包含查询字符串的请求
【发布时间】:2022-08-19 23:16:33
【问题描述】:

我是scrapy的新手,我遇到了一个复杂的案例。

我的问题是,有时我有像https://sitename.com/path2/?param1=value1&param2=value2 这样的链接,对我来说,查询字符串并不重要,我想从请求中删除它。
我的意思是网址的这一部分: ?param1=value1&param2=value2

经过一天的研究,我意识到这应该在 middlewares.py 文件(Downloader Middleware)(Source)中完成。因为要求和收据刮擦走这条路。
我试图编写一个代码,使请求和答案没有查询字符串,但我没有成功。
我的代码不会删除包含查询字符串的请求。
中间件.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 代码发布这些请求?并且不要进入Scrapy?
只是为了让你知道我将我的课程设置在settings.py

    标签: python web-scraping scrapy


    【解决方案1】:

    由于字符串是不可变的,因此您的代码不会更改请求中的任何内容。为了使您的代码正常工作,您必须做

    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
    

    【讨论】:

    • @Sardar 抱歉,我忘记了。我更新了答案
    • 如果您想忽略有查询的请求,您可以在中间件docs.scrapy.org/en/latest/topics/… 中提出 IgnoreRequest
    • 我在答案中添加了一个示例:)
    • 是的,您可以使用urlib.parse.urlparse,但如果它是最好的工具,我将编辑帖子以添加它
    • 我认为你可以做这样的事情,但我不推荐 >>> url = "example.com/why-should-we-drink-water?".strip("?") >>> len(url) != len(url_query_cleaner(url))
    猜你喜欢
    • 2014-09-06
    • 2020-01-29
    • 2020-11-19
    • 2018-02-04
    • 2011-05-14
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多