Python-04BeautifulSoup网络爬虫

news2025/3/5 21:48:48

2025-03-04-BeautifulSoup网络爬虫

记录BeautifulSoup网络爬虫的核心知识点


文章目录

  • 2025-03-04-BeautifulSoup网络爬虫
    • @[toc]
    • 1-参考网址
    • 2-学习要点
    • 3-核心知识点
      • 1. 安装
      • 2. 导入必要的库
      • 3. 发送 HTTP 请求
      • 4. 创建 BeautifulSoup 对象
      • 5. 解析 HTML 内容
        • 5.1 查找标签
        • 5.2 根据属性查找
        • 5.3 CSS 选择器
      • 6. 获取标签内容和属性
        • 6.1 获取标签文本内容
        • 6.2 获取标签属性值
      • 7. 处理嵌套标签
      • 8. 处理编码问题
      • 9. 异常处理
      • 10. 遵守网站规则
    • 4-常用方法
      • 1-属性与方法
      • 2-其他属性
      • 3-查找方法
    • 5-代码示例
      • 1-网页搜索
      • 2-网页标题
      • 3-网页编码
      • 4-查询标签a
      • 5-查询标签p
      • 6-查询父标签
      • 7-查询div
      • 8-查询CSS
      • 9-更新网页
      • 10-转化网页
      • 11-lxml进行XPath查找

1-参考网址

  • Python爬虫–BeautifulSoup:https://blog.csdn.net/weixin_45953332/article/details/145971342
  • 个人尝试代码仓库:https://gitee.com/enzoism/beautifulsoup

2-学习要点

  • 1)进行网页请求-打印网页内容
  • 2)进行网页请求-确保请求成功
  • 3)进行网页请求-自动检测编码
  • 4)进行网页请求-find和finaAll-href属性/文本内容
  • 5)进行网页请求-XPath表达式查找
  • 6)进行网页请求-CSS元素捕获
  • 7)进行网页请求-修改HTML内容-可修改标签的属性、文本或删除标签
  • 8)进行网页请求-转换为字符串

3-核心知识点

BeautifulSoup 是一个用于从 HTML 或 XML 文件中提取数据的 Python 库,结合合适的网络请求库(如requests)可以方便地实现网络爬虫。以下是使用
BeautifulSoup 进行网络爬虫的核心知识点:

1. 安装

使用pip来安装 BeautifulSoup 库,通常还需要安装解析器,常用的解析器有lxml(速度快)和html.parser(Python 内置)。

pip install beautifulsoup4
pip install lxml

2. 导入必要的库

在编写代码前,需要导入requests用于发送 HTTP 请求,BeautifulSoup用于解析 HTML 或 XML 内容。

import requests
from bs4 import BeautifulSoup

3. 发送 HTTP 请求

使用requests库发送 HTTP 请求,获取网页的 HTML 内容。

url = 'https://example.com'
response = requests.get(url)

# 检查请求是否成功
if response.status_code == 200:
    html_content = response.text
else:
    print(f"请求失败,状态码: {response.status_code}")

4. 创建 BeautifulSoup 对象

使用BeautifulSoup类创建一个解析对象,需要传入 HTML 内容和解析器名称。

soup = BeautifulSoup(html_content, 'lxml')

5. 解析 HTML 内容

5.1 查找标签
  • find():返回第一个匹配的标签对象。
# 查找第一个 <title> 标签
title_tag = soup.find('title')
print(title_tag)
  • find_all():返回所有匹配的标签对象列表。
# 查找所有 <a> 标签
all_links = soup.find_all('a')
for link in all_links:
    print(link)
5.2 根据属性查找

可以通过attrs参数或直接指定属性名来查找具有特定属性的标签。

# 查找所有 class 为 'example-class' 的 <div> 标签
divs = soup.find_all('div', class_='example-class')
for div in divs:
    print(div)

# 查找所有 id 为 'example-id' 的标签
element = soup.find(id='example-id')
print(element)
5.3 CSS 选择器

使用select()方法通过 CSS 选择器来查找标签。

# 查找所有 <p> 标签下的 <a> 标签
links_in_paragraphs = soup.select('p a')
for link in links_in_paragraphs:
    print(link)

6. 获取标签内容和属性

6.1 获取标签文本内容

使用get_text()text属性获取标签的文本内容。

# 获取 <title> 标签的文本内容
title_text = title_tag.get_text()
print(title_text)
6.2 获取标签属性值

使用字典索引的方式获取标签的属性值。

# 获取第一个 <a> 标签的 href 属性值
first_link = soup.find('a')
if first_link:
    href_value = first_link['href']
    print(href_value)

7. 处理嵌套标签

BeautifulSoup 可以方便地处理嵌套标签,通过层层查找获取所需信息。

# 查找一个包含多个 <li> 标签的 <ul> 标签
ul_tag = soup.find('ul')
if ul_tag:
    li_tags = ul_tag.find_all('li')
    for li in li_tags:
        print(li.get_text())

8. 处理编码问题

在处理不同编码的网页时,可能需要指定编码方式。

response = requests.get(url)
response.encoding = 'utf-8'  # 指定编码方式
html_content = response.text

9. 异常处理

在网络请求和解析过程中,可能会出现各种异常,需要进行适当的异常处理。

try:
    response = requests.get(url)
    response.raise_for_status()  # 检查请求是否成功
    html_content = response.text
    soup = BeautifulSoup(html_content, 'lxml')
    # 进行后续解析操作
except requests.RequestException as e:
    print(f"请求出错: {e}")
except Exception as e:
    print(f"发生其他错误: {e}")

10. 遵守网站规则

在进行网络爬虫时,需要遵守网站的robots.txt规则,避免对网站造成过大压力。可以使用robotparser库来检查是否可以访问某个页面。

from urllib.robotparser import RobotFileParser

rp = RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
if rp.can_fetch('*', 'https://example.com'):
    # 可以进行爬取操作
    pass
else:
    print("不允许爬取该页面")

4-常用方法

1-属性与方法

以下是 BeautifulSoup 中常用的属性和方法:

方法/属性描述示例
BeautifulSoup()用于解析 HTML 或 XML 文档并返回一个 BeautifulSoup 对象。soup = BeautifulSoup(html_doc, 'html.parser')
.prettify()格式化并美化文档内容,生成结构化的字符串。print(soup.prettify())
.find()查找第一个匹配的标签。tag = soup.find('a')
.find_all()查找所有匹配的标签,返回一个列表。tags = soup.find_all('a')
.find_all_next()查找当前标签后所有符合条件的标签。tags = soup.find('div').find_all_next('p')
.find_all_previous()查找当前标签前所有符合条件的标签。tags = soup.find('div').find_all_previous('p')
.find_parent()返回当前标签的父标签。parent = tag.find_parent()
.find_all_parents()查找当前标签的所有父标签。parents = tag.find_all_parents()
.find_next_sibling()查找当前标签的下一个兄弟标签。next_sibling = tag.find_next_sibling()
.find_previous_sibling()查找当前标签的前一个兄弟标签。prev_sibling = tag.find_previous_sibling()
.parent获取当前标签的父标签。parent = tag.parent
.next_sibling获取当前标签的下一个兄弟标签。next_sibling = tag.next_sibling
.previous_sibling获取当前标签的前一个兄弟标签。prev_sibling = tag.previous_sibling
.get_text()提取标签内的文本内容,忽略所有 HTML 标签。text = tag.get_text()
.attrs返回标签的所有属性,以字典形式表示。href = tag.attrs['href']
.string获取标签内的字符串内容。string_content = tag.string
.name返回标签的名称。tag_name = tag.name
.contents返回标签的所有子元素,以列表形式返回。children = tag.contents
.descendants返回标签的所有后代元素,生成器形式。for child in tag.descendants: print(child)
.parent获取当前标签的父标签。parent = tag.parent
.previous_element获取当前标签的前一个元素(不包括文本)。prev_elem = tag.previous_element
.next_element获取当前标签的下一个元素(不包括文本)。next_elem = tag.next_element
.decompose()从树中删除当前标签及其内容。tag.decompose()
.unwrap()移除标签本身,只保留其子内容。tag.unwrap()
.insert()向标签内插入新标签或文本。tag.insert(0, new_tag)
.insert_before()在当前标签前插入新标签。tag.insert_before(new_tag)
.insert_after()在当前标签后插入新标签。tag.insert_after(new_tag)
.extract()删除标签并返回该标签。extracted_tag = tag.extract()
.replace_with()替换当前标签及其内容。tag.replace_with(new_tag)
.has_attr()检查标签是否有指定的属性。if tag.has_attr('href'):
.get()获取指定属性的值。href = tag.get('href')
.clear()清空标签的所有内容。tag.clear()
.encode()编码标签内容为字节流。encoded = tag.encode()
.is_empty_element检查标签是否是空元素(例如 <br><img> 等)。if tag.is_empty_element:
.is_ancestor_of()检查当前标签是否是指定标签的祖先元素。if tag.is_ancestor_of(another_tag):
.is_descendant_of()检查当前标签是否是指定标签的后代元素。if tag.is_descendant_of(another_tag):

2-其他属性

方法/属性描述示例
.style获取标签的内联样式。style = tag['style']
.id获取标签的 id 属性。id = tag['id']
.class_获取标签的 class 属性。class_name = tag['class']
.string获取标签内部的字符串内容,忽略其他标签。content = tag.string
.parent获取标签的父元素。parent = tag.parent

3-查找方法

方法/属性描述示例
find_all(string)使用字符串查找匹配的标签。tag = soup.find_all('div', class_='container')
find_all(id)查找指定 id 的标签。tag = soup.find_all(id='main')
find_all(attrs)查找具有指定属性的标签。tag = soup.find_all(attrs={"href": "http://example.com"})

5-代码示例

1-网页搜索

import requests
from bs4 import BeautifulSoup

# 使用 requests 获取网页内容
url = 'https://cn.bing.com/'  # 抓取bing搜索引擎的网页内容
response = requests.get(url)

# 使用 BeautifulSoup 解析网页-推荐使用 lxml 作为解析器(速度更快)
soup = BeautifulSoup(response.text, 'lxml')  # 使用 lxml 解析器
# 解析网页内容 html.parser 解析器
# soup = BeautifulSoup(response.text, ‘html.parser’)
print(soup.prettify())  # 打印网页内容


2-网页标题

import requests
from bs4 import BeautifulSoup

# 使用 requests 获取网页内容
url = 'https://cn.bing.com/'  # 抓取bing搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 确保请求成功
if response.status_code == 200:
    # 使用 BeautifulSoup 解析网页-推荐使用 lxml 作为解析器(速度更快)
    soup = BeautifulSoup(response.text, 'lxml')  # 使用 lxml 解析器
    print(soup.prettify())  # 打印网页内容
    # 查找<title>标签
    title_tag = soup.find('title')
    # 打印标题文本
    if title_tag:
        print(title_tag.get_text())
    else:
        print("未找到<title>标签")

else:
    print('请求失败')


3-网页编码

import chardet
import requests
from bs4 import BeautifulSoup

# 使用 requests 获取网页内容
url = 'https://cn.bing.com/'  # 抓取bing搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 使用 chardet 自动检测编码
encoding = chardet.detect(response.content)['encoding']
print(encoding)
response.encoding = encoding
# 确保请求成功
if response.status_code == 200:
    # 使用 BeautifulSoup 解析网页-推荐使用 lxml 作为解析器(速度更快)
    soup = BeautifulSoup(response.text, 'lxml')  # 使用 lxml 解析器
    print(soup.prettify())  # 打印网页内容
    # 查找<title>标签
    title_tag = soup.find('title')
    # 打印标题文本
    if title_tag:
        print(title_tag.get_text())
    else:
        print("未找到<title>标签")

else:
    print('请求失败')


4-查询标签a

import requests
from bs4 import BeautifulSoup

# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容

# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')

# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")

# 获取第一个 标签的 href 属性
first_link_url = first_link.get('href')
print(first_link_url)
print("----------------------------")

# 获取第一个 标签的 文本 属性
first_link_text = first_link.text.strip()
print(first_link_text)
print("----------------------------")

# 查找所有a标签
all_links = soup.find_all('a')
print(all_links)


5-查询标签p

import requests
from bs4 import BeautifulSoup

# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容

# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')

# 获取第一个 标签中的文本内容
paragraph_text = soup.find('p').get_text()

# 获取页面中所有文本内容
all_text = soup.get_text()
print(all_text)


6-查询父标签

import requests
from bs4 import BeautifulSoup

# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容

# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')

# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")

# 获取第一个 标签的 href 属性
first_link_url = first_link.get('href')
print(first_link_url)
print("----------------------------")

# 获取当前标签的父标签
parent_tag = first_link.parent
print(parent_tag.get_text())


7-查询div

import requests
from bs4 import BeautifulSoup

# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容

# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')

# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")

# 查找所有 class="example-class" 的 <div> 标签
divs_with_class = soup.find_all('div', class_='example-class')
print(divs_with_class)
print("----------------------------")

# 查找具有 id="su" 的 <p> 标签
unique_input = soup.find('input', id='su')
print(unique_input)
# 获取 input 输入框的值
input_value = unique_input['value']
print(input_value)
print("----------------------------")


8-查询CSS

import requests
from bs4 import BeautifulSoup

# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容

# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')

# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")

# 使用CSS选择器-查找所有 class 为 'example' 的 <div> 标签
example_divs = soup.select('div.example')
print("----------------------------")

# 使用CSS选择器-查找所有 <a> 标签中的 href 属性
links = soup.select('a[href]')
print(links)
print("----------------------------")

# 使用CSS选择器-查找嵌套的 <div> 标签
nested_divs = soup.find_all('div', class_='nested')
for div in nested_divs:
    print(div.get_text())


9-更新网页

import requests
from bs4 import BeautifulSoup

# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容

# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')

# 查找第一个a标签
first_link = soup.find('a')
print(first_link)
print("----------------------------")

# 获取第一个 标签的 href 属性
first_link_url = first_link.get('href')
print(first_link_url)
# 修改第一个 标签的 href 属性
first_link['href'] = 'http://popyu.com'
# 再次打印标签的 href 属性
first_link_url = first_link.get('href')
print(first_link_url)
print("----------------------------")


10-转化网页

import requests
from bs4 import BeautifulSoup

# 指定你想要获取标题的网站
url = 'https://www.baidu.com/'  # 抓取百度搜索引擎的网页内容

# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 使用 lxml 解析器
soup = BeautifulSoup(response.text, 'lxml')

# 转换为字符串
html_str = str(soup)
print(html_str)
print("----------------------------")


11-lxml进行XPath查找

from lxml import etree

# 定义 HTML 片段
html_content = '<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>'

# 使用 lxml 的 HTML 解析器解析 HTML 内容
parser = etree.HTMLParser()
tree = etree.fromstring(html_content, parser)

# 使用 XPath 表达式查找 <a> 标签,并提取其文本内容
a_tag = tree.xpath('//a[@class="mnav"]')
if a_tag:
    text = a_tag[0].text
    print(text)
else:
    print("未找到匹配的 <a> 标签。")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring框架自带的定时任务:Spring Task详解

文章目录 一、基本使用1、配置&#xff1a;EnableScheduling2、触发器&#xff1a;Scheduled 二、拓展1、修改默认的线程池2、springboot配置 三、源码分析参考资料 一、基本使用 1、配置&#xff1a;EnableScheduling import org.springframework.context.annotation.Config…

深入探索像ChatGPT这样的大语言模型

参考 【必看珍藏】2月6日&#xff0c;安德烈卡帕西最新AI普及课&#xff1a;深入探索像ChatGPT这样的大语言模型&#xff5c;Andrej Karpathy fineweb知乎翻译介绍 fineweb-v1原始连接 fineweb中文翻译版本 Chinese Fineweb Edu数据集 查看网络的内部结果&#xff0c;可以参…

week 3 - More on Collections - Lecture 3

一、Motivation 1. Java支持哪种类型的一维数据结构&#xff1f; Java中用于在单一维度中存储数据的数据结构&#xff0c;如arrays or ArrayLists. 2. 如何在Java下创建一维数据结构&#xff1f;&#xff08;1-dimensional data structure&#xff09; 定义和初始化这些一…

机器学习11-经典网络解析

机器学习11-经典网络解析 AlexNetImageNet 大规模视觉识别挑战赛一、赛事背景与目的二、数据集与任务设置三、参赛规则与流程四、评审标准与机制五、历史与影响六、中国团队的表现 贡献解析CONV1层MaxP00L1层NORM1层CONV2层 CONV3、CONV4层CONV4&#xff0c;Max POOL3 层FC6、F…

【数据结构】链表与顺序表的比较

链表和顺序表是两种常见的数据结构&#xff0c;各有优缺点&#xff0c;适用于不同的场景。 ### 顺序表&#xff08;数组&#xff09; 顺序表在内存中连续存储元素&#xff0c;支持随机访问。 **优点&#xff1a;** 1. **随机访问**&#xff1a;通过索引直接访问元素&#xf…

【JavaScript—前端快速入门】JavaScript 基础语法

JavaScript 基础语法 1. 变量 创建变量(变量定义 / 变量声明 / 变量初始化)&#xff0c;JS 声明变量有3种方式 2. 通过打印日志&#xff0c;查看变量类型 JavaScript 是一门动态弱类型语言&#xff0c;变量可以存放不同类型的值(动态) 接下来&#xff0c;我们通过使用 log 指令…

deepseek助力运维和监控自动化

将DeepSeek与Agent、工作流及Agent编排技术结合&#xff0c;可实现IT运维与监控的智能化闭环管理。以下是具体应用框架和场景示例&#xff1a; 一、智能Agent体系设计 多模态感知Agent 日志解析Agent&#xff1a;基于DeepSeek的NLP能力&#xff0c;实时解析系统日志中的语义&a…

springboot在业务层校验对象/集合中字段是否符合要求

springboot在业务层校验对象参数是否必填 1.场景说明2.代码实现 1.场景说明 为什么不在控制层使用Validated或者Valid注解直接进行校验呢&#xff1f;例如通过excel导入数据&#xff0c;将excel数据转为实体类集合后&#xff0c;校验集合中属性是否符合要求。 2.代码实现 定义…

【UCB CS 61B SP24】Lecture 17 - Data Structures 3: B-Trees 学习笔记

本文以 2-3-4 树为例详细讲解了 B 树的概念&#xff0c;逐步分析其操作&#xff0c;并用 Java 实现了标准的多阶 B 树。 1. 2-3 & 2-3-4 Trees 上一节课中讲到的二叉搜索树当数据是随机顺序插入的时候能够使得树变得比较茂密&#xff0c;如下图右侧所示&#xff0c;时间复…

论文阅读笔记:UniFace: Unified Cross-Entropy Loss for Deep Face Recognition

论文阅读笔记&#xff1a;UniFace: Unified Cross-Entropy Loss for Deep Face Recognition 1 背景2 创新点3 方法3.1 回顾softmax损失3.2 统一交叉熵损失3.3 人脸验证中的UCE损失3.4 进一步的优化3.4.1 边际UCE损失3.4.2 平衡BCE损失 4 实验4.1 消融实验4.2 和SOTA方法对比 论…

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十) 收发消息

1.聊天框 首先我们完善前端的消息输入框 components下面新建MessageInput组件 import { useState,useRef } from "react" import {X,Image,Send} from "lucide-react"import { useChatStore } from "../store/useChatStore" import toast from…

5分钟看懂Deepseek开源周之六:Deepseek-V3/R1推理系统设计----揭开深度求索模型系统设计和运营成本之谜

前言 众所周知&#xff0c;四大天王一般有五个人。所以开源周五连发有第六天也很正常。贴上了开源周活动的github主贴&#xff0c;大家可以不上推特就能了解详情。 deepseek-ai/open-infra-index: Production-tested AI infrastructure tools for efficient AGI development a…

C++发展

目录 ​编辑C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&a…

动态规划/贪心算法

一、动态规划 动态规划 是一种用于解决优化问题的算法设计技术&#xff0c;尤其适用于具有重叠子问题和最优子结构性质的问题。它通过将复杂问题分解为更简单的子问题&#xff0c;并保存这些子问题的解以避免重复计算&#xff0c;从而提高效率。 动态规划的核心思想 最优子结…

python全栈-Linux基础

python全栈-Linux基础 文章目录 Linux安装/配置网络配置配置Linux远程登录配置虚拟机内部ip配置真机的ip安装XShell和Xftp目录结构用户和用户组用户管理添加用户useradd查看用户id修改用户usermod (选项)(参数)用户密码设置passed (选项)(参数)删除用户userdel [选项] 用户名 用…

基于https虚拟主机配置

一、https介绍 http 明文&#xff0c;80/tcp https 密文&#xff0c;443/tcp 二、安全性保障 1、数据安全性 数据加密 2、数据完整性 3、验证身份的真实性、有效性 三、数据安全性 手段&#xff1a;加密 发送方加密数据&#xff0c;接收方解密数据 对称加密算法 加密、解密数据…

Kmeans算法来实现RFM指标计算步骤

K-Means&#xff08;K均值&#xff09;是一种经典的无监督聚类算法&#xff0c;主要用于将数据集划分为 KKK 个不同的簇&#xff08;Cluster&#xff09;。 它基于最小化簇内样本的平方误差&#xff0c;即最小化数据点与簇中心的距离之和。 1. K-Means 算法原理 (1) 主要步骤 …

Vue2-3 优雅的在子组件修改父组件传递过来的v-model

在子组件修改父组件传递过来的v-model&#xff0c;这样会破坏单向数据流&#xff0c;造成屎山代码&#xff0c;为了避免这个问题&#xff0c;需要给一个中间层来相对舒服的使用v-model。方法就是用computed去拦截v-model,然后在computed 里面去触发 emit 事件来修改父组件传来的…

threejs:用着色器给模型添加光带扫描效果

第一步&#xff1a;给模型添加光带 首先创建一个立方体&#xff0c;不进行任何缩放平移操作&#xff0c;也不要set position。 基础代码如下&#xff1a; 在顶点着色器代码里varying vec3 vPosition;vPosition position;获得threejs自动计算的顶点坐标插值&#xff08;也就…

1.从0搭建前端Vue项目工程

我们通过vue官方提供的脚手架Vue-cli来快速生成一个Vue的项目模板。 **注意&#xff1a;**需要先安装NodeJS&#xff0c;然后才能安装Vue-cli。 环境准备好了&#xff0c;接下来我们需要通过Vue-cli创建一个vue项目&#xff0c;然后再学习一下vue项目的目录结构。Vue-cli提供了…