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

Python爬虫:开启数据抓取的奇幻之旅(一)

目录

一、爬虫初印象:揭开神秘面纱​

二、工欲善其事:前期准备​

(一)Python 环境搭建​

1.下载 Python 安装包:​

2.运行安装程序:​

3.配置环境变量(若自动添加失败):​

(二)开发工具推荐​

1.PyCharm:​

2.Jupyter Notebook:​

(三)必备库安装​

1.requests 库:​

2.BeautifulSoup4 库:​

3.Scrapy 框架:​

4.Selenium 库:​

三、爬虫原理剖析:探寻内在机制​

(一)发起请求​

(二)获取响应​

(三)解析内容​

(四)保存数据​


 

一、爬虫初印象:揭开神秘面纱​

在互联网这个广袤无垠的信息宇宙中,数据如同繁星般璀璨繁多。而 Python 网络爬虫,就像是一位神秘而强大的 “数据探险家”,能够按照既定规则,自动穿梭于网络世界,抓取我们所需的数据。​

从定义上来说,网络爬虫是一种自动化程序,它模仿人类在浏览器中的操作行为,向网页服务器发送请求,获取网页内容,并对这些内容进行解析和提取,从而获取有价值的数据。你可以把它想象成一个勤劳的小蜜蜂,在万维网这个大花园里,不知疲倦地采集着 “数据花蜜”。​

Python 作为当下最热门的编程语言之一,在爬虫领域有着无可比拟的优势。首先,Python 的语法简洁明了,就像一本通俗易懂的故事书,即使是编程小白也能轻松上手。相比其他编程语言,Python 代码量更少,结构更加清晰,这使得开发者能够更快速地编写和调试爬虫程序,大大提高了开发效率。例如,在 Python 中,使用requests库发送一个 HTTP 请求只需要短短一行代码:response = requests.get(url),简洁高效,一目了然。​

其次,Python 拥有丰富的爬虫库和框架,这些强大的工具就像是给爬虫配备了各种神奇的装备,让它在数据抓取的道路上如虎添翼。比如BeautifulSoup库,它可以轻松地解析 HTML 和 XML 文档,提取出我们需要的数据,就像一把精准的手术刀,能够在复杂的网页结构中准确地 “切割” 出所需信息;Scrapy框架则提供了更高级的功能,如分布式爬取、自动处理请求队列、中间件机制等,使得我们可以构建大规模、高性能的爬虫系统。​

此外,Python 还具备强大的数据处理和分析能力,这对于爬虫获取到的数据后续处理非常关键。借助Pandas和NumPy等库,我们可以对爬取到的数据进行清洗、筛选、聚合和可视化等操作,将原始数据转化为有价值的信息,为数据分析和决策提供有力支持。而且,Python 拥有庞大的开发者社区和丰富的资源,当我们在开发爬虫过程中遇到问题时,可以很容易地在社区中寻求帮助,借鉴其他开发者的经验和解决方案。​

二、工欲善其事:前期准备​

(一)Python 环境搭建​

在正式开启 Python 网络爬虫之旅前,我们首先得搭建好 Python 运行环境,这就好比为爬虫打造一个坚固的 “战车”。​

1.下载 Python 安装包:​

打开浏览器,访问 Python 官方网站(https://www.python.org/downloads/ )。在下载页面,你会看到不同版本的 Python 可供选择。强烈推荐下载最新的稳定版本,因为新版本通常会修复一些旧版本的漏洞,并且增加了新的功能。如果你不确定选择哪个版本,一般来说,选择带有 “Python 3.x” 字样的版本即可,目前 Python 3.10 及以上版本都是不错的选择 。根据你的操作系统(Windows、Mac OS 或 Linux),点击相应的下载链接。例如,在 Windows 系统下,你可以选择 “Windows installer (64-bit)” 下载 64 位的安装包,如果你的电脑是 32 位系统,则选择 “Windows installer (32-bit)” 。​

2.运行安装程序:​

下载完成后,找到下载的安装包,通常是一个以.exe结尾的文件,双击运行它。在安装向导界面,你会看到一些选项,务必勾选 “Add Python 3.x to PATH” 选项,这一步至关重要,它会自动将 Python 添加到系统的环境变量中,这样我们就可以在命令行中直接使用 Python 命令了。然后点击 “Install Now” 进行默认安装,如果你想自定义安装路径,也可以选择 “Customize installation” 来自行指定安装位置。安装过程可能需要一些时间,请耐心等待。​

3.配置环境变量(若自动添加失败):​

虽然在安装时勾选 “Add Python 3.x to PATH” 选项会自动配置环境变量,但有时可能会出现意外情况导致配置失败。这时,我们就需要手动配置环境变量。​

在 Windows 系统中,右键点击 “此电脑”,选择 “属性”,然后点击 “高级系统设置”,在弹出的窗口中点击 “环境变量” 按钮。在 “系统变量” 中找到 “Path” 变量,点击 “编辑”,在弹出的编辑环境变量窗口中,点击 “新建”,将 Python 的安装路径添加进去。例如,如果你的 Python 安装在 “C:\Python310”,就将 “C:\Python310” 和 “C:\Python310\Scripts” 添加到 Path 变量中(注意:如果你的安装路径不同,请根据实际情况修改)。添加完成后,一路点击 “确定” 保存设置。​

在 Mac OS 系统中,打开 “终端” 应用,编辑.bash_profile文件(如果没有该文件,可以创建一个)。在终端中输入nano ~/.bash_profile,然后在文件中添加export PATH="/Library/Frameworks/Python.framework/Versions/3.10/bin:$PATH"(同样,这里的路径要根据你实际安装的 Python 版本和路径进行修改),保存并退出文件(按Ctrl+X,然后按Y,最后按Enter)。最后,在终端中输入source ~/.bash_profile使配置生效。​

完成以上步骤后,打开命令行(Windows 下按Win+R,输入cmd并回车;Mac OS 下打开 “终端”),输入python --version,如果显示出你安装的 Python 版本号,恭喜你,Python 环境搭建成功!​

(二)开发工具推荐​

拥有了 Python 环境,还需要一款称手的开发工具,就像战士需要一把锋利的宝剑一样。以下两款工具在 Python 爬虫开发中备受青睐:​

1.PyCharm:​

PyCharm 是由 JetBrains 公司开发的一款专门针对 Python 的集成开发环境(IDE),功能强大到超乎想象,堪称 Python 开发者的 “瑞士军刀”。它拥有智能代码补全功能,当你输入代码时,它能自动提示可能的函数、变量和方法,大大提高了编码效率,就像有一个贴心的小助手在旁边随时提醒你一样。比如,当你输入requests.ge,它会自动提示requests.get方法,你只需按下回车键就能快速完成输入。​

它还具备强大的代码分析和调试工具。在调试爬虫程序时,你可以设置断点,逐行执行代码,观察变量的值和程序的执行流程,轻松找出代码中的问题。而且,PyCharm 支持多种 Python 框架和库,对于爬虫开发中常用的requests、BeautifulSoup等库都有很好的支持,让你可以无缝集成各种工具进行开发。此外,它还提供了丰富的插件市场,你可以根据自己的需求安装各种插件,进一步扩展其功能。​

PyCharm 适用于各种规模的项目开发,无论是小型的个人爬虫项目,还是大型的企业级数据采集系统,它都能游刃有余地应对。对于初学者来说,它友好的界面和详细的提示信息也能帮助快速上手。​

2.Jupyter Notebook:​

Jupyter Notebook 是一个开源的交互式计算环境,它以一种独特的方式展示代码和结果,就像是一个可以实时交互的笔记本。在 Jupyter Notebook 中,你可以将代码、文本、图像、数学公式等多种元素组合在一个文档中,并且可以逐行运行代码,立即看到结果,这种交互式的体验非常适合快速验证想法、进行数据分析和可视化,以及教学演示。​

例如,在进行爬虫开发时,你可以先在 Jupyter Notebook 中编写一小段代码来测试网页请求是否成功,然后逐步添加代码进行数据解析和提取,每一步的结果都能直观地展示出来,方便你随时调整和优化代码。它还支持多种编程语言,不过我们主要使用它来进行 Python 编程。​

Jupyter Notebook 特别适合数据科学和机器学习领域的项目,以及需要频繁进行代码测试和探索性开发的场景。它的分享和协作功能也非常强大,你可以将整个 Notebook 文件分享给他人,他人可以直接在自己的环境中打开并运行,方便团队之间的交流和合作。​

(三)必备库安装​

Python 的强大离不开各种丰富的库,对于网络爬虫来说,以下几个库是必不可少的 “秘密武器”:​

1.requests 库:​

requests 库是 Python 中最常用的 HTTP 请求库,它的使命就是让 HTTP 请求变得简单而优雅。使用它,你可以轻松地发送各种类型的 HTTP 请求,如 GET、POST、PUT、DELETE 等,就像给网页服务器发送一封简单的信件一样容易。例如,使用requests.get(url)就可以向指定的url发送一个 GET 请求,获取网页的内容,代码如下:

import requestsurl = 'https://www.example.com'
response = requests.get(url)
if response.status_code == 200:print(response.text)
else:print(f"请求失败,状态码:{response.status_code}")

安装 requests 库非常简单,打开命令行,输入pip install requests即可完成安装。如果你的网络连接较慢,可能需要设置一下超时时间,比如pip --default-timeout=100 install requests 。​

2.BeautifulSoup4 库:​

BeautifulSoup4(简称bs4)是一个用于解析 HTML 和 XML 文档的库,它就像一把神奇的手术刀,能够将复杂的网页结构解析成一个易于操作的树形结构,让你可以轻松地提取出所需的数据。比如,你可以使用它来查找网页中的所有链接、提取特定标签的内容等。​

以下是一个简单的示例,使用BeautifulSoup4解析 HTML 文档并提取所有链接:

from bs4 import BeautifulSouphtml = """
<html>
<head><title>示例网页</title>
</head>
<body><a href="https://www.example1.com">链接1</a><a href="https://www.example2.com">链接2</a>
</body>
</html>
"""soup = BeautifulSoup(html, 'html.parser')
links = soup.find_all('a')
for link in links:print(link.get('href'))

安装BeautifulSoup4库同样使用 pip 命令:pip install beautifulsoup4 。此外,还需要安装一个解析器,常用的解析器有lxml和html.parser,可以通过pip install lxml或pip install html.parser来安装。​

3.Scrapy 框架:​

Scrapy 是一个功能强大的爬虫框架,它为我们提供了一套完整的爬虫解决方案,就像一个装备精良的战斗团队,能够帮助我们高效地构建大型、复杂的爬虫系统。Scrapy 具有分布式爬取的能力,可以利用多台计算机同时进行数据采集,大大提高了爬取效率;它还自带了自动处理请求队列、中间件机制等功能,使得爬虫的管理和扩展更加方便。​

使用 Scrapy 框架,你需要定义爬虫类,指定要爬取的网站、解析规则等。以下是一个简单的 Scrapy 爬虫示例:

import scrapyclass ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['https://www.example.com',]def parse(self, response):for item in response.css('div.item'):yield {'title': item.css('h2.title::text').get(),'link': item.css('a::attr(href)').get(),}

安装 Scrapy 框架:pip install scrapy 。​

4.Selenium 库:​

Selenium 库主要用于自动化测试,但在爬虫领域也有着重要的应用。它可以模拟人类在浏览器中的操作,如点击按钮、输入文本、滚动页面等,这对于一些需要交互才能获取数据的网站非常有用。比如,有些网站的数据是通过 JavaScript 动态加载的,使用普通的爬虫库无法直接获取,这时就可以借助 Selenium 库来驱动浏览器,模拟用户操作,从而获取到完整的数据。​

使用 Selenium 库需要先安装浏览器驱动,例如 Chrome 浏览器需要下载 ChromeDriver。以下是一个使用 Selenium 打开网页并获取标题的示例:

from selenium import webdriverdriver = webdriver.Chrome()
driver.get('https://www.example.com')
print(driver.title)
driver.quit()

安装 Selenium 库:pip install selenium 。​

三、爬虫原理剖析:探寻内在机制​

(一)发起请求​

当我们使用爬虫获取网页数据时,首先要做的就是发起请求,这就好比我们去朋友家拜访,需要先敲敲门询问是否可以进入。爬虫通过 HTTP 协议向目标网站的服务器发送请求,请求中包含了很多信息,如请求的网址(URL)、请求方法(GET、POST 等)、请求头(Headers)等 。​

其中,URL 就像是朋友家的地址,明确告诉爬虫要访问哪个网页;请求方法则决定了我们以何种方式与服务器 “交流”,GET 方法通常用于获取网页的基本信息,就像我们简单地询问朋友家里的情况;POST 方法则更像是带着礼物去朋友家,它可以向服务器发送一些数据,比如登录表单中的用户名和密码等。请求头则包含了更多关于请求的细节信息,例如我们使用的浏览器类型、操作系统等,这些信息就像是我们去朋友家时的自我介绍,让服务器能够更好地 “了解” 我们的请求。​

以使用requests库发送 GET 请求为例,代码如下:

import requestsurl = 'https://www.example.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)

在这段代码中,我们定义了要访问的url,并设置了headers,模拟了一个 Chrome 浏览器的请求头,然后使用requests.get()方法发送请求,服务器会根据这个请求返回相应的内容。​

(二)获取响应​

当爬虫发送请求后,服务器会对这个请求进行处理,并返回一个响应(Response)。这个响应就像是朋友从房间里递给我们的东西,里面包含了我们请求的网页内容。响应内容可能是 HTML 格式的文本,这就像是一份详细的房屋布局图,描述了网页的结构和展示内容;也可能是 JSON 格式的数据,更像是一份简洁的物品清单,以一种结构化的方式存储着数据;还可能是二进制数据,比如图片、视频等,就像朋友给我们的一些实体物品。​

在 Python 中,使用requests库发送请求后,我们可以通过response对象来获取响应的各种信息。例如,通过response.status_code可以获取响应的状态码,200 表示请求成功,就像朋友愉快地开门迎接我们;404 表示页面未找到,意味着我们找错了地址;500 表示服务器内部错误,就像是朋友家里出了点状况。通过response.text可以获取响应的文本内容(如果是 HTML 页面,就是页面的源代码),通过response.json()可以将 JSON 格式的响应内容解析为 Python 的字典或列表对象。​

以下是获取响应内容并判断状态码的示例代码:

import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:print("请求成功,网页内容如下:")print(response.text)
else:print(f"请求失败,状态码:{response.status_code}")

(三)解析内容​

获取到响应内容后,我们需要从中提取出我们真正需要的数据,这就好比从朋友给的东西里挑选出我们感兴趣的物品。解析网页内容有多种方法,常用的有正则表达式、BeautifulSoup、XPath 等。​

1.正则表达式:正则表达式是一种强大的文本匹配工具,它使用特定的字符和规则来描述文本模式。在解析网页时,我们可以用正则表达式来匹配 HTML 文本中的特定内容。例如,要提取网页中所有的链接,可以使用类似r'href=["\'](.*?)["\']'的正则表达式。不过,正则表达式的语法相对复杂,对于复杂的网页结构,编写和调试正则表达式可能会比较困难,就像是在一堆杂乱的物品中寻找特定的东西,需要花费一些心思。​

以下是使用正则表达式提取网页链接的示例代码:

import re
import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:pattern = re.compile(r'href=["\'](.*?)["\']')links = pattern.findall(response.text)for link in links:print(link)
else:print(f"请求失败,状态码:{response.status_code}")

2.BeautifulSoup:BeautifulSoup 是一个专门用于解析 HTML 和 XML 文档的库,它将复杂的文档结构转化为一个易于操作的树形结构,就像把一堆杂乱的物品整理成一个有序的货架,我们可以方便地从中找到所需的东西。使用 BeautifulSoup,我们可以通过标签名、属性等方式轻松地查找和提取数据。比如,使用soup.find_all('a')可以找到网页中所有的<a>标签,即链接标签;使用soup.find('div', class_='content')可以找到 class 为content的<div>标签,提取其中的内容。​

以下是使用 BeautifulSoup 提取网页链接的示例代码:

from bs4 import BeautifulSoup
import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')links = soup.find_all('a')for link in links:print(link.get('href'))
else:print(f"请求失败,状态码:{response.status_code}")

3.XPath:XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,它通过路径表达式来选取文档中的元素,就像在一个地图上通过坐标来找到特定的地点。例如,//a表示选取所有的<a>标签,//div[@class='content']表示选取 class 为content的<div>标签。XPath 在处理复杂的网页结构时非常强大,能够准确地定位到我们需要的数据节点 。​

以下是使用 XPath 提取网页链接的示例代码:

from lxml import etree
import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:html = etree.HTML(response.text)links = html.xpath('//a/@href')for link in links:print(link)
else:print(f"请求失败,状态码:{response.status_code}")

(四)保存数据​

解析出所需的数据后,我们需要将这些数据保存起来,以便后续使用,这就像是把挑选好的物品妥善存放起来。数据可以保存为多种格式,常见的有文本文件、CSV 文件、数据库等。​

1.保存为文本文件:将数据保存为文本文件是最基本的方式,适合保存一些简单的数据,比如提取的网页标题、文本内容等。使用 Python 的内置函数open()可以创建一个文本文件,并使用write()方法将数据写入文件。​

以下是将提取的网页标题保存为文本文件的示例代码:

from bs4 import BeautifulSoup
import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')title = soup.title.stringwith open('title.txt', 'w', encoding='utf-8') as f:f.write(title)
else:print(f"请求失败,状态码:{response.status_code}")

2.保存为 CSV 文件:CSV(Comma-Separated Values)文件是一种常用的表格数据格式,适合保存结构化的数据,比如从网页中提取的商品列表、新闻列表等。使用 Python 的csv库可以方便地将数据保存为 CSV 文件。​

以下是将提取的商品信息保存为 CSV 文件的示例代码:

import csv
from bs4 import BeautifulSoup
import requestsurl = 'https://www.example.com/products'
response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')products = []for product in soup.find_all('div', class_='product'):name = product.find('h2', class_='product-name').text.strip()price = product.find('span', class_='product-price').text.strip()products.append([name, price])with open('products.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['商品名称', '价格'])writer.writerows(products)
else:print(f"请求失败,状态码:{response.status_code}")

3.保存到数据库:如果数据量较大或者需要进行复杂的数据查询和管理,将数据保存到数据库是更好的选择。常见的数据库有 MySQL、MongoDB 等。以 MySQL 为例,使用pymysql库可以连接 MySQL 数据库,并将数据插入到数据库表中。​

以下是将提取的用户评论保存到 MySQL 数据库的示例代码:

import pymysql
from bs4 import BeautifulSoup
import requestsurl = 'https://www.example.com/comments'
response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')comments = []for comment in soup.find_all('div', class_='comment'):author = comment.find('span', class_='comment-author').text.strip()content = comment.find('p', class_='comment-content').text.strip()comments.append((author, content))conn = pymysql.connect(host='localhost', user='root', password='password', database='test')cursor = conn.cursor()for comment in comments:sql = "INSERT INTO comments (author, content) VALUES (%s, %s)"cursor.execute(sql, comment)conn.commit()cursor.close()conn.close()
else:print(f"请求失败,状态码:{response.status_code}")

相关文章:

Python爬虫:开启数据抓取的奇幻之旅(一)

目录 一、爬虫初印象&#xff1a;揭开神秘面纱​ 二、工欲善其事&#xff1a;前期准备​ &#xff08;一&#xff09;Python 环境搭建​ 1.下载 Python 安装包&#xff1a;​ 2.运行安装程序&#xff1a;​ 3.配置环境变量&#xff08;若自动添加失败&#xff09;&#x…...

python下载m3u8格式视频

一、安装 m3u8库 pip install requests pip install requests m3u8 二、编码实现 import os import re import requests import subprocess# 下载ts文件 def down_ts_file(base_url, m3u8_url, download_dir):# 从m3u8文件中获取所有ts的分片名称信息response requests.get…...

【区块链安全 | 第五篇】DeFi概念详解

文章目录 DeFi1. DeFi 生态概览2. 去中心化交易所&#xff08;DEX&#xff09;2.1 AMM&#xff08;自动做市商&#xff09;模型2.2 订单簿模式&#xff08;现货交易&#xff09; 3. 借贷协议3.1 Aave3.2 使用闪电贷&#xff08;Flash Loan&#xff09; 4. 稳定币&#xff08;St…...

【初探数据结构】归并排序与计数排序的序曲

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对数据结构感…...

基于ruoyi快速开发平台搭建----超市仓库管理(修改记录1)

一、数据库的设计一定注意不要用关键字 数据库是同学设计的&#xff0c;但是在实践过程中&#xff0c;发现&#xff0c;生成的代码一直报错&#xff0c;结果发现数据库里面商品表里面的商品类别竟然设置成class, 注意&#xff1a;&#xff1a; class 是 Java 中的关键字&…...

《AI加持,SQL Server预测性维护全攻略》

在数字化时代&#xff0c;数据就是企业的生命线&#xff0c;而SQL Server作为一款应用广泛的关系型数据库管理系统&#xff0c;承载着企业海量的数据资产。但数据库运行过程中&#xff0c;故障就像隐藏在暗处的“定时炸弹”&#xff0c;随时可能引发数据丢失、业务中断等严重后…...

Java基础——面向对象

1.抽象Abstract&#xff1a;抽象类和抽象方法&#xff1b; 抽象类&#xff1a;不完整的类&#xff0c;就是抽象类&#xff1a;abstract class 类名&#xff1b; 抽象方法:只有声明&#xff0c;没有实现的方法&#xff1b; abstract 返回值类型 方法名&#xff08;参数&#…...

Springboot学习笔记3.20

目录 1.实战篇第一课 我们将会在本次实战中学习到哪些知识点&#xff1f; 开发模式和环境搭建&#xff1a; 注册接口 1.Lombok 2.开发流程 1.controller层&#xff0c;这个层会指明访问路径和要执行的逻辑&#xff1a; 2.我们把返回结果根据接口文档包装成一个类result&a…...

Ubuntu和Windows实现文件互传

1.开启Ubuntu下的FTP服务&#xff1a; &#xff08;1&#xff09;终端输入&#xff1a; sudo apt-get install vsftpd&#xff08;2&#xff09;安装完成后&#xff1a; 终端输入&#xff1a; /etc 是 Linux 系统的全局配置文件目录&#xff0c;存储系统和应用程序的配置信息…...

java面向对象从入门到入土

面向对象进阶 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 重点学习:学习已有对象并使用,学习如何自己设计对象并使用 设计对…...

linux ACL权限控制之用户权限控制程序设计

linux中的ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种比传统UNIX权限更细粒度的权限控制机制&#xff0c;允许为文件和目录设置更为具体的用户和组权限。本文介绍使用acl命令和程序api对文件进行更精细的用户权限控制。 1. 命令行示例 使…...

Java多线程与JConsole实践:从线程状态到性能优化!!!

目录 一、前言二、JConsole 使用教程二、线程的基本状态2.1新建状态&#xff08;New&#xff09;2.2就绪状态&#xff08;Ready&#xff09;2.3运行状态&#xff08;Running&#xff09;2.4 阻塞状态&#xff08;Blocked&#xff09;2.5. 等待状态&#xff08;Waiting&#xff…...

从入门到精通:SQL注入防御与攻防实战——红队如何突破,蓝队如何应对!

引言&#xff1a;为什么SQL注入攻击依然如此强大&#xff1f; SQL注入&#xff08;SQL Injection&#xff09;是最古老且最常见的Web应用漏洞之一。尽管很多公司和组织都已经采取了WAF、防火墙、数据库隔离等防护措施&#xff0c;但SQL注入依然在许多情况下能够突破防线&#…...

Stable Diffusion vue本地api接口对接,模型切换, ai功能集成开源项目 ollama-chat-ui-vue

1.开启Stable Diffusion的api服务 编辑webui-user.bat 添加 –api 开启api服务&#xff0c;然后保存启动就可以了 2.api 文档地址 http://127.0.0.1:7860/docs3. 文生图 接口 地址 /sdapi/v1/txt2img //post 请求入参 {enable_hr: false, // 开启高清hrdenoising_stre…...

缓存使用纪要

一、本地缓存&#xff1a;Caffeine 1、简介 Caffeine是一种高性能、高命中率、内存占用低的本地缓存库&#xff0c;简单来说它是 Guava Cache 的优化加强版&#xff0c;是当下最流行、最佳&#xff08;最优&#xff09;缓存框架。 Spring5 即将放弃掉 Guava Cache 作为缓存机…...

第十四届蓝桥杯真题(PWM输出)

一.LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 二.按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&#xff0c;在文件夹中添加code文件夹&#…...

【Qt】ffmpeg编码—存储(H264)

目录 一、编码分析 1.解码线程&#xff1a; ​编辑2.编码线程&#xff1a; ​编辑 ​编辑 二、ffmpeg编码 1.注册所有组件 2.编码初始化函数 &#xff08;2&#xff09;打开视频流 4.查找编码器 5. 写文件头信息&#xff0c;写到formatContex中 6.发送一帧数据给编码器…...

Webview详解(下)

第三阶段&#xff1a;性能优化 加载速度优化 缓存策略 缓存策略可以显著减少网络请求&#xff0c;提升页面加载速度。常用的缓存策略包括 HTTP 缓存和本地资源预加载。 1. HTTP 缓存 HTTP 缓存利用 HTTP 协议中的缓存机制&#xff08;如 Cache-Control、ETag 等&#xff0…...

【MySQL基础-16】MySQL DELETE语句:深入理解与应用实践

1. DELETE语句基础&#xff1a;数据删除的艺术 在数据库管理中&#xff0c;DELETE语句是维护数据完整性和清理过期信息的关键工具。与日常生活中的"删除"不同&#xff0c;数据库中的删除操作需要更加谨慎和精确&#xff0c;因为数据一旦删除&#xff0c;恢复可能非常…...

相对位置嵌入和旋转位置编码

1. 相对位置嵌入&#xff1a;给注意力机制加“人际关系记忆” 像班级座位表 想象全班同学&#xff08;序列的各个元素&#xff09;坐成一个圈&#xff0c;老师&#xff08;模型&#xff09;要记住每个人之间的相对位置&#xff1a; 传统方法&#xff1a;老师给每个座位贴绝对…...

Unity编辑器功能及拓展(1) —特殊的Editor文件夹

Unity中的Editor文件夹是一个具有特殊用途的目录&#xff0c;主要用于存放与编辑器扩展功能相关的脚本和资源。 一.纠缠不清的UnityEditor 我们Unity中进行游戏构建时&#xff0c;我们经常遇到关于UnityEditor相关命名空间丢失的报错&#xff0c;这时候&#xff0c;只得将报错…...

REC一些操作解法

一.Linux命令长度突破 1.源码如下 <?php $param $_REQUEST[param];if ( strlen($param) < 8 ) {echo shell_exec($param); } 2.源码分析 echo执行函数&#xff0c;$_REQUEST可以接post、get、cookie传参 3.破题思路 源码中对参数长度做了限制&#xff0c;小于8位&a…...

powershell7.5.0不支持conda的问题

经历&#xff1a;这周手欠使用vscode的powershell时提示我更新&#xff0c;我就更新了&#xff0c;更新完激活不了conda环境了&#xff0c;查询了半天是powershell最新版7.5.0与目前conda25.1.1以前的版本不支持的问题。 问题环境&#xff1a;powershell版本>7.5.0&#xff…...

Android Jetpack学习总结(源码级理解)

ViewModel 和 LiveData 是 Android Jetpack 组件库中的两个核心组件&#xff0c;它们能帮助开发者更有效地管理 UI 相关的数据&#xff0c;并且能够在配置变更&#xff08;如屏幕旋转&#xff09;时保存和恢复 UI 数据。 ViewModel作用 瞬态数据丢失的恢复&#xff0c;比如横竖…...

Unity中UDP异步通信常用API使用

Begin开头的方法 BeginSendTo BeginSendTo 是 UdpClient 类中的一个重要方法&#xff0c;用于开始一个异步操作来发送 UDP 数据报到指定的远程端点 public IAsyncResult BeginSendTo(byte[] datagram,int bytes,IPEndPoint endPoint,AsyncCallback requestCallback,object s…...

解决Dify:failed to init dify plugin db问题

Dify最新版本1.1.3(langgenius/dify: Dify is an open-source LLM app development platform. Difys intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototy…...

[AI绘图] ComfyUI 中自定义节点插件安装方法

ComfyUI 是一个强大的 AI 图像生成工具,支持自定义节点插件扩展其功能。本文介绍 ComfyUI 中安装自定义节点插件的三种方法,包括 Git Clone 方式、插件管理器安装方式,以及手动解压 ZIP 文件的方法,并分析它们的优缺点。 1. Git Clone 方法 使用 git clone 是最稳定且推荐…...

【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】

【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 目录 【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 前言&#xff1a; 连接步骤说明 一. 硬件连接 支持的相机接口类型&#xff1a; 连接步骤 2. 软件配置 Visio…...

CI/CD基础知识

什么是CI/CD CI&#xff1a;持续集成&#xff0c;开发人员频繁地将代码集成到主干&#xff08;主分支&#xff09;中每次集成都通过自动化构建和测试来验证&#xff0c;从而尽早发现集成错误&#xff0c;常用的CI工具包括Jenkins、Travis CI、CircleCI、GitLab CI等 CD&#…...

蓝桥杯 之 图论基础+并查集

文章目录 习题联盟X蓝桥幼儿园 图论基础 并查集 并查集&#xff0c;总的来说&#xff0c;操作分为三步初始化(每一个节点的父亲是自己)&#xff0c;定义union(index1,index2)函数&#xff0c;定义find(index)函数 并查集详细内容博客 习题 联盟X 联盟X 典型的求解连通分支…...