在scrapy中设置压缩,就像cURL的--compressed开关

问题描述 投票:0回答:1

我正在尝试使用具有某种机器人保护功能的

scrapy
来抓取网站。 HTTP 请求需要使用特定的标头组合来发出。否则,请求会超时或被拒绝,并显示 403 Forbidden 错误代码。

我必须在

scrapy
中设置哪些选项对应于
--compressed
curl
标志?

此请求成功(在撰写本文时):

curl 'https://www.douglas.es/api/v2/stores?fields=FULL&pageSize=1000&sort=asc' \                                                                                                                                            (alltheplaces) 
  --compressed \
  -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8' \
  -H 'Accept-Language: en-US,en;q=0.8,de-DE;q=0.5,de;q=0.3'

没有选项

--compressed
的情况相同,会被拒绝,并显示“HTTP 错误 400。请求标头的大小太长。”

在浏览器中打开 URL 也可以。

如何发出与scrapy中的cURL命令相同的请求?

我试过这个:

  • 设置
    COMPRESSION_ENABLED
  • 像 cURL 命令一样设置自定义标头

但是请求被拒绝并出现 403 错误:

from scrapy import Request, Spider


class DouglasSpider(Spider):
    name = "douglas"
    user_agent = "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0"
    custom_settings = {"ROBOTSTXT_OBEY": False, "COMPRESSION_ENABLED": True}

    def start_requests(self):
        yield Request(
            f"https://www.douglas.es/api/v2/stores?fields=FULL&pageSize=1000&sort=asc",
            headers={
                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8",
                "Accept-Language": "en-US,en;q=0.8,de-DE;q=0.5,de;q=0.3",
            },
        )

我也尝试过切换 IP 或使用 VPN,以及清除 scrapy 的 HTTP 缓存,但似乎都没有什么区别。

web-scraping scrapy http-headers http-compression
1个回答
0
投票

curl --compressed
只是设置一个
Accept-Encoding
标头以及您的特定curl 版本支持的压缩器。 Scrapy 默认情况下也有类似的行为,因为默认情况下启用了
HttpCompressionMiddleware
,除了安装
brotli
zstandard
以获得更多受支持的压缩器之外,您不需要执行任何操作。

(请注意,这不太可能解决您原来的问题,因为它的原因不同,但它回答了您提出的问题,并且“如何发出与 scrapy 中的 cURL 命令相同的请求?”是一个更广泛的问题一般答案是“你不能”)

© www.soinside.com 2019 - 2024. All rights reserved.