网页爬虫是指自动从网站提取信息的流程。它包括获取网页,并从中提取可用于数据分析、机器学习和市场研究的信息。
网络爬虫技术简介网络爬虫(网页抓取)通常涉及以下几个步骤:
- 发送请求:抓取器向目标网站的服务器发送请求以获取网页内容。这通常通过使用如
GET
方法的HTTP请求来完成。 - 下载HTML内容:服务器回复并提供该页面的HTML内容。
- 解析HTML:获取HTML内容后,需要对其进行解析以提取特定的数据点。这通常使用如Python中的
BeautifulSoup
或lxml
库完成。 - 提取相关数据:解析之后,抓取器会使用CSS选择器、XPath或正则表达式来提取所需要的数据(例如,文本、链接、图片等)。
- 存储数据:提取的数据可以存储在各种格式中,如CSV、JSON、数据库或其他数据结构,以便进行进一步处理。
- Python库(如):
BeautifulSoup
,Scrapy
,Selenium
,Requests
,lxml
。 - 其他语言和库:JavaScript(
Puppeteer
)(例如),PHP(Goutte
),R(rvest
)等等。
使用Python和BeautifulSoup进行网页抓取的示例
pip install requests # 这会安装requests库
pip install beautifulsoup4 # 这会安装BeautifulSoup库
# 导入requests库,用于发起HTTP请求
import requests
# 导入BeautifulSoup库,用于解析HTML文档
from bs4 import BeautifulSoup
发送一个GET请求:
url = "https://example.com/news"
response = requests.get(url)
# 请求成功了吗?
if response.status_code == 200:
print("成功获取网页!")
else:
print(f"未能成功获取网页,状态码:{response.status_code}")
解析 HTML 代码 :
# 使用BeautifulSoup来解析HTML文本,结果保存在soup变量中
soup = BeautifulSoup(response.content, 'html.parser')
提取相关信息:
假设文章的标题位于带有 article-title
类的 <h2>
标签中。我们可以用以下方法提取它们:
# 把所有标题都找出来
titles = soup.find_all('h2', class_='article-title')
# 打印这些标题
for 循环中的每个 title:
print(title.text.strip())
存数据:
你可以将提取的数据存储在列表(list)、CSV文件或其他任何格式中:
导入 csv 模块
# 将文章标题存储到 CSV 文件中
with open('article_titles.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(["Title"]) # 写入表头
# 将每个标题写入 CSV 文件中
for title in titles:
writer.writerow([title.text.strip()])
使用诸如FireCrawl、ScrapeGraph AI和Jina AI(Reader AI)之类的AI工具进行网页抓取代表了一种更高级的方法来提取网站数据。这些工具利用机器学习、自然语言处理等人工智能技术,能够自动、优化并智能抓取网络数据。
FireCrawl 是一个爬取网站并将其转换为适合 LLM 处理的干净 Markdown 格式的 API 服务。它支持诸如 scrape_url
用于提取数据和 LLM 提取
使用 Pydantic 模式从 URL 中提取结构化数据等功能。你可以通过 SDK(Python、Node、Go、Rust)或 cURL 使用 API,并需要一个 API 密钥才能开始使用。该工具可以自托管,以获得更大的控制权。它与 LangChain、CrewAI 和 Llamaindex 等工具集成得很好。
FireCrawl 是一个由人工智能驱动的网页抓取 API 服务,将网站转换为干净、结构化的 Markdown 或 JSON 格式,非常适合用于与大型语言模型(LLM)一起处理数据。它采用了先进的抓取技术,并且能够与现代 AI 和 ML 工具链无缝集成,能够轻松处理复杂的数据提取任务。
FireCrawl是如何运作的- 输入URL和抓取选项:用户提供一个URL并定义抓取选项。FireCrawl然后从目标网站检索数据。
- 数据处理:服务会利用AI模型来处理内容,将其转换为结构化格式,如Markdown或JSON。
- LLM集成:输出可以直接用于像GPT或BERT这样的LLM,进行进一步的分析、摘要或数据提取。
- 网页抓取和数据提取:FireCrawl 使用
scrape_url
函数从网页抓取原始数据。 - 基于LLM的数据提取:它利用
LLM提取
通过定义自定义的 Pydantic 模型来提取结构化数据。 - 自托管:FireCrawl 可以自托管,以获得更大的控制权,适用于公开和私有部署。
- SDK支持:提供 Python、Node.js、Go 和 Rust 的支持,使其可以轻松地集成到不同的编程环境中。
- 与AI工具集成:支持与 LangChain、CrewAI 和 Llamaindex 等工具集成,增强数据检索和使用的流程。
from firecrawl 导入 Firecrawl
# 初始化 Firecrawl 客户端
firecrawl_client = Firecrawl(api_key="your_api_key")
# 定义 URL 和 提取 模式
url = "https://example.com/products"
schema = {
"product_name": {"type": "string", "path": ["title"]},
"price": {"type": "string", "path": ["price"]},
}
# 抓取 URL 并 提取 结构化 数据
response = firecrawl_client.scrape_url(url, schema)
print(response)
异步抓取
要异步爬取一个网站,请使用 crawl_url_async
方法。它返回爬取的 ID
,你可以用它来查看爬取任务的状态。该方法接受起始 URL 和可选参数作为参数。你可以通过 params
参数来设置爬取任务的额外选项,比如爬取的最大页数、允许的域名范围和输出格式。
crawl_status = app.异步爬取URL('https://firecrawl.dev', 参数={'limit': 100, '抓取选项': {'格式': ['markdown', 'html']}})
打印爬取状态(crawl_status)
查看:爬虫状态
要检查抓取任务的状态,可以使用 check_crawl_status
方法。此方法需要任务 ID 作为参数,并返回任务的当前状态。
craw_status = app.check_crawl_status("<crawl_id">)
print(crawl_status)
Jina.ai(阅读器API)
Jina AI的Reader API 是一款用于文档理解和信息提取的人工智能工具。它处理文档、PDF文件和图像,将它们转换成结构化数据。它利用机器学习模型从非结构化文本中提取答案、摘要和其他信息。
主要特点:- 问答:根据问题从文本中提取答案。
- 生成摘要:生成文档的简要摘要。
- 解析PDF和图像并提取文本:解析PDF和图像并提取文本。
- 多语言支持:支持多种语言,以实现更广泛的应用。
**reader**
: 核心功能,用于提取数据。**context-extractor**
: 帮助理解文档的上下文。**text-summarizer**
: 高效地总结内容。
用法示例:
要使用Reader API,请先初始化它用文档或URL,然后定义一个函数,比如 summarize
或 qa
,来提取或总结内容,比如。
更多详情请参考Jina Reader API介绍。
def jina_ai(url):
# 获取响应
response = requests.get("https://r.jina.ai/"+url)
# 返回响应文本
return response.text
# 使用jina_ai函数获取数据
data = jina_ai(url)
将网络信息整合进LLMs是一个关键的基础步骤,但这可能是一项具有挑战性的任务。最简单的方法是网页爬取并输入原始的HTML代码。然而,网页爬取常常比较复杂,并且可能被封锁,而原始的HTML代码包含诸如冗余内容之类的杂乱信息。Reader API通过从URL中提取核心内容并将其转换为干净、适合LLM处理的文本,解决了这些问题。这确保了您的代理程序和RAG系统能够获得高质量的输入数据。
长语言模型(LLM)有一个知识截止日期,这意味着它们无法访问最新的世界知识。这会导致诸如误导信息、过时的响应、虚构以及其他准确度问题。将生成式AI应用与现实世界信息关联起来非常重要。“Reader”允许你用最新的网络信息更新你的LLM。只需在你的查询前加上https://s.jina.ai/
,Reader就会搜索网络并返回前五个结果,包括其网址和内容,每个结果都以清晰、便于LLM处理的文本形式呈现。这样,你可以保持你的LLM及时更新,提升其准确性,并减少虚构。
网页上的图片会自动通过视觉语言模型生成说明文字。这些说明文字会被格式化为图片的alt标签输出。这为你的下游LLM提供了有用的提示,使其能够在推理和总结过程中考虑这些图片。你可以对图片提问,选择特定图片,甚至将它们的URL发送给更强大的视觉语言模型进行更详细的分析!
是的,Reader 自带 PDF 阅读功能。它兼容大多数 PDF,包括包含大量图像的 PDF,并且速度非常快,几乎闪电般。结合一个 LLM 模型,你可以轻松构建 ChatPDF 或文档分析 AI,几乎瞬间完成。
ScrapeGraphAI 是一个设计用于高级网页抓取和数据提取的 Python 库。它利用图基方法进行数据抓取,与大语言模型集成以实现智能数据解析,并提供模块支持自定义抓取任务。该库支持多种类型的图进行数据抓取,并提供额外参数以微调抓取操作,并提供性能基准以进行比较。
主要特点:- 利用图结构的抓取技术:利用图结构进行高效的数据提取。
- LLM集成:利用 AI 模型实现上下文感知抓取。
- 模块化的设计:提供给构建者、文档加载器、辅助工具、集成以及其他更多功能的多个包。
更多详情,请访问ScrapeGraphAI 文档,了解更多详情。
为什么选择ScrapegraphAI?
传统的网络抓取工具通常依赖固定的模式或手动配置从网页中提取数据。ScrapegraphAI 利用大语言模型的力量来适应网站结构的变动,减少了对开发者的持续干预需求。这种灵活性确保即使网站布局发生变化,抓取程序仍然能正常运作。
它支持多种大型语言模型,包括GPT、Gemini、Groq、Azure、Hugging Face等等,以及可以在您的机器上通过Ollama运行的本地模型。
类型
库中有一些类型的图表,每种都有其特定的目的和用途。最常见的是:
- SmartScraperGraph :一个单页抓取器,仅需用户自定义提示和一个 URL(或本地文件)即可从网页中提取信息,使用 LLM。
- SearchGraph :一个多页抓取器,仅需用户自定义提示即可从搜索引擎中提取信息,使用 LLM。它是在 SmartScraperGraph 的基础上构建的(或依赖于 SmartScraperGraph)。
- SpeechGraph :一个将答案生成为文本并通过语音合成转换为所需音频文件的流水线,需要用户自定义提示和一个 URL(或本地文件)。它是在 SmartScraperGraph 的基础上构建的。
- ScriptCreatorGraph :一个用于抓取网站的 Python 脚本(例如使用 BeautifulSoup),需要用户自定义提示和一个 URL(或本地文件)。它同样是在 SmartScraperGraph 的基础上构建的。
还有两个额外的图形能处理多个数据来源的信息。
- SmartScraperMultiGraph:类似于 SmartScraper Graph,但可以处理多个来源。
- ScriptCreatorMultiGraph:类似于 ScriptCreator Graph,但可以处理多个来源。
随着GPT-4o的引入,已经创建了两个新的强大图表。
- OmniScraperGraph:类似于 SmartScraperGraph,能够抓取并描述图片。
- OmniSearchGraph:类似于SearchGraph,OmniSearchGraph可以抓取并描述图像。
它支持多种大型语言模型,用于分析网页并提取用户所需的信息。模型可以分为对话模型和嵌入式模型。这些模型的配置信息可以在图配置字典中指定,并且可以互换使用,例如,可以分别为 llm 和嵌入定义不同的模型。
本地模型:本地模型:这些模型运行在本地机器上,无需任何API密钥即可使用
基于API的模型:这些模型托管在云端,需要使用API密钥才能访问。
ollama pull llama3
ollama pull nomic-embed-text
# 图配置
graph_config = {
"llm": { # 大型语言模型
"model": "llama3", # 模型名称为 llama3
"temperature": 0.0, # 温度参数
"format": "json", # 格式为 json
},
"embeddings": { # 嵌入向量
"model": "nomic-embed-text" # 嵌入文本模型
}
}
基于API的模型如下:
注:API是指应用程序接口,如果读者不熟悉此术语,请参考前文或脚注中的定义。模型在这里指的是在中文技术文档中常用的特定类型模型。
OpenAI# 图形配置,包括语言模型和语音合成模型的设置
graph_config = {
"llm": { # 语言模型
"api_key": "OPENAI_API_KEY",
"model": "gpt-3.5-turbo",
"temperature": 0.7, # 温度(控制输出的随机性)
},
"tts_model": { # 语音合成模型
"api_key": "OPENAI_API_KEY",
"model": "tts-1",
"voice": "alloy" # 音色(语音合成的音色)
},
}
双子
graph_config = {
"llm": {
"api_key": "GEMINI_API_KEY",
"model": "gemini-pro"
},
}
Groq
graph_config = {
"大语言模型": {
"model": "groq/gemma-7b-it",
"API密钥": "GROQ_API_KEY",
"采样温度": 0
},
"嵌入式模型": {
"model": "ollama/nomic-embed-text",
},
}
微软 Azure
llm_model_instance = AzureChatOpenAI(
openai_api_version="AZURE_OPENAI_API_VERSION",
azure_deployment="AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"
)
embedder_model_instance = AzureOpenAIEmbeddings(
azure_deployment="AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME",
openai_api_version="AZURE_OPENAI_API_VERSION",
)
# 设 model_tokens 为 100K
model_tokens_count = 100000
graph_config = {
"llm": {
"model_instance": llm_model_instance,
"model_tokens": model_tokens_count,
},
"embeddings": {
"model_instance": embedder_model_instance
}
}
拥抱脸 Hub
llm_model_instance = HuggingFaceEndpoint(
repo_id="mistralai/Mistral-7B-Instruct-v0.2",
max_length=128, # 最大长度设置为128
temperature=0.5, # 温度设置为0.5
token="HUGGINGFACEHUB_API_TOKEN" # API令牌
)
embedder_model_instance = HuggingFaceInferenceAPIEmbeddings(
api_key="HUGGINGFACEHUB_API_TOKEN", # API密钥
model_name="sentence-transformers/all-MiniLM-l6-v2" # 模型名称
)
graph_config = {
"llm": {
"model_instance": llm_model_instance # LLM模型实例
},
"embeddings": {
"model_instance": embedder_model_instance # 嵌入模型实例
}
}
这些是几个用于抓取和爬虫数据信息的AI工具。