当前位置: 首页 > news >正文

LangChain之网络爬虫

网络爬虫

概述

网络爬虫是LangChain中的一项关键功能,允许用户自动从互联网上收集信息。这项功能对于研究和数据收集尤其有价值,因为它可以大幅减少手动搜索和信息整理的工作量。

从网络收集内容有几个主要组件:

Search搜索:使用工具如GoogleSearchAPIWrapper查询并获取URL列表。Loading加载:将URL转换为HTML内容,使用工具如AsyncHtmlLoader或AsyncChromiumLoader。Transforming转换:将HTML内容转换为格式化文本,使用HTML2Text或BeautifulSoup等工具。	

准备

安装相关依赖库

pip install langchain-openai langchain playwright beautifulsoup4 

设置OpenAI的BASE_URL、API_Key

import osos.environ["OPENAI_BASE_URL"] = "https://xxx.com/v1"
os.environ["OPENAI_API_KEY"] = "sk-dtRXRfYzHDZQT8Cr2874xxxx13F97bF24b7a"

加载器

使用Chromium的无头实例爬取HTML内容,无头模式意味着浏览器在没有图形用户界面的情况下运行,这通常用于网页抓取。

主要有2种方式:

方式加载器描述
Python的asyncio库AsyncHtmlLoader使用该库aiohttp发出异步 HTTP 请求,适合更简单、轻量级的抓取。
PlaywrightAsyncChromiumLoader使用 Playwright 启动 Chromium 实例,该实例可以处理 JavaScript 渲染和更复杂的 Web 交互。

注意:

Chromium 是 Playwright 支持的浏览器之一,Playwright 是一个用于控制浏览器自动化的库。

from langchain_community.document_loaders import AsyncChromiumLoader# 加载HTML
loader = AsyncChromiumLoader(["https://www.langchain.com"])
html = loader.load()

转换

html2text

html2text 是一个 Python 包,它将 HTML 页面转换为干净、易于阅读的纯文本,无需任何特定的标签操作。它最适合目标是提取人类可读文本而不需要操作特定HTML元素的场景。

要使用html2text,首先需要额外安装

pip install html2text

使用示例如下:

from langchain_community.document_loaders import AsyncChromiumLoader
from langchain_community.document_transformers import Html2TextTransformer# 加载HTML
loader = AsyncChromiumLoader(["https://www.langchain.com"])
html = loader.load()# # 转换
html2text = Html2TextTransformer()
docs_transformed = html2text.transform_documents(html)# 结果
res = docs_transformed[0].page_content[0:500]
print(res)

Beautiful Soup

Beautiful Soup 提供对 HTML 内容更细粒度的控制,支持特定标签的提取、删除和内容清理。它适合根据需要提取特定信息并清理 HTML 内容的情况。

要使用Beautiful Soup,首先也是需要安装

pip install beautifulsoup4

使用示例如下

from langchain_community.document_loaders import AsyncChromiumLoader
from langchain_community.document_transformers import BeautifulSoupTransformer
# 加载HTML
loader = AsyncChromiumLoader(["https://www.langchain.com"])
html = loader.load()# # 转换
bs_transformer = BeautifulSoupTransformer()
docs_transformed = bs_transformer.transform_documents(html, tags_to_extract=["h1"])# 结果
res = docs_transformed[0].page_content[0:500]
print(res)

从HTML内容中爬取文本内容标签说明

<p>:段落标签。在HTML中定义段落,并用于组合相关句子或短语<li>:列表项标签。用于有序(<ol>)和无序(<ul>)列表中,定义列表中的各个项<div>:分区标签。块级元素,用于组合其他内联或块级元素<a>:锚点标签。用于定义超链接<span>:内联容器,用于标记文本的一部分或文档的一部分

提取

定义模式、架构​来指定想要提取的数据类型。键名很重要,因为它告诉 LLM想要什么样的信息。

# 定义模式、架构来指定想要提取的数据类型
schema = {"properties": {"all_tutorial_category": {"type": "string"},"category_item": {"type": "string"},},"required": ["all_tutorial_category"],
}

提取网页内容的爬虫实现如下

from langchain_community.document_loaders import AsyncChromiumLoader
from langchain_community.document_transformers import BeautifulSoupTransformer
from langchain_openai import ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitterllm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613")
from langchain.chains import create_extraction_chain# 定义模式、架构来指定想要提取的数据类型
schema = {"properties": {"category_item": {"type": "string"},},"required": ["category_item"],
}# 执行提取链
def extract(content: str, schema: dict):return create_extraction_chain(schema=schema, llm=llm).invoke(content)# 使用AsyncChromiumLoader加载器
def scrape_with_playwright(urls, schema):loader = AsyncChromiumLoader(urls)docs = loader.load()bs_transformer = BeautifulSoupTransformer()# 限制爬取指定标签内容docs_transformed = bs_transformer.transform_documents(docs, tags_to_extract=["h4"])print("使用 LLM 提取内容")# 获取网站的前 1000 个token文本splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=1000, chunk_overlap=0)splits = splitter.split_documents(docs_transformed)# 拆分处理extracted_content = extract(schema=schema, content=splits[0].page_content)# 打印内容# pprint.pprint(extracted_content)return extracted_contentif __name__ == '__main__':urls = ["https://www.runoob.com/"]extracted_content = scrape_with_playwright(urls, schema=schema)print(extracted_content)

执行部分日志如下,可以看出数据提前成功

text': [{'category_item': 'HTML'}, {'category_item': 'CSS'}, {'category_item': 'Bootstrap'},
{'category_item': 'Font Awesome'}, {'category_item': 'Foundation'}, {'category_item': 'JavaScript'},
{'category_item': 'HTML DOM'}, {'category_item': 'jQuery'}, ........{'category_item': 'Markdown'}, {'category_item': 'HTTP'}, 
{'category_item': 'TCP/IP'}, {'category_item': 'W3C'}]}

自动化​

可以使用检索器(如WebResearchRetriever)来自动化网络研究过程,以便使用搜索内容回答特定问题。
在这里插入图片描述

借助Google的Custom Search JSON API,以程序化地检索和显示来自可编程搜索引擎的搜索结果。,具体阅读文档创建GOOGLE_API_KEY和GOOGLE_CSE_ID

自动化爬取实现如下

from langchain.retrievers.web_research import WebResearchRetriever
from langchain_chroma import Chroma
from langchain_community.utilities import GoogleSearchAPIWrapper
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import logging
from langchain.chains import RetrievalQAWithSourcesChainimport osos.environ["GOOGLE_API_KEY"] = 'AIzaSyBNrdu0_xxxxx-Vk2nDs'
os.environ["GOOGLE_CSE_ID"] = '405fxxxxxx64ca1'# 向量存储:使用 Chroma 客户端进行初始化
vectorstore = Chroma(embedding_function=OpenAIEmbeddings(), persist_directory="./chroma_db_oai"
)# LLM
llm = ChatOpenAI(temperature=0)# 搜索
search = GoogleSearchAPIWrapper()"""
使用上述工具初始化检索器:使用 LLM 生成多个相关搜索查询(一次 LLM 调用)
对每个查询执行搜索
选择每个查询的前 K 个链接(并行多个搜索调用)
从所有选定的链接加载信息(并行抓取页面)
将这些文档索引到矢量存储中
为每个原始生成的搜索查询查找最相关的文档
"""
web_research_retriever = WebResearchRetriever.from_llm(vectorstore=vectorstore, llm=llm, search=search
)# 设置日志
logging.basicConfig()
logging.getLogger("langchain.retrievers.web_research").setLevel(logging.INFO)# 执行
user_input = "菜鸟教程网站有那些教程分类?"
qa_chain = RetrievalQAWithSourcesChain.from_chain_type(llm, retriever=web_research_retriever
)
result = qa_chain.invoke({"question": user_input})
print(result)

输出结果如下
在这里插入图片描述

相关文章:

LangChain之网络爬虫

网络爬虫 概述 网络爬虫是LangChain中的一项关键功能&#xff0c;允许用户自动从互联网上收集信息。这项功能对于研究和数据收集尤其有价值&#xff0c;因为它可以大幅减少手动搜索和信息整理的工作量。 从网络收集内容有几个主要组件&#xff1a; Search搜索&#xff1a;使用…...

VueRouter 相关信息

VueRouter 是Vue.js官方路由插件&#xff0c;与Vue.js深度集成&#xff0c;用于构建单页面应用。构建的单页面是基于路由和组件&#xff0c;路由设定访问路径&#xff0c;将路径与组件进行映射。VueRouter有两中模式 &#xff1a;hash 和 history &#xff0c;默认是hash模式。…...

[环境配置]Pycharm:Failed to start [PowerShell.exe]

解决方法&#xff0c;点Local旁边的 号&#xff0c;点击Command Prompt&#xff0c;即可在Pycharm中呼出控制台。 如果要修改Command Prompt的启动时访问的cmd.exe的路径&#xff0c;可以去Settings→Tools→Terminal中&#xff0c;修改Shell Path实现&#xff0c;改为cmd.exe…...

搜狗爬虫(www.sogou.com)IP及UA,真实采集数据

一、数据来源&#xff1a; 1、这批搜狗爬虫&#xff08;www.sogou.com&#xff09;IP来源于尚贤达猎头网站采集数据&#xff1b; ​ 2、数据采集时间段&#xff1a;2023年10月-2024年7月&#xff1b; 3、判断标准&#xff1a;主要根据用户代理是否包含“www.sogou.com”和IP核实…...

北京青蓝智慧科技ITSS服务经理:长安链ChainBridge“链桥”问世 加速国家级区块链网络互联互通

8月5日&#xff0c;据国家区块链技术创新中心消息&#xff0c;我国首个完全自主控制的区块链软硬件技术系统——长安链&#xff0c;正式推出了全场景技术平台ChainBridge“链桥”。 此平台能够支持所有异构和同构的区块链进行协作&#xff0c;满足跨领域、跨地域、跨行业及跨层…...

音视频入门基础:WAV专题(5)——FFmpeg源码中解码WAV Header的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…...

爬虫:csv存储:写入和读取

目录 csv写入 csv读取 csv写入 import csv# data [ # (tf, 20, 180), # (dl, 20, 170), # (hc, 18, 190) # ] # header (姓名,年龄,身高) # # # csv写入数据会默认写一行隔一行 newline就是让它不要有空行 # with open(text.csv,w,encodingutf8,newline) as f:…...

Opencv-绘制几何图形

1. 绘制圆形 1.1 circle()函数原型 void cv::circle(InputOutputArray img, Point center, int radius, const Scalar & color, int thickness 1, int lineType LINE_8, int shift 0 ) img&#xff1a;需要绘制圆形的图像。 center&#xff1a;圆形的圆心位置坐标。 …...

ElasticSearch安装与集群部署

ElasticSearch安装与集群部署 很多小伙伴第一次接触ElasticSearch的时候是一脸愁容,这个东西他怎么用啊,不知道从哪里安装,那我们今天就着重从哪里下载?怎么下载?怎么安装?来研究一下吧! windows下载安装ElasticSearch 下载地址&#xff1a;https://www.elastic.co/cn/do…...

盘点12款企业常用源代码加密软件,源代码防泄密很重要!

在当今的商业环境中&#xff0c;源代码作为企业的核心资产之一&#xff0c;其安全性不容忽视。源代码的泄露可能导致企业丧失竞争优势、面临法律诉讼甚至经济损失。因此&#xff0c;选择合适的源代码加密软件成为企业保护知识产权和核心技术的关键步骤。 1. 安秉源代码加密软件…...

文件上传和下载

要想实现文件上传和下载&#xff0c;其实只需要下述代码即可&#xff1a; 文件上传和下载 import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.example.common.Result; import org.springframework.web.bind.annotation.*; import org.sprin…...

机械学习—零基础学习日志(高数22——泰勒公式理解深化)

核心思想&#xff1a;函数逼近 在泰勒的年代&#xff0c;如果想算出e的0.001次方&#xff0c;这是很难计算的。那为了能计算这样的数字&#xff0c;可以尝试逼近的思想。 但是函数又不能所有地方都相等&#xff0c;那退而求其次&#xff0c;只要在一个极小的范围&#xff0c;…...

Java | Leetcode Java题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProduct(String[] words) {Map<Integer, Integer> map new HashMap<Integer, Integer>();int length words.length;for (int i 0; i < length; i) {int mask 0;String word words[i];in…...

科普文:JUC系列之多线程门闩同步器Condition的使用和源码解读

一、概述 条件锁就是指在获取锁之后发现当前业务场景自己无法处理&#xff0c;而需要等待某个条件的出现才可以继续处理时使用的一种锁。 比如&#xff0c;在阻塞队列中&#xff0c;当队列中没有元素的时候是无法弹出一个元素的&#xff0c;这时候就需要阻塞在条件notEmpty上…...

Stable Diffusion绘画 | 图生图-基础使用介绍—提示词反推

按默认设置直接出图 拖入图片值图生图框中&#xff0c;保持默认设置&#xff0c;直接生成图片&#xff0c;出图效果如下&#xff1a; 因为重绘幅度0.7&#xff0c;所出图片与原图有差异&#xff0c;但整体的框架构图与颜色与原图类似。 输入关键词后出图 在正向提示词中输入…...

正点原子imx6ull-mini-Linux驱动之Linux SPI 驱动实验(22)

跟上一章一样&#xff0c;其实这些设备驱动&#xff0c;无非就是传感器对应寄存器的读写。而这个读写是建立在各种通信协议上的&#xff0c;比如上一章的i2c&#xff0c;我们做了什么呢&#xff0c;就是把设备注册成一个i2c平台驱动&#xff0c;这个i2c驱动怎么搞的呢&#xff…...

TypeScript 函数

函数是JavaScript应用程序的基础。 它帮助你实现抽象层&#xff0c;模拟类&#xff0c;信息隐藏和模块。 在TypeScript里&#xff0c;虽然已经支持类&#xff0c;命名空间和模块&#xff0c;但函数仍然是主要的定义 行为 的地方。 TypeScript为JavaScript函数添加了额外的功能&…...

C++ : namespace,输入与输出,函数重载,缺省参数

一&#xff0c;命名空间(namespace) 1.1命名空间的作用与定义 我们在学习c的过程中&#xff0c;经常会碰到命名冲突的情况。就拿我们在c语言中的一个string函数来说吧&#xff1a; int strncat 0; int main() {printf("%d", strncat);return 0; } 当我们运行之后&…...

目标检测 | yolov1 原理和介绍

1. 简介 论文链接&#xff1a;https://arxiv.org/abs/1506.02640 时间&#xff1a;2015年 作者&#xff1a;Joseph Redmon 代码参考&#xff1a;https://github.com/abeardear/pytorch-YOLO-v1 yolo属于one-stage算法&#xff0c;仅仅使用一个CNN网络直接预测不同目标的类别与…...

excel中有些以文本格式存储的数值如何批量转换为数字

一、背景 1.1 文本格式存储的数值特点 在平时工作中有时候会从别地方导出来表格&#xff0c;表格中有些数值是以文本格式存储的&#xff08;特点&#xff1a;单元格的左上角有个绿色的小标&#xff09;。 1.2 文本格式存储的数值在排序时不符合预期 当我们需要进行排序的时候…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...