网络抓取与元数据抓取
通常来说,网络抓取是指从网页加载时生成的 HTML 代码中提取网站数据。而元数据抓取,则侧重于从网页的元标记中提取网页的元信息。
网页的元数据是关于页面的信息,而不是页面本身的内容。 例如,元数据可能包括作者姓名、页面标题以及网页的描述等,这些信息有助于用户和搜索引擎了解页面的主题内容。 通过抓取元数据,用户可以更快速地收集到关于网页的关键信息。
可以使用多种方法来抓取网页的元数据,包括手动操作、利用现有的库,或者使用诸如 techblik.com 提供的 Metascraping API 等服务。
多种实现方式
若要手动抓取,您可以使用 Chrome DevTools 打开网页,然后在“元素”选项卡中提取元数据。 然而,当您需要处理大量页面时,这种手动方式会变得重复且繁琐。为了提高效率,我们可以采用以下几种自动化方法:
第一种方法是完全从零开始编写代码。 这需要您向目标网站发送 HTTP 请求,然后解析返回的 HTML 代码,使用正则表达式或模式匹配等技术从元标记中提取所需的数据。 但这种做法就像是重新发明轮子,会浪费大量时间在重复编写现有代码上。
第二种方法是借助各种编程语言提供的库来实现。 这种方式可以简化实现细节,使开发过程更加方便。 然而,如果您的编程语言没有合适的库,或者您使用的特定运行时环境不支持所需的库,那么这种方法将无法使用。
第三种方法是使用 techblik.com Metascraping API 这样的服务。 这种方法十分理想,因为它提供了一个统一的接口,无论您使用哪种编程语言都可以方便地调用。 只要支持发送 HTTP 请求,就可以使用任何语言来操作。
本文将演示如何结合 cURL、PHP 和 JavaScript (NodeJS) 使用 techblik.com Metascraping API。
相比其他方法,使用 techblik.com API 的优势在于:
- 它不受编程语言和运行时环境的限制。
- 您可以避免重复造轮子,从而节省大量的编码时间。
- 您可以高效地抓取多个网站的数据(在几秒钟内完成)。
- 它非常容易上手和使用。
- 您可以免费使用。
开始使用 techblik.com API
要使用 techblik.com API,您需要一个 API 密钥。 您可以访问 techblik.com 网站并创建一个免费帐户来获取密钥。 创建帐户后,登录仪表板,您就可以看到您的 API 密钥。
API 的端点位于 https://api.techblik.com/metascraping。 发出请求时,您需要在请求标头中提供 API 密钥,键名为 x-api-key,值是您的 API 密钥。
此外,您还需要在请求正文中传递其他参数,包括 url、device 和 proxyCountry。
- url:指定要抓取元数据的网页的 URL。
- device:指定用于访问网站的设备类型,可以选择移动设备或桌面设备。
- proxyCountry:指定在抓取数据之前请求应来自的国家/地区。 这是一个高级功能,仅在 techblik.com 的付费计划中提供。
由于这些参数将作为请求正文的一部分传递,因此请求必须是 POST 请求,因为 GET 请求无法携带元数据。
在第一个演示中,我们将使用命令行工具 cURL 来发送 Metascraping API 请求。 您需要先安装 cURL 才能使用它。
我将使用 Bash 终端,这通常是 macOS 和 Linux 的默认终端。 对于 Windows,您需要安装 Git Bash。
安装 cURL 后,您就可以使用 cURL 命令发起请求了。 我们需要向命令传递参数,以指定请求方法、端点、请求正文和请求头。
curl -X POST https://api.techblik.com/metascraping -d '{ "url": "https://tesla.com" }' -H 'Content-Type: application/json' -H 'x-api-key: <API_KEY>'
注意:前三行后的反斜杠允许您将命令拆分成多行显示。
此命令将 HTTP 方法指定为 POST,并将端点指定为 techblik.com API 的元数据抓取端点。
我们还以 JSON 对象的形式发送请求正文,其中 url 属性指定为 https://tesla.com。 最后,我们添加了标头,将正文内容类型指定为 JSON,并通过 x-api-key 标头提供了 API 密钥。
当我们运行此命令时,会得到以下输出:
{"timestamp":1669328564856,"apiStatus":"success","apiCode":200,"meta":{"url":"https://tesla.com","device":"desktop","test":{"id":"1fh2c30i05vmvxb99pdh6t6hze2x72jv"}},"data":{"author":null,"date":null,"description":"Tesla is accelerating the world’s transition to sustainable energy with electric cars, solar and integrated renewable energy solutions for homes and businesses.","image":"https://tesla-cdn.thron.com/delivery/public/image/tesla/6139697c-9d6a-4579-837e-a9fc5df4a773/bvlatuR/std/1200x628/Model-3-Homepage-Social-LHD","logo":"https://tesla.com/themes/custom/tesla_frontend/assets/favicons/favicon-196x196.png","publisher":"Tesla","title":"Electric Cars, Solar & Clean Energy | Tesla","url":"https://www.tesla.com/","lang":"en"}}
这是预期的输出结果。
接下来,我们将创建一个 NodeJS 脚本,从 API 获取数据。 您需要先安装 NodeJS,以及 NPM 或其他 Node 包管理器来管理项目的依赖项。 我仍然会使用 Bash 终端来运行命令。
首先创建一个空的项目文件夹,并在终端中打开它:
mkdir metascraping-js && cd metascraping-js
之后,创建我们的脚本文件:
touch index.js
然后,将项目初始化为 Node 项目:
npm init -y
为了在文件中使用 ESModule 语法,在 package.json 文件的根目录下添加 `”type”: “module”`,如下所示:
{ "name": "metascraping", "version": "1.0.0", "description": "", "main": "index.js", "type": "module", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
接下来,安装 node-fetch 包。该包在 NodeJS 中提供了类似于浏览器 fetch 功能的 API,使得在 NodeJS 中发起 HTTP 请求更加容易。
npm install node-fetch
安装完成后,就可以编辑脚本了。使用您喜欢的文本编辑器打开 index.js 文件。我将使用基于终端的 nano 文本编辑器:
nano index.js
在 index.js 文件中,首先导入 fetch 函数,它是 node-fetch 模块的默认导出:
import fetch from 'node-fetch'
然后,定义请求的主体,这是一个包含 url 属性的 JSON 字符串。 url 属性的值是我们想要获取元数据的网页的 URL。
const body = JSON.stringify({ url: 'https://spacex.com' });
接下来,定义传递给 fetch 函数的请求选项:
const options = { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': <YOUR API KEY here> }, body: body }
我们将请求方法定义为 POST 请求,还定义了两个标头。 其中一个指定正文包含 JSON 数据,另一个提供 API 密钥。
请将
最后,调用 fetch:
fetch('https://api.techblik.com/metascraping', options) .then(response => response.json()) .then(json => console.log(json))
这里,我们调用了 fetch 函数,传入了 API 端点和之前定义的选项。 由于 fetch 返回一个 Promise,我们附加了一个回调来解析 JSON 响应。 回调返回另一个 Promise,当它解决时,我们使用 console.log() 输出返回的对象。
最终,我们的文件内容如下:
import fetch from 'node-fetch' const body = JSON.stringify({ url: 'https://spacex.com' }); const options = { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': <YOUR API KEY here> }, body: body } fetch('https://api.techblik.com/metascraping', options) .then(response => response.json()) .then(json => console.log(json))
保存编辑并关闭 nano 或您正在使用的文本编辑器,然后运行以下命令来执行脚本:
node .
您应该获得如下元数据输出:
{ timestamp: 1669305079698, apiStatus: 'success', apiCode: 200, meta: { url: 'https://spacex.com', device: 'desktop', test: { id: '8m3srgqw06q2k8li5p6x70s8165d6e2f' } }, data: { author: null, date: null, description: 'SpaceX designs, manufactures and launches advanced rockets and spacecraft.', image: 'https://www.spacex.com/static/images/share.jpg', logo: 'https://spacex.com/static/images/favicon.ico', publisher: 'SpaceX', title: 'SpaceX', url: 'http://www.spacex.com/', lang: 'en' } }
在 PHP 中使用 techblik.com API
要在 PHP 中使用 techblik.com Metascraping API,请确保您的本地计算机已安装 PHP 和 Composer。
首先,创建并打开一个项目文件夹:
mkdir metascraping-php && cd metascraping-php
接下来,安装 GuzzleHTTP。Guzzle 是一个常用的 PHP HTTP 客户端库,可以与 techblik.com API 一起使用:
composer require guzzlehttp/guzzle
安装 Guzzle 后,创建一个脚本文件:
touch script.php
然后开始编写代码。 使用您选择的文本编辑器打开 script.php 文件。 我将继续使用 nano:
nano script.php
在脚本中,添加标准的 PHP 代码块:
<?php // All code goes here ?>
接下来,加载必要的扩展,并从 Guzzle 导入 Request 和 Client 类。 这段代码需要写在之前 代码块之间:
require_once('vendor/autoload.php'); use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request;
实例化 GuzzleHttp\Client 类来创建客户端:
$client = new Client();
为请求定义标头。 此请求需要提供两个标头,一个指定正文内容类型为 JSON,另一个包含您的 API 密钥:
$headers = [ 'x-api-key' => <YOUR API KEY HERE>, 'Content-Type' => 'application/json' ];
将 <YOUR API KEY HERE> 替换为您的 techblik.com API 仪表板提供的实际 API 密钥。
接下来,定义请求主体。 在本例中,请求主体是一个 JSON 字符串,其中的 url 属性设置为 “https://twitter.com”:
$body = json_encode([ "url" => "https://twitter.com" ]);
要创建请求,需要实例化之前导入的 Request 类,传入请求方法、端点、标头和请求主体:
$request = new Request('POST', 'https://api.techblik.com/metascraping', $headers, $body);
然后使用客户端发送请求:
$response = $client->sendAsync($request)->wait();
最后,提取请求的主体并将其输出到控制台:
echo $response->getBody();
如果代码正确复制,则 script.php 文件的内容应如下所示:
<?php require_once('vendor/autoload.php'); use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request; $client = new Client(); $headers = [ 'x-api-key' => <YOUR API KEY>, 'Content-Type' => 'application/json' ]; $body = json_encode([ "url" => "https://twitter.com" ]); $request = new Request('POST', 'https://api.techblik.com/metascraping', $headers, $body); $response = $client->sendAsync($request)->wait(); echo $response->getBody(); ?>
保存脚本,关闭编辑器,然后运行以下命令:
php script.php
您应该得到如下输出:
{ "timestamp":1669322100912, "apiStatus":"success", "apiCode":200, "meta": { "url":"https://twitter.com", "device":"desktop", "test":{ "id":"wn1nj30r04bk0ijtpprwdqmtuirg9lze" } }, "data":{ "author":null, "date":null, "description":"The latest stories on Twitter - as told by Tweets.", "image":"https://abs.twimg.com/a/1602199131/img/moments/moments-card.jpg", "logo":"https://abs.twimg.com/responsive-web/client-web/icon-ios.b1fc7279.png", "publisher":"Twitter", "title":"Explore", "url":"https://twitter.com/explore", "lang":"en" } }
总结
本指南介绍了使用 techblik.com Metascraping API 的多种方法。
Metascraping API 还允许您提供更多的参数,而不仅仅是 URL 参数。 其中一个参数是代理参数,但该参数只有通过 techblik.com API 的高级计划才能使用。 尽管如此,techblik.com API 仍然足够强大,可以满足多种不同的使用场景。
有关更多信息,请参阅 techblik.com API 的官方文档。