自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

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

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

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

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

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

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

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

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

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

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

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

利用大語言模型增強(qiáng)網(wǎng)絡(luò)抓?。阂环N現(xiàn)代化的方法-AI.x社區(qū)

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

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

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

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

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

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

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

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

LangChain與BeautifulSoup和Pydantic的集成

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

這種方法首先從靜態(tài)網(wǎng)頁中提取原始HTML,并在LLM處理之前對其進(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)頁中進(jìn)行數(shù)據(jù)抓取時,下一步是定義需要從網(wǎng)頁中抓取的 Pydantic 對象。我們需要創(chuàng)建兩個對象:

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

ActivityScraper:這是基于 Activity 的 Pydantic 封裝。該對象的目的是確保 LLM 理解需要從多個活動中抓取數(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")

最后,我們來看一下 LLM 的配置。我們將使用 LangChain 庫,該庫提供了一個出色的工具包,可幫助您入門。

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

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

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

演示和完整代碼庫

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

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

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

請隨意嘗試!

利用大語言模型增強(qiáng)網(wǎng)絡(luò)抓?。阂环N現(xiàn)代化的方法-AI.x社區(qū)

結(jié)論

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

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

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

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

譯者介紹

劉濤,51CTO社區(qū)編輯,某大型央企系統(tǒng)上線檢測管控負(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)載,請注明出處,否則將追究法律責(zé)任
收藏
回復(fù)
舉報
回復(fù)
相關(guān)推薦