我正在尝试使用具有某种机器人保护功能的
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
但是请求被拒绝并出现 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 缓存,但似乎都没有什么区别。
curl --compressed
只是设置一个 Accept-Encoding
标头以及您的特定curl 版本支持的压缩器。 Scrapy 默认情况下也有类似的行为,因为默认情况下启用了 HttpCompressionMiddleware
,除了安装 brotli
和 zstandard
以获得更多受支持的压缩器之外,您不需要执行任何操作。
(请注意,这不太可能解决您原来的问题,因为它的原因不同,但它回答了您提出的问题,并且“如何发出与 scrapy 中的 cURL 命令相同的请求?”是一个更广泛的问题一般答案是“你不能”)