如何使用Geekflare网页抓取API来抓取网站
Web scraping是从World Wide Web中提取有用信息的过程。在进行谷歌搜索时,网络爬虫(bot),即爬虫,浏览了网上几乎所有的内容,并选择与您相关的内容。
信息或知识对每个人都应该是可访问的这一理念导致了World Wide Web的形成。但是,您正在寻找的数据必须允许公开使用。
Web scraping有什么用途?
我们生活在信息时代。原始数据可以转化为有用的信息,可以借助web scraping用于服务更大的目的。它可以用于分析和研究产品的用户以改进产品,换句话说,创建一个反馈循环。
电子商务公司可以使用它来研究竞争对手的定价策略,并相应地制定自己的策略。网页抓取还可以用于天气和新闻报告。
挑战
#1. IP限制
一些网站通过检测您的IP地址或地理位置来限制您在特定时间间隔内获取网站数据的请求数量。他们这样做是为了防止对其网站的恶意攻击。
#2.验证码
区分真正的人类和试图访问该网站的机器人是验证码的真正作用。网站使用它来防止网站上的垃圾信息,并控制网站上的抓取程序数量。
#3.客户端渲染
这是网络爬虫面临的最大障碍之一。现代网站使用能够创建单页应用程序的前端框架。大多数单页应用程序没有服务器渲染的内容。
相反,它们使用客户端JavaScript根据需要生成内容。这使得抓取程序难以得知一个网页的内容。为了获取内容,您需要渲染一些客户端JavaScript。
Geekflare API
A web scraping API可以解决在执行Web抓取时遇到的大多数挑战,因为它会为您处理所有事情。让我们探索一下Geekflare API,并看看您如何将其用于Web抓取。
Geekflare的API为您提供了一个简单的三步流程:
- 提供要抓取的URL
- 提供一些配置选项
- 获取数据
它可以为您抓取网页,然后将原始HTML数据作为字符串或HTML文件返回,您可以通过链接访问,以适合您的方式。
使用API
在本教程中,您将学习如何使用Geekflare API使用NodeJS – 一个JavaScript运行时环境。如果您还没有在系统上安装Install NodeJS,请在继续之前安装。
- 在一个新文件夹内,创建一个名为
index.mjs
的文件。之所以选择mjs
扩展名,是因为我们希望将此文件视为ES模块而不是Common JS文件。查看difference between ES modules and Common JS files。
- 在终端中的当前文件夹或目录中运行命令
npm init -y
。它将为您创建一个package.json
文件。
- 在
package.json
文件中,如果main
键值默认值是其他值,请将其更改为index.mjs
。或者,您还可以添加一个键type
并将其值设置为module
。
{
"type": "module"
}
- 通过在终端中运行
npm i axios
命令添加一个名为axios
的依赖项。此依赖项帮助我们向特定端点发出获取请求。
- 您的
package.json
应该类似于以下内容:
{
"name": "webscraping",
"version": "1.0.0",
"description": "",
"main": "index.mjs",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "Murtuzaali Surti",
"license": "ISC",
"dependencies": {
"axios": "^1.1.3"
}
}
- 在
index.mjs
文件中引入axios
。这里使用import
关键字,因为它是一个ES模块。如果它是一个commonJS文件,那么将使用require
关键字。
import axios from ‘axios’
- 对于我们对Geekflare API的所有请求,基本URL对于每个端点都是相同的。因此,您可以将其存储在一个常量中。
const baseUrl = 'https://api.yaoweibin.com'
- 指定要抓取数据的URL。
let toScrapeURL = "https://developer.mozilla.org/en-US/"
- 创建一个异步函数,并在其中初始化axios。
async function getData() {
const res = await axios({})
return res
}
- 在axios的配置选项中,您应该将方法指定为
post
,URL与端点一起指定,一个称为x-api-key
的标头,其值将是Geekflare提供的API密钥,最后,一个将发送到Geekflare API的data
对象。您可以通过转到dash.yaoweibin.com来获取API密钥。
const res = await axios({
method: "post",
url: `${baseUrl}/webscraping`,
headers: {
"x-api-key": "your api key"
},
data: {
url: toScrapeURL,
output: 'file',
device: 'desktop',
renderJS: true
}
})
- 如您所见,数据对象具有以下属性:
- url:需要抓取的网页的URL。
- output:将数据呈现给您的格式,可以是内联字符串或HTML文件。内联字符串是默认值。
- device:您希望在其中打开网页的设备类型。它接受三个值,'desktop'、'mobile'和'tablet',其中'desktop'是默认值。
- renderJS:一个布尔值,用于指定是否要渲染javascript。当您处理客户端渲染时,此选项非常有用。
- 如果您想获得配置选项的完整列表,请阅读Geekflare API的链接。
- 调用异步函数并获取数据。您可以使用IIFE(立即调用的函数表达式)。
(async () => { const data = await getData() console.log(data.data) })()
- 响应将是这样的:
{ timestamp: 1669358356779, apiStatus: 'success', apiCode: 200, meta: { url: 'https://murtuzaalisurti.github.io', device: 'desktop', output: 'file', blockAds: true, renderJS: true, test: { id: 'mvan3sa30ajz5i8lu553tcckchkmqzr6' } }, data: 'https://api-assets.yaoweibin.com/tests/web-scraping/pbn0v009vksiszv1cgz8o7tu.html' }
解析HTML
为了解析HTML,您可以使用一个名为
node-html-parser
的npm包,并从HTML中提取数据。例如,如果您想从网页中提取标题,可以这样做:import { parse } from ‘node-html-parser’ const html = parse(htmlData) // htmlData是您从Geekflare API获取的原始HTML字符串。
或者,如果您只想获取网站的元数据,您可以使用Geekflare的metadata API端点。您甚至不必解析HTML。
使用Geekflare API的好处
在单页应用程序中,内容通常不是由服务器渲染的,而是由浏览器使用JavaScript渲染的。因此,如果您在不渲染用于呈现内容的JavaScript的情况下抓取原始URL,您将什么都得不到,只有一个没有内容的容器元素。让我给您举个例子。
这是一个使用react和vitejs构建的网站。demo website使用带有renderJS选项设置为false的Geekflare API来抓取此站点。你得到了什么?
只有一个没有内容的根容器。这是renderJS选项发挥作用的地方。现在尝试使用将renderJS选项设置为true的相同站点进行抓取。你得到了什么?
Vite + React
Edit
src/App.jsx
and save to test HMRClick on the Vite and React logos to learn more
使用Geekflare API的另一个好处是它允许您使用轮换代理,以确保网站不会发生IP阻塞。 Geekflare API在其premium plan下包含了代理功能。
最后的话
使用网络爬虫API使您只关注抓取的数据,而不会有太多技术麻烦。除此之外,Geekflare API还提供了诸如检查损坏的链接、元数据抓取、网站加载统计、屏幕截图、站点状态等功能。所有这些都在一个API下。请查看official documentation of the Geekflare API获取更多信息。