python爬虫入门(一) - requests库与re库,一个简单的爬虫程序
目录
web请求与requests库
1. web请求
1.1 客户端渲染与服务端渲染
1.2 抓包
1.3 HTTP状态代码
2. requests库
2.1 requests模块的下载
2.2 发送请求头与请求参数
2.3 GET请求与POST请求
GET请求的例子:
POST请求的例子:
3. 案例:爬取豆瓣电影榜
正则表达式与re库
1. 正则表达式
1.1 贪婪匹配
1.2 惰性匹配
2. re库
2.1 compile() - 创建正则对象
2.2 match()与search() - 单个匹配
2.3 findall()与finditer() - 所有匹配
2.4 sub() - 替换
2.5 split() - 分割
捕获组与非捕获组
3. 案例:爬取豆瓣top250电影指定数据
web请求与requests库
1. web请求
web请求是指客户端向服务端发送的请求,以此获得服务端提供的资源,或者与服务端进行交互。其中,客户端是发送请求的一方,通常指浏览器、移动应用等;服务端是响应的一方,指运行在服务器上的web应用程序。
爬虫属于客户端,通过向服务端发送web请求,获取服务端的数据。
下面介绍常见的两种web请求类型,这里暂不做详细介绍:
- http请求:遵循http协议。
- https:http的加密版。
1.1 客户端渲染与服务端渲染
- 客户端渲染(CSR),指在客户端完成界面的渲染:
服务端将基础的HTML骨架和源代码打包发给客户端,客户端经加载源代码后,再进行请求数据和界面渲染。因为服务端发送的并非成熟的HTML文件,爬虫需要额外的开销来加载和执行源代码。
- 服务端渲染(SSR),指在服务端完成界面的渲染:
服务端完成页面的渲染,并将经渲染的HTML文件发送给客户端,浏览器无需经过源文件的加载和执行,便可直接展示界面。由于服务端提供了HTML文件,爬虫可以直接获取完整的HTML文件,而无需等待加载源文件,因此服务端渲染对爬虫更为友好。
1.2 抓包
渲染方式不同,获取URL的方式也略有不同。
基本步骤:打开需要爬取的界面 - F12 - 刷新 - 网络 - 打开第一个数据包
- 服务端
第一个数据包(黑色方框)为数据,因此该网页为服务端渲染。从该数据包预览页中可以看到页面的所有信息。

此数据包的标头,存放着需爬取的URL。

- 客户端渲染
第一个数据包是HTML骨架,没有完整的界面信息。

此时我们需要找到存放数据的包,这个为爬虫需要爬的内容。

应使用该数据包的URL:

1.3 HTTP状态代码

在抓包过程中,我们注意到表头有一行状态代码显示:“200 OK”,表示请求成功、并返回了资源。在平时生活中,也会遇到“404”、“304”等情况。“404”“304”与“200”一样,都属于HTTP的状态代码,用来表示HTTP请求的处理结果。这些状态代码被划分到了不同的类型,具有独特的意义。我们需要熟记每一类状态码的意义。
1xx - 信息性状态码
- 100 Continue:服务器已收到请求的第一部分,正在等待其余部分。
- 101 Switching Protocols:服务器根据客户端的请求切换协议。
2xx - 成功状态码
- 200 OK:请求成功,服务器返回了请求的资源。
- 201 Created:请求成功,服务器创建了新的资源。
- 202 Accepted:请求已接受,但尚未处理完成。
- 204 No Content:请求成功,但服务器没有返回内容。
3xx - 重定向状态码
- 301 Moved Permanently:请求的资源已永久移动到新的URL。
- 302 Found:请求的资源临时移动到新的URL。
- 304 Not Modified:资源未修改,客户端可以使用缓存的版本。
4xx - 客户端错误状态码
- 400 Bad Request:请求格式错误。
- 401 Unauthorized:请求未授权,需要身份验证。
- 403 Forbidden:服务器拒绝访问请求的资源。
- 404 Not Found:请求的资源未找到。
- 405 Method Not Allowed:请求的方法不被允许。
5xx - 服务器错误状态码
- 500 Internal Server Error:服务器内部错误。
- 501 Not Implemented:服务器不支持请求的功能。
- 502 Bad Gateway:服务器作为网关时,从上游服务器收到无效响应。
- 503 Service Unavailable:服务器暂时无法处理请求。
- 504 Gateway Timeout:服务器作为网关时,上游服务器未在规定时间内响应。2.
2. requests库
requests是一个常用的python第三方库,常用于发送HTTP请求。requests库封装了底层的HTTP协议的细节,使得发送和响应HTTP请求变得十分轻松。
2.1 requests模块的下载
这里介绍采用命令行的方式下载:win+R - 打开cmd - 输入命令行
pip install requests
如果因为超时导致下载失败,可以考虑延长pip等待时间,通过--default timeout的方式设置超时时间。
pip install requests --default-timeout=120

这样,就下载成功了。
2.2 发送请求头与请求参数
- 请求头的获取
一些网址的爬取要求加上请求头,这样可以让程序看起来更像真人。


- 请求参数

一些URL链接过长,其原因是链接后面接了部分参数。可以通过发送请求参数,减短URL链接。一般情况下,“?”后的数据为参数。
import requests# 设置请求头
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'}
#设置请求参数
params ={'q': '陈奕迅''qs': 'n''form': 'QBRE''sp': -1'lq': 0'pq': '陈奕迅''sc': '13-3''sk':'' 'cvid': 'D6F23A59983048E485AA76E7A663ED49''ghsh': 0'ghacc': 0'ghpl':'' }#若不设置请求参数,url为:
#https://cn.bing.com/search?q=%E9%99%88%E5%A5%95%E8%BF%85&qs=n&form=QBRE&sp=-1&lq=0&pq=%E9%99%88%E5%A5%95%E8%BF%85&sc=13-3&sk=&cvid=D6F23A59983048E485AA76E7A663ED49&ghsh=0&ghacc=0&g
url="https://cn.bing.com/search"
2.3 GET请求与POST请求
GET请求和POST请求是HTTP协议中最常用的两种请求方式。
- GET请求:通过URL发送请求,访问页面资源,参数在URL中传递,是一种无副作用的请求方式。
- PORT请求:参数包含在请求体中,用于修改服务器上的数据,是一种有副作用的请求方式。
GET请求的例子:
import requests #导入requests模块url = 'https://baike.baidu.com/item/陈奕迅/128029' #获取url链接
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0"
}
resp = requests.get(url,headers=header) #发送请求并用变量resp接收#添加user-agent表头,使看起来更像真人访问
print(resp.text)

运行可以看到,网页的编码出现在了运行结果处。这就是个简单的爬虫程序。

我们已经成功向服务端发送请求并获得了响应。接下来则需要将获取到的数据写入HTML文件中:
try:resp = requests.get(url,headers=header) #发送请求并用变量resp接收#请求成功,将响应的内容存放至HTML文档中,追加方式为'w'(写入),写入格式为utf-8。with open('eason.html','w',encoding='utf-8') as file:file.write(resp.text)print("请求成功,已将数据存放至HTML文件!")
except Exception as e:print("请求失败!")
运行,将自送生成一个html文件。打开该文件即可浏览我们爬下来的页面。

POST请求的例子:
以百度翻译为例子。当输入信息后,会自动生成几个数据包。

筛选Fetch/XHR文档,找到存放服务端返回内容的数据包,即可得到对应的URL和数据表单。



import requests #导入requests模块url = 'https://fanyi.baidu.com/sug' #获取url链接headers={#模拟浏览器发送请求"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0"
}
data={#模拟表单数据,发送关键字apple"kw":"apple"
}
#发送post请求
resp=requests.post(url,headers=headers,data=data)
#响应是json格式,可以直接解析并打印。
print(resp.json())
运行,即可获取返回的数据。

网页上显示的数据如下:

3. 案例:爬取豆瓣电影榜
找到存放豆瓣电影榜的数据包:

URL中,"?"后的数据为参数,可删去,而用负载中的数据表示这些参数


import requests #导入requests模块url='https://movie.douban.com/j/chart/top_list'
#请求头
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'}
#请求参数
params ={'type': 11,'interval_id': '100:90','action':'','start': 0,'limit': 20
}
# 尝试发送 GET 请求
try:resp = requests.get(url, headers=headers, params=params)print(resp.json()) # 尝试解析 JSON 数据
except Exception:print("请求失败!")

正则表达式与re库
1. 正则表达式
正则表达式是一种表示字符串的基本语法,可以用来匹配字符串。
例如,我们拿“\d”去匹配字符串“123ABC”,可以得到3种匹配结果:“\d”分别匹配1、2、3。

而正则对象“a*.”可以用来匹配“aaaaab”:
“a*”中*可以匹配0次或多次前面元素a,即“a*”可以匹配“aaaaa”;而“.”可以匹配任意字符,即“.”可以匹配“b”。因此正则对象“a*.”可以匹配字符串“aaaaab”。
下面是一些正则表达式的常见用法:
| \w | 匹配单个字母/数字/下划线 |
| \s | 匹配单个空格 |
| \d | 匹配单个数字 |
| \n | 匹配单个换行符 |
| \t | 匹配单个制表符 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结尾 |
| \W | 匹配非数字、字母、下划线 |
| \D | 匹配非数字 |
| \S | 匹配非空白符 |
| a|b | 匹配a或b |
| () | 分组,用于分组匹配或捕获子字符串 |
| [] | 字符集,用于匹配括号内任意单个字符 |
| . | 匹配除换行符以外的任意单个字符 |
| * | 匹配前面元素0次或多次 |
| + | 匹配前面元素1次或多次 |
| ? | 匹配前面元素0次或1次 |
| {n} | 匹配前面元素n次 |
| {n,} | 匹配前面元素n次或多次 |
| {n,m} | 匹配前面元素n次到m次 |
1.1 贪婪匹配
贪婪匹配是正则表达式中的一种匹配模式,他的思想是:尽可能匹配更长的字符串。如“\d+”就是一种贪婪匹配模式,能够尽可能多的匹配字符串中的数字。在字符串“abc~12345~de_67_”中,对于正则对象“\d+”可以找到两种匹配:“12345”“67”,这两种匹配已是最长。

再如,“.*”也是一种贪婪匹配模式,可以“a.*b”可以理解为:忽略a与b间的内容,找到最长的匹配。

1.2 惰性匹配
惰性匹配是正则表达式中的一种匹配模式,与贪婪匹配相反,他的思想是:尽可能匹配更短的字符串。要想实现惰性匹配,只需在量词后加上?。如“\d+?”就是一种惰性匹配模式,能够尽可能少的匹配字符串中的数字。在字符串“abc~12345~de_67_”中,对于正则对象“\d+?”能找到的匹配是单个数字字符。因此,“\d”就是一种惰性匹配。

再如,“.*?”也是一种惰性匹配模式,可以“a.?*b”可以理解为:忽略a与b间的内容,找到最短的匹配。

2. re库
re是python的标准库之一,用于正则表达式的处理。
2.1 compile() - 创建正则对象
re.compile():用于创建新的正则对象。
import re#匹配1个或多个字符
pattern = re.compile(r'\d+')# 匹配URL链接
url_pattern = re.compile(r'^(https?)://' # 匹配 http、https 或 ftpr'([a-zA-Z0-9.-]+)' # 域名r'(:\d+)?' # 端口号r'(/[^?\s]*)?' # 路径r'(\?[^#\s]*)?' # 查询参数r'(#\S*)?$' # 锚点
)
2.2 match()与search() - 单个匹配
match()与search()均用于查找字符串的第一个匹配,区别在于:match是从字符串最开始处匹配,一旦这个字符串的最开始部分与正则表达式不匹配,无论后面是否有子字符串与之匹配,都将匹配失败;而search()只需要找到与正则表达式匹配的子字符串,无论这个子字符串是否在字符串开头。
- re.match(pattern,text):判断字符首部是否与pattern匹配。
import repattern = re.compile(r'\d+')
text=['123abc456','abc456def']
match=[re.match(pattern,text[0]),re.match(pattern,text[1])]for i in range(2):if match[i]:print(f"text[{i}]:匹配成功!{match[i].group()}")else:print(f"text[{i}]:匹配失败!")#text[0]:匹配成功!123#text[1]:匹配失败!
- pattern.search(text):用于判断字符串text中是否有与正则表达式匹配的子字符串:若有,则返回第一个匹配的字符串;若没有,返回None。
import repattern = re.compile(r'\d+')
test = "abc123de456"
match=pattern.search(test)if match:print(match.group()) #123
else:print("匹配失败!")
2.3 findall()与finditer() - 所有匹配
findall()与finditer()都用于查找所有的匹配,但他们的返回值有所不同:findall()将返回与正则表达式匹配的子字符串列表,而finditer()则返回一个迭代器,每次迭代返回一个Match对象。关于Match对象的用法:
match.group():返回匹配的字符串。
match.start():返回匹配的起始位置。
match.end():返回匹配的结束位置。
match.span():返回一个元组 (start, end),表示匹配的起始和结束位置。
- pattern.findall(text):用于查找所有匹配,并返回一个列表。
import repattern = re.compile(r'\d+')
test = "abc123de456"
match=pattern.findall(test)if match:print(match) #['123', '456']
else:print("匹配失败!")
- pattern.finditer(pattern,text):用于查找所有匹配,并返回一个迭代器。
import retext="hello,python!"
pattern = re.compile(r'\w+')
matches=re.finditer(pattern,text)# 使用迭代器逐个处理匹配结果
for match in matches:print(f"Match found: {match.group()} at position {match.start()}-{match.end()}")
#Match found: hello at position 0-5
#Match found: python at position 6-12
2.4 sub() - 替换
re.sub(pattern,str,text):用str替换text中匹配正则对象pattern的内容。
import repattern = re.compile(r'\d+')
test = "abc123de456"res=re.sub(pattern,"x",test)print(res) #abcxdex
2.5 split() - 分割
re.split(pattern,text):依照正则对象pattern分割text,与pattern匹配的字符串作为分割边界。
import repattern = re.compile(r'\d+')
test = "abc123de456"result= re.split(pattern,test)
print(result) #['abc', 'de', '']
捕获组与非捕获组
- 捕获组用(…)表示,兼具分组和捕获的作用。经匹配过的字符串依照正则表达式进行分组,通过.group(idx)的方式可以捕获不同分组。分组的下标从1开始。
如,格式为YYYY-MM-DD的日期字符串,我们希望对其进行分组,从而能分别捕获年、月、日。那么对该字符串的分组为:(YYYY)、(MM)、(DD),对应的正则表达式为:(\d{4})-(\d{2})-(\d{2})
import repattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})') #YYYY-MM-DD
text='2025-01-01'
match=re.match(pattern,text)
if match:#捕获不同分组yyyy=match.group(1)mm=match.group(2)dd=match.group(3)print(f"Year:{yyyy},Month:{mm},Date:{dd}") #Year:2025,Month:01,Date:01
else:print("匹配失败!")
在捕获组中,可以添加“?<name>”来命名捕获组,如:(?<name>pattern)
- 非捕获组用(?:…)表示,仅具有分组功能而无法对分组进行捕获。这里不再展示。
3. 案例:爬取豆瓣top250电影指定数据
要求爬取数据:电影名称、上映年份、国家、评分,并把数据存入csv文件中。

如何用正则表达式表达爬取所需的格式?
首先,需要找到数据存放的位置。

选择图上这个图标,点击“肖申克的救赎”,可以快速定位数据所在位置。找到数据所在位置后,我们找到它的最外层文件:可以看到,当光标停放在<li>这一行时,《肖申克的救赎》这部电影的所有数据都囊括在阴影处。往下可以找到需要爬去的数据。因此我们的正则表达式可以从"<li>"开始,接下来只需要表达式能特异性地识别到数据存放的位置。

依据上图,最后的正则表达式为:
(正则表达式不唯一)
obj=re.compile(r'<li>.*?<div class="item">.*?' #最外层及第二层文件r'<span class="title">(?P<name>.*?)</span>.*?' #电影名称r'<br>(?P<year>.*?) / (?P<country>.*?) /.*?' #年份、国家r'<span class="rating_num" property="v:average">(?P<score>.*?)</span>', #评分re.S)
<li>.*?<div class="item">
“ .*? ”是一种惰性匹配*匹配任意字符,.*? 意味着要尽量少的匹配字符,直到出现下一次匹配。这里可以理解为:忽略<li>与<div class="item">之间的内容。其他位置 “ .*? ”同理。
<span class="title">
精确匹配HTML的标签,这是电影名的开始处。其他处同理。
(?P<name>.*?)
这是一个捕获组,采用了 (?P<name>…) 用于捕获电影名称,并使其可以被name捕获。其他处同理。
</span>
精确匹配HTML的标签,这是电影名的结束位置。其他处同理。
/
HTML中相邻两项的分隔。
re.S
编译标志,也被称为DOTALL模式,使“ . ”可以匹配包括换行符在内的任意字符。
最后的程序:
import requests
import re
import csvurl = "https://movie.douban.com/top250" #URL链接
headers = { #请求头'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0'
}try:#发送请求resp=requests.get(url,headers=headers)#状态判断if resp.status_code!=200:raise Exception(f"状态码错误:{resp.status_code}")#创建正则表达式obj=re.compile(r'<li>.*?<div class="item">.*?'r'<span class="title">(?P<name>.*?)</span>.*?'r'<br>(?P<year>.*?) / (?P<country>.*?) /.*?'r'<span class="rating_num" property="v:average">(?P<score>.*?)</span>',re.S)result=obj.finditer(resp.text)# 写入 CSV 文件with open('data.csv', mode='w', newline='', encoding='utf-8') as file:csvwriter = csv.writer(file)csvwriter.writerow(['Name', 'Year', 'Country', 'Score']) # 写入表头for match in result:dic = match.groupdict()csvwriter.writerow([dic['name'].strip(), dic['year'].strip(), dic['country'].strip(), dic['score'].strip()])except Exception as e:print(f"请求失败:{e}")
finally:print("程序结束!")

相关文章:
python爬虫入门(一) - requests库与re库,一个简单的爬虫程序
目录 web请求与requests库 1. web请求 1.1 客户端渲染与服务端渲染 1.2 抓包 1.3 HTTP状态代码 2. requests库 2.1 requests模块的下载 2.2 发送请求头与请求参数 2.3 GET请求与POST请求 GET请求的例子: POST请求的例子: 3. 案例:…...
智慧园区管理平台实现智能整合提升企业运营模式与管理效率
内容概要 在当今数字化的背景下,智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术,旨在通过智能整合各类资源与信息,帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…...
尚硅谷spring框架视频教程——学习笔记一(IOC、AOP)
文章目录 前言一、控制反转(IOC)1. 底层原理2. 两种实现方式(接口)3. bean管理(基于xml方式)4. bean管理(基于注解方式) 二、面向切面编程(AOP)1. 底层逻辑2.…...
傅里叶分析之掐死教程
https://zhuanlan.zhihu.com/p/19763358 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析 不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是,傅里叶分析的公式看起来太复杂了,所以很多…...
实战:如何快速让新网站被百度收录?
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/22.html 要让新网站快速被百度收录,可以采取以下实战策略: 一、网站基础优化 网站结构清晰:确保网站的结构简洁清晰,符合百度的抓取规则。主…...
PVE 虚拟机安装 Debian 无图形化界面服务器
Debian 安装 Debian 镜像下载 找一个Debian镜像服务器,根据需要的版本和自己硬件选择。 iso-cd/:较小,仅包含安装所需的基础组件,可能需要网络访问来完成安装。有镜像 debian-12.9.0-amd64-netinst.isoiso-dvd/:较…...
Java定时任务实现方案(五)——时间轮
时间轮 这篇笔记,我们要来介绍实现Java定时任务的第五个方案,使用时间轮,以及该方案的优点和缺点。 时间轮是一种高效的定时任务调度算法,特别适用于大量定时任务的场景。时间轮的定时任务实现,可以使用DelayQueue…...
乐理笔记——DAY02
三分钟音乐社视频地址: 调号总结篇https://www.bilibili.com/video/BV14p4y1e7TV?spm_id_from333.788.videopod.episodes&vd_source0a2d366696f87e241adc64419bf12cab&p25https://www.bilibili.com/video/BV14p4y1e7TV?spm_id_from333.788.videopod.epis…...
企业知识管理在推动组织变革与适应性发展中的关键性作用分析
内容概要 企业知识管理是信息时代背景下的重要管理理念,旨在通过有效地获取、分享和再利用知识,提升组织在变革中的灵活性和创新能力。知识作为企业的重要资产,其有效管理不仅影响到日常运营,更是推动组织变革与适应性发展的核心…...
动态规划DP 最长上升子序列模型 登山(题目分析+C++完整代码)
概览检索 动态规划DP 最长上升子序列模型 登山 原题链接 AcWing 1014. 登山 题目描述 五一到了,ACM队组织大家去登山观光,队员们发现山上一共有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个…...
芯片AI深度实战:进阶篇之vim内verilog实时基于AST的自定义检视
本文基于Editor Integration | ast-grep,以及coc.nvim,并基于以下verilog parser(my-language.so,文末下载链接), 可以在vim中实时显示自定义的verilog 匹配。效果图如下: 需要的配置如下: 系列文章: 芯片…...
AI 计算的未来:去中心化浪潮与全球竞争格局重塑
引言 人工智能(AI)正以前所未有的速度发展,尤其是大模型训练和推理效率的提升,使得 AI 计算成本迅速下降,呈现出向去中心化演进的趋势。 最新的 DeepSeek r1 模型,以仅 600 万美元 的训练成本,达到了 OpenAI o1 级别的性能,表明 AI 技术正迈向更具普惠性的阶段。这一趋…...
JxBrowser 8.2.2 版本发布啦!
JxBrowser 8.2.2 版本发布啦! • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 🔗 点击此处了解更多详情。 🆓 获取 30 天免费试用。...
BWM 世界模型
DGX AGX Ominiverse With Cosmos 功能 1w 张 H100 训练了 3个月 使用 Ray 串流 数据 数据准备 处理 pipeline 数组组成 真实世界的物理数据 训练 1、使用 L1 损失,最小化 输入和重构视频之间的像素级差异 以及基于 VGG19 的一个特征感知损失 2、使用光流的损…...
@Inject @Qualifier @Named
Inject Qualifier Named 在依赖注入(DI)中,Inject、Qualifier 和 Named 是用于管理对象创建和绑定的关键注解。以下是它们的用途、依赖配置和代码示例的详细说明: 1. 注解的作用 Inject:标记需要注入的构造函数、字段…...
【已解决】windows7虚拟机安装VMtools频繁报错
为了在虚拟机VMware中安装win7,题主先在网上下载了windows7 professional版本的镜像,在vmware中安装vmtools时报错,信息如下 (安装程序无法继续,本程序需要您将此虚拟机上安装的操作系统更新到SP1) 然后就…...
【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂
目录 1. 常见运算函数 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…...
【自学笔记】MySQL的重点知识点-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 MySQL重点知识点MySQL知识点总结一、数据库基础二、MySQL的基本使用三、数据类型四、触发器(Trigger)五、存储引擎六、索引七、事务处理八、…...
SSM开发(八) MyBatis解决方法重载
目录 一、Mybatis能否支持方法重载? 二、解决 MyBatis 方法重载问题的几种方法 解决方法一: (注解方式) 将重载方法命名为不同的方法名 解决方法二:采用@SelectProvider注解 解决方法三:使用 MyBatis 的 标签和动态 SQL 来构建不同参数的 SQL 查询 三、总结 一、Myb…...
PyTorch 快速入门
我们将通过一个简单的示例,快速了解如何使用 PyTorch 进行机器学习任务。PyTorch 是一个开源的机器学习库,它提供了丰富的工具和库,帮助我们轻松地构建、训练和测试神经网络模型。以下是本教程的主要内容: 一、数据处理 PyTorch…...
【浏览器 - Mac实时调试iOS手机浏览器页面】
最近开发个项目,需要在 Mac 电脑上调试 iOS 手机设备上的 Chrome 浏览器,并查看Chrome网页上的 console 信息,本来以为要安装一些插件,没想到直接使用Mac上的Safari 直接可以调试,再此记录下,分享给需要的伙…...
PyQt5之QtDesigner的若干配置和使用
1.描述 QtDesigner是一个可视化工具,可以通过该工具设计页面 2.简单使用 1.下载PyQt5-tools pip install pyqt5-tools 2.打开designer.exe文件 我采用的是虚拟环境,该文件位于C:\Users\24715\anaconda3\envs\pyqt\Lib\site-packages\qt5_applicatio…...
Flink (十二) :Table API SQL (一) 概览
Apache Flink 有两种关系型 API 来做流批统一处理:Table API 和 SQL。Table API 是用于 Scala 和 Java 语言的查询API,它可以用一种非常直观的方式来组合使用选取、过滤、join 等关系型算子。Flink SQL 是基于 Apache Calcite 来实现的标准 SQL。无论输入…...
侯捷C++day01
一个类该准备什么样的数据、函数。才能满足使用这个类人的需求。 inline关键字是建议编译器做inline处理。 private只有本类可以看到。 C创建对象会自动调用构造函数。不可能在程序中显示调用构造函数。不带指针的类多半不用写析构函数。 以下两个重载构造函数会发生错误 不允许…...
CTF-web: phar反序列化+数据库伪造 [DASCTF2024最后一战 strange_php]
step 1 如何触发反序列化? 漏洞入口在 welcome.php case delete: // 获取删除留言的路径,优先使用 POST 请求中的路径,否则使用会话中的路径 $message $_POST[message_path] ? $_POST[message_path] : $_SESSION[message_path]; $msg $userMes…...
Win11下帝国时代2无法启动解决方法
鼠标右键点图标,选择属性 点开始,输入启用和关闭...
GSI快速收录服务:让你的网站内容“上架”谷歌
辛苦制作的内容无法被谷歌抓取和展示,导致访客无法找到你的网站,这是会让人丧失信心的事情。GSI快速收录服务就是为了解决这种问题而存在的。无论是新上线的页面,还是长期未被收录的内容,通过我们的技术支持,都能迅速被…...
如何用函数去计算x年x月x日是(C#)
如何用函数去计算x年x月x日是? 由于现在人工智能的普及,我们往往会用计算机去算,或者去记录事情 1.计算某一年某一个月有多少天 2.计算某年某月某日是周几 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threadin…...
mysql_init和mysql_real_connect的形象化认识
解析总结 1. mysql_init 的作用 mysql_init 用于初始化一个 MYSQL 结构体,为后续数据库连接和操作做准备。该结构体存储连接配置及状态信息,是 MySQL C API 的核心句柄。 示例: MYSQL *conn mysql_init(NULL); // 初始化连接句柄2. mysql_…...
python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算
【0】基础定义 按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。 按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。 按位异或运算: 两个等长度二进制数上下对齐,相…...
