利用大语言模型增强网络抓取:一种现代化的方法

本文将探讨大语言模型(LLMs)与网络抓取的集成,以及如何利用LLMs高效地将复杂的HTML转换为结构化的JSON。

作为一名数据工程师,我的职业生涯可以追溯到2016年。那时,我的主要职责是利用自动化工具从不同网站上获取海量数据,这个过程被称为“网络抓取”。网络抓取通常是从网站的HTML代码中提取所需数据。

在构建相关应用程序时,我不得不深入研究HTML代码,努力寻找最佳的抓取解决方案。我所面临的主要挑战之一是应对网站的频繁变化:例如,我所抓取的亚马逊页面每一到两周就会发生结构上的变化。

当我开始阅读有关大语言模型(LLMs)的文献,我突然意识到:能否利用LLMs来规避我之前在网页结构化数据方面所遇到的种种问题?让我们探讨一下,看看是否能够实现这一目标。

网络抓取工具和技术

在网络抓取领域,工具和技术的选择至关重要,当时,我主要使用的工具包括Requests、BeautifulSoup和Selenium。每种工具都有不同的用途,各自针对不同类型的网络环境。

  • Requests 是一个基于Python的HTTP库,旨在简化HTTP请求的发送和响应的接收,通常被用于获取可由BeautifulSoup解析的HTML内容。
  • BeautifulSoup 则是一款基于Python的HTML/XML解析库,它能够构建解析树,方便开发者访问页面中的各种元素。通常情况下,BeautifulSoup会与其他库(如Requests或Selenium)结合使用,对从这些库获取的HTML源代码进行解析。
  • Selenium 主要应用于包含大量JavaScript的网站。与BeautifulSoup不同的是,Selenium除了能分析HTML代码外,还能通过模拟用户操作(如点击和滚动)与网站进行交互。这有助于从动态网站中获取数据。

在网络抓取过程中,这三种工具是必不可少的利器。然而,它们也带来了一定的挑战:由于网站布局和结构的变化,开发者不得不定期更新代码、标签和元素,这无疑增加了长期维护的复杂性。

什么是大语言模型(LLMs)?

大语言模型(LLMs)被视为下一代计算机程序,它们可以通过阅读和分析海量文本数据进行学习。在当今时代,LLMs具备了以人类般的叙述方式进行写作的惊人能力,使其成为处理语言和理解人类语言的高效工具。这种出色的能力在需要深入把握文本上下文的场景中表现尤为突出。

将LLMs集成入网络抓取

在网络抓取实施过程中,LLMs可以带来极大优化。我们只需将网页的HTML代码输入到LLM中,LLM即可提取出其中所涉及的对象。因此,这种策略有助于简化维护,原因在于即使标记结构发生了变化,内容本身通常也会固定不变。

将大语言模型(LLMs)集成入网络抓取的工作流程大致如下:

获取HTML:使用Selenium或Requests等工具获取网页的HTML内容。其中,Selenium适用于处理包含JavaScript的动态页面内容,而Requests则更适合静态页面。

解析HTML:使用BeautifulSoup,我们可以将HTML解析为文本,从而去除HTML中的噪音数据(页脚、页眉等)。

创建Pydantic模型:定义需抓取数据对象的Pydantic模型。这一步确保了待抓取数据的类型和结构符合预定义的模式。

为LLMs生成提示:设计一个提示语,明确告知LLM应该提取哪些信息。

LLM处理:使用LLM模型读取HTML内容,理解其语义,并根据数据处理和结构化的指令进行操作。

结构化数据的输出:LLM将以Pydantic模型定义的结构化对象形式提供输出。

上述工作流程有助于利用LLMs将HTML(非结构化数据)转化为结构化数据,从而解决了网页源HTML设计不规范或动态修改所带来的问题。

LangChain与BeautifulSoup和Pydantic的集成

以下是我们选择的静态网页示例,目标是从中抓取所有列出的活动,并以结构化的方式呈现。

这种方法首先从静态网页中提取原始HTML,并在LLM处理之前对其进行清理。

from bs4 import BeautifulSoup
import requests


def extract_html_from_url(url):
    try:
        # Fetch HTML content from the URL using requests
        response = requests.get(url)
        response.raise_for_status()  # Raise an exception for bad responses (4xx and 5xx)

        # Parse HTML content using BeautifulSoup
        soup = BeautifulSoup(response.content, "html.parser")
        excluded_tagNames = ["footer", "nav"]
        # Exclude elements with tag names 'footer' and 'nav'
        for tag_name in excluded_tagNames:
            for unwanted_tag in soup.find_all(tag_name):
                unwanted_tag.extract()

        # Process the soup to maintain hrefs in anchor tags
        for a_tag in soup.find_all("a"):
            href = a_tag.get("href")
            if href:
                a_tag.string = f"{a_tag.get_text()} ({href})"

        return ' '.join(soup.stripped_strings)  # Return text content with preserved hrefs

    except requests.exceptions.RequestException as e:
        print(f"Error fetching data from {url}: {e}")
        return None

当我们从网页中进行数据抓取时,下一步是定义需要从网页中抓取的 Pydantic 对象。我们需要创建两个对象:

Activity:这是一个 Pydantic 对象,用于表示与活动相关的所有元数据,其中指定了属性和数据类型。我们已将某些字段标记为可选,以防它们在所有活动中均不可用。为属性提供描述、示例和任何元数据将有助于更好地定义。

ActivityScraper:这是基于 Activity 的 Pydantic 封装。该对象的目的是确保 LLM 理解需要从多个活动中抓取数据。

from pydantic import BaseModel, Field
from typing import Optional

class Activity(BaseModel):
    title: str = Field(description="The title of the activity.")
    rating: float = Field(description="The average user rating out of 10.")
    reviews_count: int = Field(description="The total number of reviews received.")
    travelers_count: Optional[int] = Field(description="The number of travelers who have participated.")
    cancellation_policy: Optional[str] = Field(description="The cancellation policy for the activity.")
    description: str = Field(description="A detailed description of what the activity entails.")
    duration: str = Field(description="The duration of the activity, usually given in hours or days.")
    language: Optional[str] = Field(description="The primary language in which the activity is conducted.")
    category: str = Field(description="The category of the activity, such as 'Boat Trip', 'City Tours', etc.")
    price: float = Field(description="The price of the activity.")
    currency: str = Field(description="The currency in which the price is denominated, such as USD, EUR, GBP, etc.")

    
class ActivityScrapper(BaseModel):
    Activities: list[Activity] = Field("List of all the activities listed in the text")

最后,我们来看一下 LLM 的配置。我们将使用 LangChain 库,该库提供了一个出色的工具包,可帮助您入门。

其中一个关键组件是 PydanticOutputParser。它将把我们的对象转换为指令(如提示中所示),并解析 LLM 的输出,以获取相应的对象列表。

from langchain.prompts import PromptTemplate
from langchain.output_parsers import PydanticOutputParser
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv

load_dotenv()

llm = ChatOpenAI(temperature=0)
output_parser = PydanticOutputParser(pydantic_object = ActivityScrapper)

prompt_template = """
You are an expert making web scrapping and analyzing HTML raw code.
If there is no explicit information don't make any assumption.
Extract all objects that matched the instructions from the following html
{html_text}
Provide them in a list, also if there is a next page link remember to add it to the object.
Please, follow carefulling the following instructions
{format_instructions}
"""

prompt = PromptTemplate(
    template=prompt_template,
    input_variables=["html_text"],
    partial_variables={"format_instructions": output_parser.get_format_instructions}
)

chain = prompt | llm | output_parser

在这一步中,您需要调用链式模型并检索结果。

url = "https://www.civitatis.com/es/budapest/"
html_text_parsed = extract_html_from_url(url)
activites = chain.invoke(input={
    "html_text": html_text_parsed
})
activites.Activities

这就是抓取出来的数据,整个网页抓取耗时46 秒。

[Activity(title='Paseo en barco al anochecer', rating=8.4, reviews_count=9439, travelers_count=118389, cancellation_policy='Cancelación gratuita', description='En este crucero disfrutaréis de las mejores vistas de Budapest cuando se viste de gala, al anochecer. El barco es panorámico y tiene partes descubiertas.', duration='1 hora', language='Español', category='Paseos en barco', price=21.0, currency='€'),
 Activity(title='Visita guiada por el Parlamento de Budapest', rating=8.8, reviews_count=2647, travelers_count=34872, cancellation_policy='Cancelación gratuita', description='El Parlamento de Budapest es uno de los edificios más bonitos de la capital húngara. Comprobadlo vosotros mismos en este tour en español que incluye la entrada.', duration='2 horas', language='Español', category='Visitas guiadas y free tours', price=27.0, currency='€')
 ...
]

演示和完整代码库

我创建了一个使用Streamlit的快速演示,可以在此处访问。

在这个演示中,您将了解有关模型的详细信息。您可以根据需要添加多行文本,并为每个属性指定名称、类型和描述。这将自动生成一个Pydantic模型,用于在网页抓取组件中使用。

接下来的部分允许您输入一个URL地址,并通过点击网页上的按钮来抓取所有数据。当抓取完成后,会出现一个下载按钮,允许您以JSON格式下载数据。

请随意尝试!

结论

当处理非结构化数据时,LLM确实为从非结构化数据(如网站、PDF等)中高效提取数据提供了新的可能性。自动化网络抓取不仅可以节省时间,还可以确保检索到的数据质量。

然而,将原始HTML发送给LLM可能会增加令牌成本并降低效率。这是因为HTML通常包含各种标签、属性和内容,导致成本迅速上升。

因此,在使用LLM作为网络数据提取器时,预处理和清理HTML是关键的一步。我们应该删除所有不必要的元数据和非实际使用的信息,以保持合理的成本。

总之,选择正确的工具对于正确的工作至关重要!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/643278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络模型-策略路由配置

在实际网络应用中,策略路由也是一种重要的技术手段。尽管在考试并不注重策略路由,但是实际上应用较多建议考生除了掌握基本的静态路由协议IP route-static,动态路由协议RIP、还要掌握如何配置策略路由。策略路由的基本原理:根据ACL定义的不同…

云界洞见:移动云服务开启技术创新与问题解决的新篇章

一、什么是移动云 移动云以“央企保障、安全智慧、算网一体、属地服务”为品牌支撑,聚焦智能算力建设,打造一朵智能、智慧、安全可信可控的云,提供更优质的算力服务,引领云计算产业发展。 那么下面博主带领大家了解移动云的优势所…

Golang单元测试

文章目录 传统测试方法基本介绍主要缺点 单元测试基本介绍测试函数基准测试示例函数 传统测试方法 基本介绍 基本介绍 代码测试是软件开发中的一项重要实践,用于验证代码的正确性、可靠性和预期行为。通过代码测试,开发者可以发现和修复潜在的错误、确保…

【vue-cli搭建vue项目的过程2.x】

vue-cli搭建vue项目 vue-cli搭建vue项目安装node安装vue-cli脚手架并创建项目安装 Ant Design Vue或element-ui(笔者使用Ant-design-vue组件,并全局引入)开发安装三方库包1、Package.json文件---引入如下package.json文件执行npm i或npm install命令即可下载如下依赖…

Cloudflare Worker 部署bingai

Cloudflare Worker 部署 1. 注册 Cloudflare 账号 2. 一键部署 登录账户后, 点击下面链接 https://deploy.workers.cloudflare.com/?urlhttps://github.com/Harry-zklcdc/go-proxy-bingai 点击「Authorize Workers」, 登录 Github 账号授权 Cloudflare 点击「I have a ac…

输入输出(3)——C++的标准输入流

目录 一、cin 流 二、成员函数 get 获取一个字符 (一)无参数的get函数。 (二)有一个参数的get函数。 (三)有3个参数的get函数 (四)用成员函数 getline 函数读取一行字符 (五)用成员函数 read 读取一串字符 (六)istream 类…

【Basic】Upload-Labs-Linux

文章目录 前言Pass-01Pass-02Pass-03Pass-04Pass-05Pass-06Pass-07Pass-08Pass-09Pass-10Pass-11Pass-12Pass-13Pass-14Pass-15Pass-16解题感悟 前言 美好的一天从刷题开始 Pass-01 我淦20道题???一道一道来吧 先看第一道题 先在home里搞一…

蜂窝物联四情监测:助力农业升级,科技赋能打造丰收新篇章!

农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机,可实时监测基地状况,可以提高监测的效率和准确性,为农业生产提供及时、科学的数据支持&#xff…

碌时刻必备!微信自动回复让你告别消息堆积

在忙碌的时候,我们往往会面临消息堆积如山的情况。无法及时回复消息不仅容易造成交流障碍,还可能错过重要的机会。 但是现在,有一个神奇的工具——个微管理系统,可以帮助我们轻松应对这个问题 ,实现微信自动回复。 首…

基于YOLOv8+PySide6的快递分类管理系统

1、背景 随着电子商务的飞速发展,快递行业所承受的数据处理需求愈发庞大。在这样的背景下,传统的手工分类方法已经显得力不从心,因其不仅耗时耗力,还存在着易出错的隐患。因此,迫切需要研发出一套高效而准确的自动化系…

解决问题:Collecting package metadata (current_repodata.json)--faile

目录 解决步骤: 1、创建pip.ini文件:winR对话框中复制输入:%APPDATA%,然后回车。 2、conda添加清华源: 3、这些创建完,重启电脑就可以创建你的虚拟环境了 4、利用镜像源下载库: 5、查看to…

F.费用报销【蓝桥杯】/01背包

费用报销 01背包 思路&#xff1a;f[i][j]表示前i个票据在容量为j的背包中能占的最大值。 #include<iostream> #include<algorithm> using namespace std; int day[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int dp[1005][5005]; int s[13]; int last[1005];…

Vue从入门到实战Day07

一、vuex概述 目标&#xff1a;明确vuex是什么&#xff0c;应用场景&#xff0c;优势 1. 是什么&#xff1a; vuex是一个vue的状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数据&#xff08;多组件共享的…

01.msf

文章目录 永恒之蓝下载msfconsolemsfvenom 永恒之蓝 下载 msdn.itellyou.cn msfconsole M e t a s p l o i t C y b e r M i s s i l e C o m m a n d Metasploit Cyber Missile Command MetasploitCyberMissileCommand 的简称 search ms17_010 use 0 或者 use exploit/wind…

WordPress国外超人气主题Vikinger汉化版

WordPress国外超人气主题Vikinger汉化版 前言效果图安装教程领取主题下期更新预报 前言 我们在上一个教程已经学过如何安装WordPress&#xff0c;所以现在不用多说。 效果图 安装教程 下载后先本地解压&#xff0c;找到vikinger.zip文件&#xff0c;上传安装并启用主题。 访…

什么是SSL证书?如何选择SSL证书?

在浏览网站的时候&#xff0c;你会不会有这样一些疑问。 为什么有的网站是http://开头&#xff0c;有的却是https://&#xff1f;它们有什么区别吗&#xff1f; 经常访问的网站&#xff0c;浏览器突然提示“安全证书过期”&#xff0c;提醒你不要浏览该网址&#xff1f; 这一切…

算法打卡 Day13(栈与队列)-滑动窗口最大值 + 前 K 个高频元素 + 总结

文章目录 Leetcode 239-滑动窗口最大值题目描述解题思路 Leetcode 347-前 K 个高频元素题目描述解题思路 栈与队列总结 Leetcode 239-滑动窗口最大值 题目描述 https://leetcode.cn/problems/sliding-window-maximum/description/ 解题思路 在本题中我们使用自定义的单调队列…

腾讯面试:如何提升Kafka吞吐量?

面试题大全&#xff1a;www.javacn.site Kafka 是一个分布式流处理平台和消息系统&#xff0c;用于构建实时数据管道和流应用。它最初由 LinkedIn 开发&#xff0c;后来成为 Apache 软件基金会的顶级项目。 Kafka 特点是高吞吐量、分布式架构、支持持久化、集群水平扩展和消费组…

【JavaScript】初识 Promise

出现原由 先看一个例子&#xff1a; 模拟发送表白信息&#xff0c;如果一个失败&#xff0c;那么再给其他人发送&#xff0c;这时就相当于在失败回调函数中套了一层回调&#xff1b;如果后续还有多个表白对象&#xff0c;那么将一层一层地嵌套下去&#xff0c;也就是回调地狱…

牛客NC367 第K个n的排列【困难 dfs,全排列问题 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1595969179464e4c940a90b36abb3c54 思路 全排列问题本文提供的答案在力扣同一道题60. 排列序列&#xff0c;超时了但是截止文章发表日&#xff0c;牛客上是能通过全部测试用例的Java代码 import java.util.*;pu…