Scrapy 如何将浏览器导出的 cURL 命令转换为 Request?Request.from_curl 使用指南

发布时间:2026/9/15 14:37:02
Scrapy 如何将浏览器导出的 cURL 命令转换为 Request?Request.from_curl 使用指南
Scrapy 如何将浏览器导出的 cURL 命令转换为 RequestRequest.from_curl 使用指南【免费下载链接】scrapyScrapy, a fast high-level web crawling scraping framework for Python.项目地址: https://gitcode.com/GitHub_Trending/sc/scrapy在爬虫开发中有些请求无法用简单的 URL 直接构造页面内容需要带特定headers、cookies才能正确返回或者请求方法、请求体都不是默认的 GET。此时可以借助浏览器的开发者工具把请求导出为 cURL 命令再用 Scrapy 提供的Request.from_curl类方法把整条 cURL 命令转换成等价的Request对象直接交给 spider 发出。这条路径的完整场景是浏览器 Network 面板复制 cURL →Request.from_curl生成请求 → 在 spider 中 yield 验证响应。本文基于 Scrapy 仓库内的文档与源码说明转换规则、验证方式和已知限制。从浏览器导出 cURL 命令前置条件是能在浏览器开发者工具中定位到目标请求。以 Firefox 为例其他浏览器概念相同打开开发者工具的Network面板点击Persist Logs启用持久化日志否则每次页面跳转后日志会被清空重新加载页面找到目标请求例如返回 JSON 数据的那一条右键该请求选择以 cURL 格式复制命令。复制得到的是一条完整的curl命令行包含 URL、-H头、-bcookie、-d请求体、-X方法等参数。下面在 Python 环境中把它交给 Scrapy。用 Request.from_curl 生成 Requestfrom_curl是scrapy.Request的类方法定义见 scrapy/http/request/init.py接收一个包含 cURL 命令的字符串填充 HTTP 方法、URL、headers、cookies 和 body 五个部分。Scrapy 官方文档使用浏览器开发者工具抓取的指南给出的示例from scrapy import Request request Request.from_curl( curl https://quotes.toscrape.com/api/quotes?page1 -H User-Agent: Mozil la/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0 -H Acce pt: */* -H Accept-Language: ca,en-US;q0.7,en;q0.3 --compressed -H X -Requested-With: XMLHttpRequest -H Proxy-Authorization: Basic QFRLLTAzM zEwZTAxLTk5MWUtNDFiNC1iZWRmLTJjNGI4M2ZiNDBmNDpAVEstMDMzMTBlMDEtOTkxZS00MW I0LWJlZGYtMmM0YjgzZmI0MGY0 -H Connection: keep-alive -H Referer: http ://quotes.toscrape.com/scroll -H Cache-Control: max-age0 )得到的request与手写scrapy.Request(url..., headers..., cookies...)等价可以直接在 spider 的回调里yield。from_curl还支持两类参数ignore_unknown_options默认True遇到不认识的 cURL 选项时默认只发出Unrecognized options: ...警告并继续转换传ignore_unknown_optionsFalse则抛出ValueError。额外关键字参数与Request类相同的构造参数如callback、meta可以直接传入并且优先于 cURL 命令中的同名值——传入的值会覆盖 cURL 解析出的值。如果只需要查看 cURL 命令对应的Request构造参数字典而不直接生成对象可以用同源的底层函数scrapy.utils.curl.curl_to_request_kwargs它返回{method, url, headers, cookies, body}字典from scrapy.utils.curl import curl_to_request_kwargs kwargs curl_to_request_kwargs( curl http://example.org/ -b a1; b2 ) # {method: GET, url: http://example.org/, cookies: {a: 1, b: 2}}这个返回值来自仓库测试 tests/test_utils_curl.py是文档化的转换结果示例。转换规则cURL 参数如何落到 Request解析逻辑集中在 scrapy/utils/curl.py行为如下均与 tests/test_utils_curl.py 中的测试用例一致cURL 部分转换结果命令首词必须以curl开头否则抛出ValueErrorA curl command must start with curlURL填入url若 URL 没有 scheme自动补http://curl 本身也这样处理-X/--request填入method默认GET-d/--data/--data-raw填入body出现 data 但未指定-X时method变为POST多个-d与 curl 行为一致用合并成一个 body而不是只保留最后一个-d $...形式bash 的$字符串前缀会被剥离按原始内容合并-H/--header填入headers其中Cookie:头单独拆进cookies-b/--cookie支持keyvalue; key2value2键值对形式填入cookies若值是 cookie 文件名不含Scrapy 会忽略-u/--user转为Authorization头Basic 认证--compressed、-s/--silent、-v/--verbose、-#/--progress-bar被视为安全项直接忽略不触发警告其他未知选项默认触发Unrecognized options: ...警告ignore_unknown_optionsFalse时抛ValueError例如一条带认证的 PATCH 请求kwargs curl_to_request_kwargs( curl https://example.com/api/fake -u username:password -H Content-Type: application/json -X PATCH -d {\key\: \value\} ) # {method: PATCH, url: https://example.com/api/fake, # headers: [..., (Content-Type, application/json), (Authorization, ...)], # body: {key: value}}上例结构参照 tests/test_utils_curl.py 中test_patch的断言。验证转换结果有两条互相独立的路径可以核对请求是否正确。1. 用to_curl反向检查。Scrapy 2.18.0 起提供了Request.to_curl()方法它是from_curl的逆操作见 scrapy/http/request/init.py 和 docs/news.rst。把生成的请求转回 cURL 字符串对比方法、URL、头、cookie 是否保留request Request.from_curl(curl https://example.org/ -b a1; b2) print(request.to_curl())2. 在真实爬取中确认。把转换后的请求放进 spider 发出观察响应import scrapy from scrapy import Request class FromCurlSpider(scrapy.Spider): name from_curl def start_requests(self): request Request.from_curl( curl https://quotes.toscrape.com/api/quotes?page1 -H Accept: */* ) request.callback self.parse_api yield request def parse_api(self, response): self.logger.info(status%s, response.status) data response.json() for quote in data[quotes]: yield {quote: quote[text]}quotes.toscrape.com/api/quotes?page1是 Scrapy 文档在开发者工具教程中使用的示例地址响应是包含quotes列表的 JSON 对象——能按上面parse_api解析出内容即说明请求构造正确。对于需要登录态的接口同样把浏览器复制的 cURL含Cookie头或-b参数交给from_curl在响应中确认不再是登录页即可。限制与注意事项中间件会改写请求。from_curl的文档明确提示在启用默认下载器/爬虫中间件如DefaultHeadersMiddleware、UserAgentMiddleware、HttpCompressionMiddleware时生成的Request对象在请求链上可能会被修改实际发出的头不一定与 cURL 完全一致用JsonRequest、XmlRpcRequest等子类调用from_curl时同样如此。cookie 文件不支持。-b cookies.txt这种指向文件的形式Scrapy 只支持keyvalue键值对文件形式会被忽略需要在复制 cURL 前确认 cookie 是内联在命令里的。URL 缺 scheme 时固定补http://不会补https。文档同时提到可以借助第三方工具curl2scrapy把 cURL 命令翻译成 Scrapy 请求代码作为from_curl之外的替代方案。想要反向操作Request 转回 cURL 字符串时使用Request.to_curl()它自 Scrapy 2.18.0 引入当前仓库版本见 scrapy/VERSION2.19.0两者都可直接使用。更多围绕 Network 面板定位动态请求、复制 XPath 的操作流程见 Using your browsers Developer Tools for scrapingfrom_curl与to_curl的 API 条目在 Requests 与 Responses 文档 中可作为参数细节的进一步查阅入口。【免费下载链接】scrapyScrapy, a fast high-level web crawling scraping framework for Python.项目地址: https://gitcode.com/GitHub_Trending/sc/scrapy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考