当前位置: 首页 > 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 文本格式存储的数值在排序时不符合预期 当我们需要进行排序的时候…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

Axure Rp 11 安装、汉化、授权

Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接&#xff1a;https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...

自定义线程池1.2

自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本&#xff0c;将线程池中的线程数量交给使用者决定&#xff0c;并且将线程的创建延迟到任务提交的时候&#xff0c;在本文中我们将对这个版本进行如下的优化&#xff1a; 在新建线程时交给线程一个任务。让线程在某种情况下…...

IP选择注意事项

IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时&#xff0c;需要考虑以下参数&#xff0c;然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总&#xff08;最简化&#xff09;_底部的附件列表中】: ffmpeg - lzip…...

Linux——TCP和UDP

一、TCP协议 1.特点 TCP提供的是面向连接、可靠的、字节流服务。 2.编程流程 &#xff08;1&#xff09;服务器端的编程流程 ①socket() 方法创建套接字 ②bind()方法指定套接字使用的IP地址和端口。 ③listen()方法用来创建监听队列。 ④accept()方法处理客户端的连接…...

云原生技术驱动 IT 架构现代化转型:企业实践与落地策略全解

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、背景&#xff1a;IT 架构演进的战略拐点 过去十年&#xff0c;企业 IT 架构经历了从传统集中式架构到分布式架构的转型。进入云计算…...