国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

利用大語(yǔ)言模型增強(qiáng)網(wǎng)絡(luò)抓取:一種現(xiàn)代化的方法 原創(chuàng)

發(fā)布于 2024-5-24 08:50
瀏覽
0收藏

本文將探討大語(yǔ)言模型(LLMs)與網(wǎng)絡(luò)抓取的集成,以及如何利用LLMs高效地將復(fù)雜的HTML轉(zhuǎn)換為結(jié)構(gòu)化的JSON。

作為一名數(shù)據(jù)工程師,我的職業(yè)生涯可以追溯到2016年。那時(shí),我的主要職責(zé)是利用自動(dòng)化工具從不同網(wǎng)站上獲取海量數(shù)據(jù),這個(gè)過(guò)程被稱(chēng)為“網(wǎng)絡(luò)抓取”。網(wǎng)絡(luò)抓取通常是從網(wǎng)站的HTML代碼中提取所需數(shù)據(jù)。

在構(gòu)建相關(guān)應(yīng)用程序時(shí),我不得不深入研究HTML代碼,努力尋找最佳的抓取解決方案。我所面臨的主要挑戰(zhàn)之一是應(yīng)對(duì)網(wǎng)站的頻繁變化:例如,我所抓取的亞馬遜頁(yè)面每一到兩周就會(huì)發(fā)生結(jié)構(gòu)上的變化。

隨著我開(kāi)始閱讀有關(guān)大語(yǔ)言模型(LLMs)的文獻(xiàn),我突然意識(shí)到:能否利用LLMs來(lái)規(guī)避我之前在網(wǎng)頁(yè)結(jié)構(gòu)化數(shù)據(jù)方面所遇到的種種問(wèn)題?讓我們探討一下,看看是否能夠?qū)崿F(xiàn)這一目標(biāo)。

網(wǎng)絡(luò)抓取工具和技術(shù)

在網(wǎng)絡(luò)抓取領(lǐng)域,工具和技術(shù)的選擇至關(guān)重要,當(dāng)時(shí),我主要使用的工具包括Requests、BeautifulSoup和Selenium。每種工具都有不同的用途,各自針對(duì)不同類(lèi)型的網(wǎng)絡(luò)環(huán)境。

  • Requests 是一個(gè)基于Python的HTTP庫(kù),旨在簡(jiǎn)化HTTP請(qǐng)求的發(fā)送和響應(yīng)的接收,通常被用于獲取可由BeautifulSoup解析的HTML內(nèi)容。
  • BeautifulSoup 則是一款基于Python的HTML/XML解析庫(kù),它能夠構(gòu)建解析樹(shù),方便開(kāi)發(fā)者訪問(wèn)頁(yè)面中的各種元素。通常情況下,BeautifulSoup會(huì)與其他庫(kù)(如Requests或Selenium)結(jié)合使用,對(duì)從這些庫(kù)獲取的HTML源代碼進(jìn)行解析。
  • Selenium 主要應(yīng)用于包含大量JavaScript的網(wǎng)站。與BeautifulSoup不同的是,Selenium除了能分析HTML代碼外,還能通過(guò)模擬用戶(hù)操作(如點(diǎn)擊和滾動(dòng))與網(wǎng)站進(jìn)行交互。這有助于從動(dòng)態(tài)網(wǎng)站中獲取數(shù)據(jù)。

在網(wǎng)絡(luò)抓取過(guò)程中,這三種工具是必不可少的利器。然而,它們也帶來(lái)了一定的挑戰(zhàn):由于網(wǎng)站布局和結(jié)構(gòu)的變化,開(kāi)發(fā)者不得不定期更新代碼、標(biāo)簽和元素,這無(wú)疑增加了長(zhǎng)期維護(hù)的復(fù)雜性。

什么是大語(yǔ)言模型(LLMs)?

大語(yǔ)言模型(LLMs)被視為下一代計(jì)算機(jī)程序,它們可以通過(guò)閱讀和分析海量文本數(shù)據(jù)進(jìn)行學(xué)習(xí)。在當(dāng)今時(shí)代,LLMs具備了以人類(lèi)般的敘述方式進(jìn)行寫(xiě)作的驚人能力,使其成為處理語(yǔ)言和理解人類(lèi)語(yǔ)言的高效工具。這種出色的能力在需要深入把握文本上下文的場(chǎng)景中表現(xiàn)尤為突出。

將LLMs集成入網(wǎng)絡(luò)抓取

在網(wǎng)絡(luò)抓取實(shí)施過(guò)程中,LLMs可以帶來(lái)極大優(yōu)化。我們只需將網(wǎng)頁(yè)的HTML代碼輸入到LLM中,LLM即可提取出其中所涉及的對(duì)象。因此,這種策略有助于簡(jiǎn)化維護(hù),原因在于即使標(biāo)記結(jié)構(gòu)發(fā)生了變化,內(nèi)容本身通常也會(huì)固定不變。

利用大語(yǔ)言模型增強(qiáng)網(wǎng)絡(luò)抓取:一種現(xiàn)代化的方法-AI.x社區(qū)

將大語(yǔ)言模型(LLMs)集成入網(wǎng)絡(luò)抓取的工作流程大致如下:

獲取HTML:使用Selenium或Requests等工具獲取網(wǎng)頁(yè)的HTML內(nèi)容。其中,Selenium適用于處理包含JavaScript的動(dòng)態(tài)頁(yè)面內(nèi)容,而Requests則更適合靜態(tài)頁(yè)面。

解析HTML:使用BeautifulSoup,我們可以將HTML解析為文本,從而去除HTML中的噪音數(shù)據(jù)(頁(yè)腳、頁(yè)眉等)。

創(chuàng)建Pydantic模型:定義需抓取數(shù)據(jù)對(duì)象的Pydantic模型。這一步確保了待抓取數(shù)據(jù)的類(lèi)型和結(jié)構(gòu)符合預(yù)定義的模式。

為L(zhǎng)LMs生成提示:設(shè)計(jì)一個(gè)提示語(yǔ),明確告知LLM應(yīng)該提取哪些信息。

LLM處理:使用LLM模型讀取HTML內(nèi)容,理解其語(yǔ)義,并根據(jù)數(shù)據(jù)處理和結(jié)構(gòu)化的指令進(jìn)行操作。

結(jié)構(gòu)化數(shù)據(jù)的輸出:LLM將以Pydantic模型定義的結(jié)構(gòu)化對(duì)象形式提供輸出。

上述工作流程有助于利用LLMs將HTML(非結(jié)構(gòu)化數(shù)據(jù))轉(zhuǎn)化為結(jié)構(gòu)化數(shù)據(jù),從而解決了網(wǎng)頁(yè)源HTML設(shè)計(jì)不規(guī)范或動(dòng)態(tài)修改所帶來(lái)的問(wèn)題。

LangChain與BeautifulSoup和Pydantic的集成

以下是我們選擇的靜態(tài)網(wǎng)頁(yè)示例,目標(biāo)是從中抓取所有列出的活動(dòng),并以結(jié)構(gòu)化的方式呈現(xiàn)。

這種方法首先從靜態(tài)網(wǎng)頁(yè)中提取原始HTML,并在LLM處理之前對(duì)其進(jìn)行清理。

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

當(dāng)我們從網(wǎng)頁(yè)中進(jìn)行數(shù)據(jù)抓取時(shí),下一步是定義需要從網(wǎng)頁(yè)中抓取的 Pydantic 對(duì)象。我們需要?jiǎng)?chuàng)建兩個(gè)對(duì)象:

Activity:這是一個(gè) Pydantic 對(duì)象,用于表示與活動(dòng)相關(guān)的所有元數(shù)據(jù),其中指定了屬性和數(shù)據(jù)類(lèi)型。我們已將某些字段標(biāo)記為可選,以防它們?cè)谒谢顒?dòng)中均不可用。為屬性提供描述、示例和任何元數(shù)據(jù)將有助于更好地定義。

ActivityScraper:這是基于 Activity 的 Pydantic 封裝。該對(duì)象的目的是確保 LLM 理解需要從多個(gè)活動(dòng)中抓取數(shù)據(jù)。

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")

最后,我們來(lái)看一下 LLM 的配置。我們將使用 LangChain 庫(kù),該庫(kù)提供了一個(gè)出色的工具包,可幫助您入門(mén)。

其中一個(gè)關(guān)鍵組件是 PydanticOutputParser。它將把我們的對(duì)象轉(zhuǎn)換為指令(如提示中所示),并解析 LLM 的輸出,以獲取相應(yīng)的對(duì)象列表。

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

在這一步中,您需要調(diào)用鏈?zhǔn)侥P筒z索結(jié)果。

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

這就是抓取出來(lái)的數(shù)據(jù),整個(gè)網(wǎng)頁(yè)抓取耗時(shí)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='€')
 ...
]

演示和完整代碼庫(kù)

我創(chuàng)建了一個(gè)使用Streamlit的快速演示,可以在此處訪問(wèn)。

在這個(gè)演示中,您將了解有關(guān)模型的詳細(xì)信息。您可以根據(jù)需要添加多行文本,并為每個(gè)屬性指定名稱(chēng)、類(lèi)型和描述。這將自動(dòng)生成一個(gè)Pydantic模型,用于在網(wǎng)頁(yè)抓取組件中使用。

接下來(lái)的部分允許您輸入一個(gè)URL地址,并通過(guò)點(diǎn)擊網(wǎng)頁(yè)上的按鈕來(lái)抓取所有數(shù)據(jù)。當(dāng)抓取完成后,會(huì)出現(xiàn)一個(gè)下載按鈕,允許您以JSON格式下載數(shù)據(jù)。

請(qǐng)隨意嘗試!

利用大語(yǔ)言模型增強(qiáng)網(wǎng)絡(luò)抓取:一種現(xiàn)代化的方法-AI.x社區(qū)

結(jié)論

當(dāng)處理非結(jié)構(gòu)化數(shù)據(jù)時(shí),LLM確實(shí)為從非結(jié)構(gòu)化數(shù)據(jù)(如網(wǎng)站、PDF等)中高效提取數(shù)據(jù)提供了新的可能性。自動(dòng)化網(wǎng)絡(luò)抓取不僅可以節(jié)省時(shí)間,還可以確保檢索到的數(shù)據(jù)質(zhì)量。

然而,將原始HTML發(fā)送給LLM可能會(huì)增加令牌成本并降低效率。這是因?yàn)镠TML通常包含各種標(biāo)簽、屬性和內(nèi)容,導(dǎo)致成本迅速上升。

因此,在使用LLM作為網(wǎng)絡(luò)數(shù)據(jù)提取器時(shí),預(yù)處理和清理HTML是關(guān)鍵的一步。我們應(yīng)該刪除所有不必要的元數(shù)據(jù)和非實(shí)際使用的信息,以保持合理的成本。

總之,選擇正確的工具對(duì)于正確的工作至關(guān)重要!

譯者介紹

劉濤,51CTO社區(qū)編輯,某大型央企系統(tǒng)上線檢測(cè)管控負(fù)責(zé)人。

原文標(biāo)題:Enhancing Web Scraping With Large Language Models: A Modern Approach,作者:Nacho Corcuera

鏈接:https://dzone.com/articles/enhancing-web-scraping-with-large-language-models。

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦
欧美激情综合亚洲一二区| 国产欧美精品xxxx另类| 成人在线观看视频app| 麻豆成人av在线| 国产精品一二三视频| 欧美欧美在线| 亚洲香蕉av在线一区二区三区| 国产三级视频在线播放线观看| 国产精品久久久久aaaa樱花| 国产奶头好大揉着好爽视频| 一区二区精品| 亚洲一区二区三区777| 精品国产一区二区三区噜噜噜 | 免费av在线| 亚洲成a天堂v人片| 黄色网免费看| 自拍av一区二区三区| 亚洲黄色a v| 99久久久久免费精品国产| 自拍偷拍一区二区三区| 亚洲性感美女99在线| 国产高清自拍99| 91久久中文| 欧美激情第六页| 青青草国产精品亚洲专区无| 日韩欧美一区二区三区四区| 丝袜a∨在线一区二区三区不卡| 欧洲久久久久久| 日韩综合在线视频| gogogo免费高清日本写真| 精品一区二区在线视频| 宅男av一区二区三区| 国产精品一区2区| 国产特级黄色大片| 国产女同性恋一区二区| 免费福利影院| 91高清视频免费看| av网站在线免费| 欧美成人性福生活免费看| 91福利在线免费| 一区二区三区四区在线观看视频| 亚洲伊人精品酒店| 亚州精品天堂中文字幕| 国产精品成人a在线观看| 国产有色视频色综合| 久久精品国产99久久6| 久久国产午夜精品理论片最新版本| 99re热这里只有精品免费视频| 无码内射中文字幕岛国片| 一区二区三区四区精品在线视频 | 亚洲国产欧美自拍| 少妇一区视频| 欧美国产亚洲精品久久久8v| 国产精品日韩精品中文字幕| 91久久国产综合久久蜜月精品| 中文在线不卡| 国产精品久久久久久久乖乖| 一区在线中文字幕| 成人精品一区二区三区免费 | 国产高清av在线播放| 国产麻豆精品| 日本一区二区在线免费播放| 女海盗2成人h版中文字幕| 午夜电影久久久| 久久精品午夜福利| 欧美老人xxxx18| av动漫在线观看| 国产亚洲美州欧州综合国| 成年人视频免费在线观看| 国产精品看片资源| 亚洲电影一区二区| 亚洲一区三区在线观看| 日韩亚洲欧美中文三级| 91成人午夜| 欧美色网一区| 欧美制服第一页| 香蕉久久夜色精品国产| 欧美精品在线观看播放| 91久久国产| 97免费资源站| 亚洲精品va在线观看| 91亚洲天堂| 精品国精品国产| 亚洲图片在区色| 日本午夜精品| 一区二区三区四区不卡| 亚洲美女在线一区| 午夜伦理福利在线| 成人伊人精品色xxxx视频| 老司机免费视频一区二区| 国产www在线观看| 精品对白一区国产伦| 久久av综合| 操bbb操bbb| 欧美视频专区一二在线观看| 95精品视频| 日本免费一区二区三区| 一区二区三区高清在线| 日韩另类视频| 国产综合欧美在线看| 国产拍揄自揄精品视频麻豆| 蜜臀av国内免费精品久久久夜夜| 国产精品99久久久久久久久| 国产精品77777竹菊影视小说| 一级视频在线免费观看| 日韩欧美三区| 国产精品视频免费一区二区三区| 日本一区二区三区国色天香| 97caopron在线视频| 91在线丨porny丨国产| 日韩激情一区| 97午夜影院| 3d玉蒲团在线观看| 91av俱乐部| 久久视频在线播放| www.youjizz.com在线| 国产精品成人一区二区| 成人免费视频国产在线观看| 98在线视频| 成人精品一区二区三区电影免费| 91老司机福利 在线| segui88久久综合| 久久国产一区二区| 色哟哟欧美精品| 成人短片线上看| 7878视频在线观看| 韩剧1988免费观看全集| www日韩大片| 日韩成人综合网| 奇米777四色影视在线看| 欧美一区二区三区四区五区| 亚洲精品国产偷自在线观看| 无限国产资源| 欧美中文字幕视频| 国产精品你懂的| 亚洲成人影音| 狠狠爱免费视频| 日韩中文理论片| 国产91综合一区在线观看| 91美女主播在线视频| 久久人人九九| 伊人久久大香线蕉无限次| 六月婷婷综合| 久久久久久久久久久免费视频| 白白色 亚洲乱淫| 在线手机中文字幕| 色就是色欧美| 日韩国产一二三区| 久草成色在线| 成人免费福利在线| 中文字幕的久久| 欧美影院在线| 国产色视频在线播放| 欧美激情视频在线免费观看 欧美视频免费一 | 老色鬼久久亚洲一区二区| 麻豆视频在线免费观看| 免费看污久久久| 亚洲二区中文字幕| 国产美女主播视频一区| 666av成人影院在线观看| 久久精品视频16| 久久久视频免费观看| 亚洲欧美日本在线| 中文精品电影| 久久av色综合| 黄色三级中文字幕| 97香蕉久久夜色精品国产| 精品日韩中文字幕| 久久久久久色| 99蜜月精品久久91| 欧美黑人孕妇孕交| 国产综合精品一区二区三区| 亚洲精品午夜精品| 综合av第一页| 国产欧美一区二区色老头 | 成人在线免费观看| 日韩国产欧美精品| 深夜福利91大全| 一区二区三区四区在线免费观看 | 情趣网站在线观看| 精品在线不卡| 久久精品亚洲一区| 欧美午夜精品久久久久久久| 欧美a级一区二区| 一区二区网站| 秋霞影院午夜丰满少妇在线视频| 免费日韩在线观看| 国产精品久久久久久久久久东京| 亚洲3atv精品一区二区三区| 欧美aaaaa成人免费观看视频| 天堂va欧美ⅴa亚洲va一国产| 青青操在线视频| 青青青在线观看视频| 国产精品免费小视频| 日韩精品中文字幕在线观看| 日韩毛片一二三区| 久久午夜精品| 亚洲第一福利社区| segui88久久综合9999| 中文字幕在线第一页|