如何使用cURL进行网页抓取
到 2023 年,命令行仍然是开发人员的宝贵资产,使用 cURL 进行网络抓取是一种简单而强大的提取有价值数据的方法。本教程将涵盖从第一个 cURL 请求到高级场景的所有内容。
Web 抓取中的 cURL 是什么?
cURL(URL 客户端)是一种开源命令行工具,用于向 Web 服务器发出请求并因此获取数据。由于支持广泛的网络协议(例如 HTTP、HTTPS),它可以处理高级任务,例如用户身份验证、动态网络爬行和交替代理服务器。
先决条件
要使用 cURL 执行网页抓取,您必须先在计算机上安装它。安装过程因操作系统而异:
A) Linux:打开终端并运行以下命令:
apt-get install curl
B) Mac:操作系统附带安装的工具,但homebrew
如果您想要最新版本,请使用:
brew install curl
C) Windows:如果您在 Windows 10 或更高版本上运行脚本,cURL 会预装。但如果您有旧版本,请访问官方网站,下载最新版本,并将其安装到您的机器上。
安装 cURL 后,请打开终端并输入curl
测试以确保一切正常。如果一切顺利,您将收到此消息:
curl: try 'curl --help' or 'curl --manual' for more information
如何使用 cURL 进行网页抓取
使用 cURL 发送请求涉及键入curl
命令和目标 URL以开始使用。
curl https://httpbin.org/anything
您将看到所请求网页的 HTML 内容如何立即显示在您的屏幕上。
{ "args": {}, "data": "", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Host": "httpbin.org", "User-Agent": "curl/7.86.0", "X-Amzn-Trace-Id": "Root=1-6409f056-52aa4d931d31997450c48daf" }, "json": null, "method": "GET", "origin": "83.XX.YY.ZZ", "url": "https://httpbin.org/anything" }
此命令工具允许您执行更高级的请求,在目标页面之前添加额外的参数。
curl [options] [URL]
您的选择之一是使用范围广泛的协议执行数据传输,包括 HTTP、HTTPS、FTP、SFTP 和许多其他协议。
另一个相关的考虑是,您需要使用由 (data) 属性标记的 POST 方法-d
来提交表单。David
以下是使用密码输入用户的方法abcd
:
curl -d "user=David&pass=abcd" https://httpbin.org/post
现在我们开始:
使用 cURL 进行 Web 抓取时避免被阻止
最大的网络抓取挑战是容易被阻止。但是,为避免这种情况,您将学习使用 cURL 实施一些最佳实践以绕过反抓取保护:轮换代理和自定义标头。
将旋转代理与 cURL 结合使用
来自同一 IP 地址的同一网站的大量请求看起来很可疑,使您面临被检测为机器人并被阻止的风险。解决方案?代理服务器:通过给你一个不同的 IP 来掩盖你的 IP 的中介。
例如,我们将使用许多免费提供的在线代理服务器列表之一,并选择一个 IP 地址以包含在我们的下一个请求中。作为目标页面,我们将使用之前的 HTTP Request & Response Service。这是 cURL 网页抓取的语法:
curl --proxy <proxy-ip>:<proxy-port> <url>
您应该替换<proxy-ip>
为代理的 IP 地址和<proxy-port>
端口号。它看起来像这样:
curl --proxy 198.199.86.11:8080 -k https://httpbin.org/anything
不幸的是,当我们尝试使用免费代理访问该网站时,我们收到一条错误消息:Received HTTP code 500 from proxy after CONNECT
。当我们尝试使用列表中的另一个 IP 代理时,我们也会遇到同样的错误:
curl --proxy 8.209.198.247:80 https://httpbin.org/anything
您可以做的是将代理列表存储在文本文件中并使用 Bash 脚本,然后自动执行测试每个代理的过程。下面,我们首先遍历文件中的每一行proxies.txt
,并将当前行设置为 curl 请求的代理。
#!/bin/bash # Read the list of proxies from a text file while read -r proxy; do echo "Testing proxy: $proxy" # Make a request through the proxy using cURL if curl --proxy "$proxy" -k https://httpbin.org/anything >/dev/null 2>&1; then curl --proxy "$proxy" -k https://httpbin.org/anything echo "Success! Proxy $proxy works." else echo "Failed to connect to $proxy" fi # Wait a bit before testing the next proxy sleep 1 done < proxies.txt
如果请求成功并且网站可以通过代理访问,脚本将显示网站内容并退出。相反,如果请求失败,我们将自动转到列表中的下一个代理,直到成功建立连接。
但是,免费代理池并不可靠,更好的方法是获得具有住宅 IP 的高级代理。或者你可以让它更容易并尝试ZenRows来获取它们以及为你处理代理管理。
您可以通过查看我们关于在 Python 中旋转代理的教程来了解有关此主题的更多信息。
添加自定义标头
浏览网页时,HTTP 标头用作数字签名并在您访问的每个页面上识别您的身份。因此,即使您屏蔽了您的 IP,也很明显您是一个机器人,除非您还旋转了您的标头。
Web 抓取最重要的元素是User-Agent字符串,它包含有关您的浏览器和设备的信息。它看起来像这样:
Mozilla/5.0 (Macintosh; Intel Mac OS X 13_2_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15
要更改 cURL 抓取器的用户代理,请-A
使用以下语法添加选项,后跟所需的字符串:
curl -A "user-agent-name-here (<system-information>) <platform> (<platform-details>) <extensions>" [URL]
以下是使用 Google Chrome 的示例:
curl -A "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" https://httpbin.org/headers
注意:随机更改可能会使您被阻止,因为并非所有数据都匹配。查看我们使用 cURL进行网络抓取的顶级用户代理列表。
使用 cURL 进行动态网页抓取
许多网站使用 AJAX 或其他客户端技术来呈现整个页面或部分内容,这对提取数据提出了额外的挑战。但本教程涵盖了所有内容!在这里,我们使用 cURL 动态网页抓取。
使用浏览器前往ScrapingClub并导航至产品页面。
到达那里后,通过右键单击任意位置并选择“检查”来打开 DevTools 以显示原始 HTML 结构。
探索源代码,并密切注意初始页面加载后是否发出任何 AJAX 请求。这里是!我们发现以下代码片段从服务器获取了一些内容:产品名称、价格、描述和图片地址。
<script> $(function() { $.ajax({ type: "GET", url: "/exercise/list_detail_ajax_infinite_scroll/90008-E/", success: function(obj) { $(".card-title").html(obj.title); $(".card-price").html(obj.price); $(".card-description").html(obj.description); $("img.card-img-top").attr('src', obj.img_path); }, error: function(err) { alert("something is wrong in webapp"); }, }); }); </script>
如第四行所示,动态请求位于/exercise/list_detail_ajax_infinite_scroll/90008-E/
.
转到 DevTools 中的“网络”选项卡,刷新页面并打开90008-E
,显示源代码的 XHR (XMLHttpRequest) 元素。然后,转到“响应”子选项卡。您看到的是由 AJAX 脚本生成的动态内容。
要通过 cURL 网络抓取提取它,请向 发出请求https://scrapingclub.com/exercise/list_detail_ajax_infinite_scroll/90008-E/
,添加x-requested-with
带有-H
选项的标头,并指定XMLHttpRequest
为要检索的数据。
此外,包括'--compressed'
获得压缩响应的选项,这会减少带宽。
curl 'https://scrapingclub.com/exercise/list_detail_ajax_infinite_scroll/90008-E/' -H 'x-requested-with: XMLHttpRequest' --compressed
结果如下:
{ "img_path": "/static/img/90008-E.jpg", "price": "$24.99", "description": "Short dress in woven fabric. Round neckline and opening at back of neck with a button. Yoke at back with concealed pleats, long sleeves, and narrow cuffs with ties. Side pockets. 100% polyester. Machine wash cold.", "title": "Short Dress" }
但是,您应该记住,对于具有复杂结构的页面,cURL 脚本可能不够用,因为动态内容以更多不同的方式加载到页面中。在这种情况下,AJAX 端点不容易从页面源代码中发现,或者它们需要执行复杂的 JavaScript 逻辑。
因此,如果您的抓取项目包含具有动态内容的网站,那么像用户在浏览器中执行的交互,或者需要使用 cURL 执行 JavaScript 的复杂 API 可能还不够。在这种情况下,有必要使用 Python、PHP 或其他语言将 cURL 与无头浏览器集成(或替换)。
要初步了解如何做到这一点,请查看我们关于如何使用 Python抓取动态网页的指南。
结论
cURL 是用于网络抓取的多功能且有价值的资产,用于不同复杂性的任务。但是,反机器人保护每天都在变得更加先进,这意味着您可能需要考虑使用补充工具来获取所需的数据。
常见问题
如何使用 cURL 抓取网站?
要使用 cURL 抓取网站,请执行以下步骤:
- 确定您要抓取的网站和您的目标数据。
- 使用 cURL 命令向网站服务器发送 HTTP 请求。
- 添加参数以模拟成为人类用户。这里最常见的方面之一是通过轮换和使用代理自定义用户代理。
- 解析服务器响应的HTML内容;
- 优化 cURL 脚本以优化抓取过程并处理特定于网站的挑战。