人工智能正在开启网络抓取的新时代

人工智能正在开启网络抓取的新时代

Barry Lv6

人工智能正迎来网页抓取的新时代

如何利用生成式AI以空前的规模和无与伦比的准确性从互联网上抓取数据

关于我

我是Hugo Lu,职业生涯始于伦敦的并购领域,后加入JUUL并涉足数据工程。短暂回归金融行业后,我领导了伦敦金融科技公司Codat 的数据部门。目前,我是Orchestra 的CEO,这是一款数据发布管道工具,助力数据团队可靠高效地将数据投入生产🚀

也请关注我们的Substack 内部博客 ⭐️

想了解Orchestra如何通过提供无与伦比的成本节约和可见性来改变游戏规则?立即尝试我们的免费层级

引言

互联网上大约有 500亿个页面 。这相当于50,000,000,000份内容。尽管这一数字令人望而生畏,但对于训练有素的数据工程师而言,这却是一个信息宝库,可用于各种应用场景。

过去,这一过程得益于 网页抓取 工具,如 Beautiful Soup #:~:text=Beautiful Soup 是一个Python库,用于从网页中提取数据,对于网页抓取非常有用。)(一个HTML解析器)和 Selenium ,一个浏览器自动化工具。然而,许多人并未意识到,按照互联网标准,这些工具已经非常老旧。两者均于2004年发布,今年将迎来它们的20岁生日。

自2004年以来,已有多个HTML解析器试图复制Beautiful Soup的成功。其中 Beautiful Soup的替代品 包括Scrapy、PyQuery和Mechanical Soup。

尽管存在众多替代品,但以系统化、高效且可重复的方式收集数据确实是一个非常棘手的问题。如今我们所称的“人工智能”(AI)不仅有望加速开发进程,还能促进网页抓取在数据领域的应用。

本文将深入探讨这一问题,并介绍如何利用传统方法解决它,以及与之相关的痛点。我们将看到AI驱动的网页抓取工具如何缓解这些痛点,以及数据工程师如何利用这些工具来发挥自己的优势。

HTML解析的问题

每个网页都由HTML代码——超文本标记语言 所定义。对于任何页面,通常可以右键点击屏幕并选择“检查”来查看其内部结构:

HTML代码由HTML元素组成。W3对此解释为:

HTML元素由开始标签、一些内容和结束标签定义:内容在此…

HTML代码必然具有结构

HTML 4文档由三部分组成:

包含HTML版本信息 的一行,

声明性头部区域(由HEAD 元素分隔),

一个主体,包含文档的实际内容。主体可以由BODY 元素或FRAMESET 元素实现。

在主体中,作为对提取数据感兴趣的人,我们希望访问这些元素。此外,我们希望保留层次结构。例如:

1
2
3
4
5
6
7
8
9
10
11
<head> e-commerce < / head>  
<title> Welcome! < / title>
<body>
<p1> My first paragraph < / p1>
<div> Some stuff </div>
<p2> My second paragraph < / p2>
<div> Some more stuff </div>
<p3> My third paragraph < / p3>
<div> Even more stuff </div>
< / body>
< / html>

从中,我们可能需要:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"elements":[
{
"type" : "p1",
"content" "My first paragraph",
"children" : [
{
"type" : "div",
"content" "some stuff",
"children" :[]
}
...
]
}

这些数据对于结构化数据分析来说基本上是无用的。因此,通过这个JSON,我们可能会进一步将JSON扁平化为表格形式。

这就引出了问题的第一部分,即解析是复杂的。HTML代码具有深度嵌套的结构,并且在具有多层嵌套方面变得越来越复杂

还有一些额外的考虑因素使得这一过程变得不那么简单。

时间或持续时间

网络爬虫通常需要在长时间内对多个网页进行抓取。然而,计算本身并不困难,但它需要一种不同于许多数据工程工作负载(短时高计算)的基础设施(长时间运行,低计算)。这意味着在类似于Kubernetes上的Airflow 的基础设施上简单地运行Python网络爬虫作业是不合理的昂贵。

使用浏览器自动化工具

有时,页面加载时并非所有HTML代码都会渲染。您需要点击某个元素才能显示内容。这意味着需要使用Selenium这样的浏览器自动化工具来“获取”数据。更多关于BS和Selenium的区别,请阅读这里

“变更模式”

网页会发生变化,这意味着HTML文档的结构也会随之改变。使用Beautiful Soup等工具时,随着时间的推移,当HTML结构发生变化 时,修改代码可能会变得困难且耗时,这使得利用网络爬虫收集数据的过程变得不稳定且不可靠。

在数据领域,我们可以利用数据合约 或传统的人际关系来确保这种情况不会发生。当你不知道电话另一端是谁(或者该打给谁)时,这就困难得多了。

合法性

将互联网作为数据源——好主意,对吧?想象一下,你可以自由合法地访问到那些令人难以置信的数据片段。再想想。

许多网站,如Linkedin,在其使用条款中明确禁止使用网络爬虫。在犯罪行为与仅被封禁 之间似乎有一条细微的界限。根据你的使用场景,你需要极其谨慎,并评估你正在爬取的网站是否可以合法地 进行。

这不是法律建议,也不应以此作为法律依据。

网络爬虫的代理服务

代理服务是一种允许你通过其主机路由请求的服务。这意味着你所使用的IP地址,以及可能的浏览器或其他组件都会有所不同。

这样做有多种优势 。它允许你进行多个并发请求(扩展性、速度),你可以绕过全局的IP封禁(有时网站会直接封禁AWS的IP),并且你可以从特定的地理位置设置代理,从而获取针对该特定地区的内容。

这通常是大多数人难以自行管理的事情。

如何利用AI提升网页抓取效率

通过一个简单示例和Open AI,我们将展示如何抓取数据以及AI如何简化这一过程。

抓取我自己的网站

为了便于演示,我将展示如何抓取Orchestra网站。

我们将抓取我的集成页面。虽然不确定你为何想要这样做,但从竞争情报的角度来看,你或许希望关注我的集成及其随时间的发展。

使用Python,Beautiful Soup脚本大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import json
import pandas as pd
from bs4 import BeautifulSoup

# 加载HTML内容
with open('path_to_your_html_file.html', 'r') as file:
html_content = file.read()

# 使用Beautiful Soup解析HTML
soup = BeautifulSoup(html_content, 'html.parser')

# 查找所有集成项 - 根据你的HTML结构调整类或标签
integration_cards = soup.find_all('div', class_='your_card_class_here')

data = []
for card in integration_cards:
integration_name = card.find('div', class_='integration_name_class').text.strip()
status = card.find('div', class_='status_class').text.strip()
description = card.find('p', class_='description_class').text.strip()

data.append({
'Integration Name': integration_name,
'Status': status,
'Description': description
})

# 将数据转换为DataFrame并保存到Excel
df = pd.DataFrame(data)
df.to_excel('integrations.xlsx', index=False)

# 将数据保存到JSON文件
with open('integrations.json', 'w') as json_file:
json.dump(data, json_file)

我们可以看到,上一节提到的所有问题在这里都适用。如果我将集成类的名称从“integration_name_class”改为其他名称,这个脚本就会失效。这不好。

此外,我仍然需要花时间编写代码来扁平化我的JSON。这并不理想,因为我可能更希望有一个单独的流程来处理这个,而不是实时处理(如果我在大规模操作的话)。

然而,通过访问可以轻松下载的原始HTML,这可以传递给Open AI,并提示请求结构化数据。它会如期返回:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import boto3
import requests
from bs4 import BeautifulSoup
import openai
import pandas as pd

# AWS S3配置
s3 = boto3.client('s3')
bucket_name = 'your-bucket-name'

# 将网页保存到S3的函数
def save_webpage_to_s3(url, file_name):
response = requests.get(url)
s3.put_object(Bucket=bucket_name, Key=file_name, Body=response.content)
return f"s3://{bucket_name}/{file_name}"

# 从S3加载网页并提取数据的函数
def extract_data_from_html_s3(file_name):
obj = s3.get_object(Bucket=bucket_name, Key=file_name)
html_content = obj['Body'].read().decode('utf-8')

# 将HTML内容发送到OpenAI进行处理
response = openai.Completion.create(
engine="text-davinci-002",
prompt="从这段HTML中提取带有状态和描述的集成列表: " + html_content,
max_tokens=1024
)

# 将响应转换为DataFrame
data = response.choices[0].text
df = pd.read_json(data)

# 将DataFrame保存回S3为CSV
csv_buffer = StringIO()
df.to_csv(csv_buffer)
s3.put_object(Bucket=bucket_name, Key='integrations.csv', Body=csv_buffer.getvalue())

# 主执行流程
url_to_save = "https://www.getorchestra.io/integrations"
html_file_name = "webpage.html"
save_webpage_to_s3(url_to_save, html_file_name)
extract_data_from_html_s3(html_file_name)

代码稍多一些,但只要你对Open AI API返回的数据结构满意,需要做的工作就少得多。

利用LLM(大型语言模型)使整个解析HTML的过程变得冗余/简化,而且由于LLM足够智能,能够推断出随时间变化的架构更改的影响。

此外,这个过程很容易扩展。它基本上只是保存轻量级文件并进行API调用(可以同步/异步进行),这是一个经典的ELT流程

AI驱动的网页抓取工具

众所周知,LLMs会产生幻觉 ,无法保证从LLM获得的响应始终是正确格式。

因此,涌现了大量AI驱动的网页抓取API,您可以利用上述模式,确保不一致的数据成为他人的问题,而非您的困扰。

Nimble

Nimble 是一个支持 AI 的网络抓取 API,数据工程师可以利用它从互联网上的数据源中可靠地提取数据,并将其存入 S3 或 GCS 存储桶。

它处理了“解封”(即我们之前提到的代理服务器问题)等较为棘手的方面,并为某些网站类型封装了专属模型,这些模型实质上提供了自动化解析(或称为“Nimble 技能”)。

其中包括搜索引擎结果页面(“SERP”)API、专注于电商平台的 API(用于访问价格数据)、地图 API(尽管 GMaps 有自己的 API )以及一个多用途的网络 API。

对于市场研究公司或零售商而言,这里存在着一些极其强大的应用场景,特别是在收集情报方面,而 SERP 功能对于实时监控某些关键词的表现极为有用。

Diffbot

Diffbot 是一家相对较老的公司,由 Mike Tung 大约在12年前创立。其核心价值主张与我们在这篇文章中讨论的非常相似——专注于沿着两个关键维度抓取网页:准确性和规模。

他们似乎还有一些相当有趣的 自然语言 产品,可用于数据丰富(我在这里 简要提到过)。在我看来,价格也相对合理,包括免费层级(见此处 )。

其他

随着人工智能的发展,涌现出许多AI驱动的网络抓取工具,如ScrapeStorm、Octoparse等,更多工具可参见此处

这些工具的共同特点似乎包括易用的“点选式”用户界面、基础设施处理能力、顺畅的反封锁/代理网络支持,以及在需要时提供低延迟抓取的承诺。

尽管许多解决方案价格较为亲民,但规模、速度、代理网络的必要性以及网站类型等因素,都使得不同工具之间存在差异,从而影响选择。在挑选工具前,请仔细考虑您的具体需求。

结论

本文概述了数据工程师使用网络爬虫作为实时收集数据手段的基本问题。我们了解到,像Beautiful Soup和Selenium这样的技术使得这一过程成为可能,但在投资网络爬虫项目之前,仍有许多考量因素。

人工智能极大地提高了网络爬虫的便捷性、准确性和速度,市场上涌现出的以API为先的新解决方案,能够轻松嵌入模块化数据架构中,实现真正有洞察力和实用性的用例,这确实令人振奋。

如果您对数据工程师和数据团队如何利用生成式AI感兴趣,欢迎在Medium上关注我 或通过LinkedIn 与我联系。Hugo 🚀

了解更多关于Orchestra

Orchestra 是一个旨在以尽可能人性化的方式最大化数据价值的平台。它还是一个功能丰富的编排 工具,能够解决多种用例和解决方案 。我们的文档在此,但不妨也查看我们的集成 ——我们负责管理这些,以便您能立即开始使用您的管道。我们还设有博客 ,由Orchestra团队及特邀作者撰写,以及一些白皮书 供深入阅读。

  • 标题: 人工智能正在开启网络抓取的新时代
  • 作者: Barry
  • 创建于 : 2024-05-11 16:58:50
  • 更新于 : 2024-08-31 06:59:45
  • 链接: https://wx.role.fun/2024/05/11/3340eed80b484e0687ce2fa82ccbd043/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。