如何使用curl进行网页抓取:完整教程
网页抓取是一种从网站自动提取数据的好方法,而curl是最简单的入门工具之一。这个命令行实用程序让您可以获取网页、发送请求和处理响应,而无需编写复杂的代码。它轻量级、在大多数系统上预装,非常适合快速抓取任务。让我们深入了解您需要知道的一切。
Zilvinas Tamulis
12月 15日, 2025年
16 分钟阅读

什么是curl以及为什么用它进行网页抓取?
curl(“Client URL”)是一个使用各种网络协议传输数据的命令行工具。它支持HTTP(S)、FTP以及大约20种其他协议,使其在从网络获取数据方面非常通用。curl最初于1997年发布,已成为Linux、macOS和现代Windows系统上预装的标准实用程序,这意味着您可以立即开始抓取,无需安装任何东西。
开发者喜欢curl进行抓取的原因
主要吸引力在于简单性。您可以使用单个命令获取网页的HTML,无需IDE或花哨的工具。它简单、快速,与复杂的基于浏览器的工具相比,不会消耗太多内存。对于快速数据提取任务或测试API,curl可以在几秒钟内完成工作。它也非常适合自动化:在bash脚本中编写一个curl命令,用cron安排它,您就有了一个自动运行的基本抓取器。
curl在处理静态HTML页面、简单API调用或需要测试服务器如何响应不同请求头时表现出色。如果您提取的数据已经存在于初始HTML响应中,curl可以轻松处理。
curl不够用的时候
这就是变得棘手的地方。现代网站喜欢JavaScript,但curl不执行JavaScript。如果您需要的数据是在页面渲染后动态加载的,curl将只获取基本HTML,而实际内容保持隐藏。具有严格反机器人保护、CAPTCHA或复杂身份验证流程的网站也可能让单独使用curl感到头疼。
对于这些场景,您需要使用可以实际执行JavaScript的无头浏览器,如Puppeteer或Playwright,或者考虑使用专用解决方案,如Decodo的网页抓取API,它自动处理JavaScript渲染和反机器人措施。
入门:安装和设置curl
检查curl是否已安装
在下载任何东西之前,curl可能已经在您的系统中某处了。打开您的终端工具并输入:
结果应该看起来类似这样:
如果您看到带有版本信息和支持协议列表的类似响应,那就可以开始了。
大多数现代系统都预装了curl,所以您有很大机会可以直接跳到抓取。如果出于某种原因您的系统没有curl,请根据您的操作系统按照以下步骤安装。
按操作系统安装
- Linux. 大多数发行版默认包含curl。如果您的没有,使用包管理器安装:
- macOS. curl应该在macOS上预装。如果您需要下载或更新到最新版本,使用Homebrew:
- Windows. Windows 10(版本1803或更高)原生包含curl。打开命令提示符或PowerShell并输入curl --version来确认。如果缺失或您使用的是旧版本,从curl官方网站下载Windows二进制文件。解压文件并将文件夹添加到系统的PATH环境变量,这样您就可以从任何目录运行curl。
- 其他系统. 如果您使用的是不太流行的操作系统或想手动下载curl,可以从官方下载页面找到版本。
验证您的安装
运行快速测试以确保一切正常:
您应该看到HTML内容直接打印到您的终端。如果您收到有关SSL证书或连接问题的错误,请检查您的网络设置或防火墙。一旦您看到HTML转储,您就可以开始抓取了。
用于网页抓取的基本curl命令
理解curl语法
curl命令遵循简单的结构:
URL是唯一必需的部分,其他都是修改请求行为的可选标志。顺序也很少重要,这意味着[选项]也可以写在[URL]之后。选项通常以单破折号(-o)开头表示短格式,或双破折号(–output)表示长格式。它们后面跟着提供额外说明或上下文的附加参数。您可以在单个命令中堆叠多个选项,这在抓取时会经常做。
获取网页的HTML
最基本的抓取命令是简单的GET请求:
这将整个HTML响应直接打印到您的终端。您将看到所有原始HTML标签、脚本和内容,这正是服务器发回的内容。这对于快速检查很有用,但在终端中滚动浏览大量HTML来找到您需要的东西就像大海捞针。
将输出保存到文件
确保您知道终端当前在哪里运行命令。使用pwd命令检查您的工作目录,然后使用cd移动到您想要测试文件存放的位置。使用mkdir创建新文件夹,然后用cd folder_name进入它。这样,您就不会在定位文件存放位置时遇到麻烦。
与其弄乱您的终端,不如将HTML保存到您实际可以使用的文件中:
-o标志将输出写入您在其后指定的任何文件名。如果您希望curl根据URL自动命名文件,使用-O:
这将文件保存为当前目录中的data.html。
跟随重定向
许多网站将您从一个URL重定向到另一个,比如从HTTP到HTTPS,或者将您弹到实际目的地的缩短URL。默认情况下,curl不跟随这些重定向,因此运行以下命令不会获得任何有意义的内容:
单独执行此命令将不返回任何内容。如果您添加–verbose标志(请求提供有关终端进程的详细额外信息),您将看到"HTTP/1.1 301 Moved Permanently"。该行意味着您尝试访问的内容不再存在,已被移动到其他地方(最有可能是HTTPS)。
添加-L标志告诉curl自动跟随重定向:
现在curl会追踪重定向链,直到到达最终目的地并获取真实内容。这对于抓取至关重要,因为您很少想要重定向页面本身,您想要它发送您去的地方。
这些基本命令涵盖了大多数简单的抓取任务。一旦您熟悉了GET请求、保存文件和处理重定向,您就准备好应对更复杂的场景了。
使用curl进行高级网页抓取
自定义请求
现实世界的抓取意味着伪装您的请求,使其看起来像来自常规浏览器,而不是命令行工具。网站检查请求头以识别机器人,默认的curl请求从一英里外就会大喊"自动化工具"。
设置自定义头
-H标志允许您向请求添加自定义头。最重要的一个是User-Agent,它标识您使用的浏览器:
上述命令告诉网站您正在64位机器上使用Windows 10操作系统。AppleWebKit是Chrome和大多数基于Chromium的浏览器报告的渲染引擎(尽管它们实际上使用Blink)。不要在意Mozilla/5.0,因为它是一个不再工作的遗留令牌,大多数浏览器只是为了兼容性而包含它。
测试请求被发送到HTTPBin,这是一个用于测试请求的便利网站。您将获得一个JSON响应,将您提供的信息发送回给您,这样您就知道它通过了。
没有真实的User-Agent,许多网站会向您提供不同的(通常是损坏的)内容或完全阻止您。这就是为什么您需要包含很多这样的头,就像真正的浏览器一样。您可以在一个命令中堆叠多个头:
Referer头告诉服务器您"从哪里来",一些网站在提供内容之前会检查这个。Accept-Language头告诉客户端首选的语言和区域设置。这些是浏览器发送到网站的常见头,使它们成为合法用户的强标识符。
使用cookie
Cookie在请求之间维护会话状态。这有助于网站记住您、您设置的偏好、登录状态等等。使用-c保存响应中的cookie:
我们使用HTTPBin URL设置一个值为"67"的自定义"decodo-test-cookie"。您也可以对真实网站执行此操作,但大多数网站通过JavaScript提供cookie,而curl无法处理。
然后使用-b在后续请求中发送这些cookie:
这对于抓取需要您保持登录或维护会话的页面至关重要。
发送POST请求
curl不仅限于GET请求。表单、登录和API端点通常需要带有数据的POST请求。使用-X POST和-d发送表单数据:
HTTPBin默认会返回JSON数据。对于不以可读格式返回的网站,您可以指定Content-Type:
这种模式适用于大多数需要提交数据以获取结果的API交互。
HTTP身份验证
一些网站使用基本HTTP身份验证。使用-u标志处理它们:
curl会自动编码您的凭据并将其包含在Authorization头中。对于不使用基本身份验证的网站,您需要抓取登录表单并通过POST提交凭据。
处理分页和多个请求
当您使用shell脚本自动化时,curl的真正威力就显现出来了。大多数抓取工作涉及获取多个页面: 产品列表、搜索结果或分页数据。简单的bash循环可以优雅地处理这个。创建一个新文件(在终端中使用touch file_name.sh,或手动创建),并在其中编写以下命令:
保存文件并通过终端运行:
这将获取第1到第5页,将每个保存到单独的文件,并在请求之间等待2秒以避免压垮服务器。-L选项通常用于分页,因为第一页通常会重定向到URL中没有页码的默认链接。
您还可以从文件中读取URL。创建一个名为urls.txt的文件并输入几个您想抓取的URL:
http://ip.decodo.com/
http://scrapeme.live/shop/
http://httpbin.org/
确保它们由换行符分隔,包括最后一个(注意空的第4行)。然后,在不同的bash(.sh)文件中,编写以下脚本:
像以前一样在终端中运行它。该脚本将抓取列出的网站并为每个网站创建一个新文件。
对于更复杂的工作流程,如抓取数据、提取特定值,然后在后续请求中使用这些值,您需要将curl与其他命令行工具结合使用或用Python编写脚本。但对于直接的多页抓取,带有curl的bash循环可以让您走得很远。
避免阻止和封禁
被阻止是抓取者的噩梦。网站部署越来越复杂的反机器人措施,几个粗心的请求可能会让您的IP被禁止数小时或数天。以下是在抓取期间保持不被检测的方法。
使用代理
代理是您的第一道防线。它们通过不同的IP地址路由您的请求,使其看起来像流量来自多个用户,而不是一个不懈的机器人在攻击服务器。使用curl,使用-x选项设置代理是可能的:
但如果您的代理不可靠或也被禁止了怎么办?这就是Decodo的轮换住宅代理变得至关重要的地方。住宅代理使用来自实际设备的真实可靠的IP地址,使您的请求与合法流量几乎无法区分。即使一个失败,轮换特性也只会切换到下一个IP地址,您可以照常继续抓取。
使用curl设置Decodo的动态住宅代理很简单:
将username:password替换为您的Decodo凭据,您就可以通过自动轮换的住宅IP池路由请求。对于大量抓取,这种设置是不可协商的。
轮换user-agent和头
我们之前介绍了User-Agent头,但值得强调的是: 在请求之间轮换它们使您的流量模式看起来更有机。创建一个常见User-Agent字符串列表并循环使用它们:
混合使用其他头,如Accept-Language、Referer和Accept-Encoding,以进一步随机化您的指纹。目标是避免发送看起来像机器人的相同请求。
处理CAPTCHA和反机器人措施
这就是curl碰壁的地方。现代网站部署CAPTCHA、浏览器指纹识别、JavaScript挑战和行为分析,而curl根本无法处理。curl不执行JavaScript,无法解决CAPTCHA,并且缺少这些系统所期望的浏览器环境。
这正是Decodo的网页抓取API的构建目的。它在后台处理JavaScript渲染、绕过反机器人保护、处理user-agent和头轮换以及绕过CAPTCHA。您发送一个简单的API请求,Decodo返回干净的HTML:
该API在底层使用无头浏览器和代理,因此您可以获得复杂抓取基础设施的所有好处,而无需自己构建。对于具有严重反机器人措施的网站,这种方法比试图用原始curl命令智胜CAPTCHA要可靠得多。
当您大规模抓取或面对激进的机器人检测时,像Decodo的API这样的工具不仅仅是方便的,它们是工作的抓取器和在三个请求后被阻止的抓取器之间的区别。
使用curl抓取动态内容
现代网站很少在初始HTML响应中提供所有内容。相反,它们加载一个基本的页面骨架,并使用JavaScript在页面加载后获取数据。当您使用curl抓取时,您得到的是那个空骨架,没有产品列表、没有价格、没有有用的数据。只是一堆
标签等待JavaScript填充它们。
好消息是存在一个解决方法: 找到JavaScript用来获取数据的API端点。以下是如何做到的:
- 打开浏览器的开发者工具(F12)
- 转到Network标签
- 重新加载页面。查看Fetch/XHR请求,这些是加载动态内容的AJAX调用
- 点击其中一个请求并选择Response标签以查看端点URL及其使用的任何参数
通常,您会找到实际上比HTML更容易解析的干净JSON响应:
响应将看起来像这样:
这是抓取的金矿。JSON是结构化的、可预测的,与杂乱的HTML相比解析起来微不足道。许多网站在没有身份验证的情况下公开这些API端点,特别是对于公共数据。您只需要找到它们。
一些API需要特定的头或身份验证令牌。检查开发者工具中的请求头并在您的curl命令中复制它们。您可能需要包含来自已登录会话的cookie或添加API密钥头。
curl挣扎的时候
有时API端点被混淆、加密或受到验证您使用真实浏览器的反机器人措施保护。其他时候,网站使用WebSocket、复杂的身份验证流程,或通过多个JavaScript框架呈现内容,这使得端点搜索不切实际。
对于这些场景,您需要实际可以执行JavaScript的工具。像Playwright或Selenium这样的无头浏览器在没有GUI的情况下运行真实的浏览器环境,让JavaScript正常执行,同时您以编程方式控制浏览器。
将curl与其他工具和语言集成
将curl与命令行实用程序结合
当您将其输出通过Unix工具管道传输以提取和转换数据时,curl变得更加强大。与其将HTML保存到文件并稍后处理,您可以使用系统上已安装的工具即时解析数据。
使用grep和正则表达式从页面提取所有电子邮件地址:
- grep搜索文本中的模式(正则表达式)
- -E启用扩展正则表达式,允许使用+和{}而不转义
- -o告诉grep只输出匹配的部分,而不是整行
使用sed提取所有链接(*href=“…”*属性中的所有URL):
对于更结构化的提取,awk擅长逐行处理数据。假设您正在抓取价格比较页面:
这些单行命令非常适合快速数据提取任务,您需要几个特定值并且不想编写完整的脚本。您可以在各自的文档链接中阅读它们的结构、语法和工作原理。最后,您不必限制自己只使用一个,将多个命令与管道链接在一起以构建复杂的处理管道。
将curl与Python一起使用
对于超出基本文本提取的任何内容,Python为您提供了适当的HTML解析和数据操作。最直接的方法使用Python的subprocess模块来运行curl命令并捕获输出:
但是当您抓取HTML时,Beautiful Soup使解析比正则表达式容易得多:
这种组合为您提供了curl获取页面的速度和可靠性,以及Python处理数据的生态系统。您可以保存到数据库、转换JSON、生成CSV文件,无论您的抓取工作流需要什么。
对于更复杂的抓取需求,您可能完全跳过curl并使用Python的Requests库,它提供类似的功能,感觉更直观。
与其他语言的集成
大多数编程语言都内置或库支持运行curl命令:
PHP使用curl_init()和相关函数:
Node.js可以通过child_process调用curl:
或使用node-libcurl包获取libcurl的原生绑定。
跨语言的模式是一致的: 执行curl来获取数据,然后使用特定于语言的工具来解析和处理它。当您需要curl的特定功能但希望在更具表现力的语言中处理数据操作时,这种方法效果很好。
错误处理和最佳实践
抓取器会失败,但这没关系。网络中断、服务器超时、网站重构HTML,反机器人系统无预警启动。专业抓取器和脆弱脚本之间的区别在于它如何优雅地处理这些不可避免的故障。
- 检查HTTP状态码. 每个HTTP响应都包含一个状态码,告诉您请求是否成功。200表示成功,404表示未找到,403表示您被阻止,500+表示服务器错误。使用curl的-w标志捕获它:
- 实施重试和处理失败. 暂时性网络问题意味着单个失败的请求不等于完全失败。通过增加延迟重试来实施指数退避:
- 日志记录和调试技巧. 静默失败是最糟糕的。使用时间戳和响应代码记录每个请求,或在调试时使用-v详细模式查看完整的请求/响应头。
构建优雅处理错误的抓取器不仅仅是良好的工程实践,这是大规模抓取的唯一可持续方式。
何时使用替代方案: curl vs 其他抓取工具
与浏览器自动化工具的比较
curl在速度和简单性方面表现出色,但它不能执行JavaScript或像用户那样与页面交互。当您需要运行实际浏览器时,像Playwright和Selenium这样的库是更好的选择,让您可以点击按钮、填写表单并等待动态内容加载。
Scrapy介于两者之间,它比浏览器自动化快,但比原始curl更复杂。它内置支持跟随链接、处理并发请求和处理数据管道。将curl用于快速API调用和静态页面。
当您需要使用复杂逻辑爬取整个网站时切换到Scrapy。当网站需要用户交互或严重依赖JavaScript渲染时使用Playwright。
何时切换到抓取API或无头浏览器
如果您花费更多时间与CAPTCHA和反机器人系统作斗争,而不是实际提取数据,那就是时候升级您的工具了。
无头浏览器处理JavaScript密集型网站,但需要大量基础设施:内存管理、浏览器维护、代理轮换和CAPTCHA解决。无论如何,它们是一个更实际的解决方案,可以完全按照您想要的方式构建抓取器。
Decodo的网页抓取API自动处理所有这些: JavaScript渲染、代理轮换、反机器人绕过和CAPTCHA规避在后台发生,而您专注于处理您实际需要的数据。
如果curl被阻止或返回空页面,并且您正在大规模抓取,无头浏览器或托管抓取解决方案可以节省您数天的基础设施麻烦。
curl命令摘要
以下是本指南中涵盖的基本curl命令的快速参考:
选项
完整命令
作用
示例
curl [URL]
curl [URL]
在终端中获取并显示网页内容
-o
–output
将输出保存到指定的文件名
-O
–remote-name
使用URL中的文件名保存输出
-L
–location
自动跟随重定向
-H
–header
向请求添加自定义头
-c
–cookie-jar
将cookie保存到文件
-b
–cookie
从文件发送cookie
-X
–request
指定HTTP方法(POST、PUT等)
-d
–data
在POST请求中发送数据
-u
–user
提供用户名和密码进行身份验证
-x
–proxy
通过代理服务器路由请求
-U
–proxy-user
提供代理身份验证凭据
-w
–write-out
输出额外的请求信息
-v
–verbose
显示详细的请求和响应信息
-s
–silent
抑制进度表和错误消息
总结
curl仍然是网页抓取最容易入门的工具之一,轻量级、预装,对于静态页面和API端点足够强大。但是当您遇到JavaScript密集型网站、激进的反机器人系统或需要大规模抓取时,像抓取API或无头浏览器这样的工具会处理复杂性,这样您就可以专注于数据而不是基础设施麻烦。归根结底,最好的抓取器是当您需要时实际工作的那个。
关于作者

Zilvinas Tamulis
技术文案
作为一名拥有 4 年以上工作经验的技术作家,Žilvinas 将自己在多媒体和计算机设计方面的学习与创建用户手册、指南和技术文档方面的实际专业知识相结合。他的工作包括利用 JavaScript、PHP 和 Python 的实践经验,开发每天有数百人使用的网络项目。
通过 LinkedIn 与 Žilvinas 联系。
Decodo 博客上的所有信息均按原样提供,仅供参考。对于您使用 Decodo 博客上的任何信息或其中可能链接的任何第三方网站,我们不作任何陈述,也不承担任何责任。


