如何使用cURL进行网页抓取

到 2023 年,命令行仍然是开发人员的宝贵资产,使用 cURL 进行网络抓取是一种简单而强大的提取有价值数据的方法。本教程将涵盖从第一个 cURL 请求到高级场景的所有内容

medium_curl_b2cd3cba2e

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

现在我们开始:

medium_image4_ea25acd256

使用 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

如果请求成功并且网站可以通过代理访问,脚本将显示网站内容并退出。相反,如果请求失败,我们将自动转到列表中的下一个代理,直到成功建立连接。

medium_rotating_output_d0e2196eb4

但是,免费代理池并不可靠,更好的方法是获得具有住宅 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并导航至产品页面。

medium_scapingclub_da1dab507a

到达那里后,通过右键单击任意位置并选择“检查”来打开 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 脚本生成的动态内容。

medium_xhr_dynamic_scraping_curl_b64b1ec34f

要通过 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 抓取网站,请执行以下步骤:

  1. 确定您要抓取的网站和您的目标数据。
  2. 使用 cURL 命令向网站服务器发送 HTTP 请求。
  3. 添加参数以模拟成为人类用户。这里最常见的方面之一是通过轮换和使用代理自定义用户代理。
  4. 解析服务器响应的HTML内容;
  5. 优化 cURL 脚本以优化抓取过程并处理特定于网站的挑战。

类似文章