Python - 爬虫-网页抓取数据-库requests
requests库是一个功能强大的HTTP库,用于发送各种HTTP请求,如GET、POST、PUT、DELETE等。
requests官网:Requests: HTTP for Humans™ — Requests 2.32.3 documentation
使用requests可以模拟浏览器的请求,比起之前用的urllib,requests模块的api更加便捷(本质就是封装了urllib3)
requests库可以通过pip安装:
pip install requests
主要功能和特性
- API简洁:requests的API设计非常简洁,使得发送请求和获取响应变得非常容易。
- 支持多种请求方法:支持GET、POST、PUT、DELETE等多种HTTP请求方法。
- 会话管理:支持会话管理,可以保持连接,方便进行多次请求。
- 支持Cookies和Session:可以方便地处理Cookies和会话,实现模拟登录等功能。
- 异常处理:提供异常处理机制,方便处理网络请求中的错误。
- 支持自动编码:自动处理URL编码和响应内容的编码,使得使用更加方便。
- 支持代理和认证:可以设置代理服务器,支持HTTP认证。
- 响应内容处理:提供丰富的响应内容处理功能,如获取文本、二进制内容、JSON等。
高级功能和使用技巧
- 设置超时:可以通过设置
timeout
参数来控制请求的超时时间。 - 使用代理:通过
proxies
参数设置代理服务器。 - 自定义Headers:通过
headers
参数可以自定义请求头,模拟浏览器请求。 - 处理JSON数据:使用
json
参数可以直接发送JSON数据,并自动处理响应的JSON数据。 - 异常处理:使用try-except结构捕获并处理可能出现的异常,如
requests.exceptions.RequestException
。 - 使用Cookies:通过
cookies
参数可以设置或获取Cookies,实现会话管理
requests库7个主要方法
方法 | 说明 |
---|---|
requsts.requst() | 构造一个请求,最基本的方法,是下面方法的支撑 |
requsts.get() | 获取网页,对应HTTP中的GET方法 |
requsts.post() | 向网页提交信息,对应HTTP中的POST方法 |
requsts.head() | 获取html网页的头信息,对应HTTP中的HEAD方法 |
requsts.put() | 向html提交put方法,对应HTTP中的PUT方法 |
requsts.patch() | 向html网页提交局部请求修改的的请求,对应HTTP中的PATCH方法 |
requsts.delete() | 向html提交删除请求,对应HTTP中的DELETE方法 |
requests内置的状态字符
# -*- coding: utf-8 -*-from .structures import LookupDict_codes = {# Informational.100: ('continue',),101: ('switching_protocols',),102: ('processing',),103: ('checkpoint',),122: ('uri_too_long', 'request_uri_too_long'),200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', ''),201: ('created',),202: ('accepted',),203: ('non_authoritative_info', 'non_authoritative_information'),204: ('no_content',),205: ('reset_content', 'reset'),206: ('partial_content', 'partial'),207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),208: ('already_reported',),226: ('im_used',),# Redirection.300: ('multiple_choices',),301: ('moved_permanently', 'moved', '\\o-'),302: ('found',),303: ('see_other', 'other'),304: ('not_modified',),305: ('use_proxy',),306: ('switch_proxy',),307: ('temporary_redirect', 'temporary_moved', 'temporary'),308: ('permanent_redirect','resume_incomplete', 'resume',), # These 2 to be removed in 3.0# Client Error.400: ('bad_request', 'bad'),401: ('unauthorized',),402: ('payment_required', 'payment'),403: ('forbidden',),404: ('not_found', '-o-'),405: ('method_not_allowed', 'not_allowed'),406: ('not_acceptable',),407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),408: ('request_timeout', 'timeout'),409: ('conflict',),410: ('gone',),411: ('length_required',),412: ('precondition_failed', 'precondition'),413: ('request_entity_too_large',),414: ('request_uri_too_large',),415: ('unsupported_media_type', 'unsupported_media', 'media_type'),416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),417: ('expectation_failed',),418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),421: ('misdirected_request',),422: ('unprocessable_entity', 'unprocessable'),423: ('locked',),424: ('failed_dependency', 'dependency'),425: ('unordered_collection', 'unordered'),426: ('upgrade_required', 'upgrade'),428: ('precondition_required', 'precondition'),429: ('too_many_requests', 'too_many'),431: ('header_fields_too_large', 'fields_too_large'),444: ('no_response', 'none'),449: ('retry_with', 'retry'),450: ('blocked_by_windows_parental_controls', 'parental_controls'),451: ('unavailable_for_legal_reasons', 'legal_reasons'),499: ('client_closed_request',),# Server Error.500: ('internal_server_error', 'server_error', '/o\\', ''),501: ('not_implemented',),502: ('bad_gateway',),503: ('service_unavailable', 'unavailable'),504: ('gateway_timeout',),505: ('http_version_not_supported', 'http_version'),506: ('variant_also_negotiates',),507: ('insufficient_storage',),509: ('bandwidth_limit_exceeded', 'bandwidth'),510: ('not_extended',),511: ('network_authentication_required', 'network_auth', 'network_authentication'),
}codes = LookupDict(name='status_codes')for code, titles in _codes.items():for title in titles:setattr(codes, title, code)if not title.startswith('\\'):setattr(codes, title.upper(), code)
json和data的区别:
使用json
当请求参数是JSON的时候使用json的参数当请求参数是json,但是要使用data的参数,那么请求参数要进行序列化的处理
使用data
当请求参数是表单的时候使用data当请求参数是JSON格式的时候,那么请求参数要进行序列化的处理
requests库的异常
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接异常,如DNS查询失败,拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
一、基于requests之GET请求
1、基本请求
# GET请求
r = requests.get('http://httpbin.org/get')
print(r.status_code,r.reason) # 200 OK
print(r.text)
# {
# "args": {},
# "headers": {
# "Accept": "*/*",
# "Accept-Encoding": "gzip, deflate",
# "Host": "httpbin.org",
# "User-Agent": "python-requests/2.32.3",
# "X-Amzn-Trace-Id": "Root=1-67a700f6-138938e6136cffb223f72ef3"
# },
# "origin": "58.241.18.10",
# "url": "http://httpbin.org/get"
# }
2、带参数的GET请求->params
# GET带参数请求
r = requests.get('http://httpbin.org/get',params={'name':'zhangsan','age':18})
print(r.json()) # {'args': {'age': '18', 'name': 'zhangsan'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67a700f7-7cf1df80781d94dd57a99d44'}, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/get?name=zhangsan&age=18'}
3、带参数的GET请求->headers
通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62'
headers = {'User-Agent':ua
}
r = requests.get('http://httpbin.org/headers',headers=headers)
print(r.json()) # {'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62', 'X-Amzn-Trace-Id': 'Root=1-67a70344-0928ab01777e0ca91dd4e6db'}}
4、带参数的GET请求->cookies
登录github,然后从浏览器中获取cookies,以后就可以直接拿着cookie登录了,无需输入用户名密码
cookies = dict(userid='111111', token='abcd1234')
r = requests.get('http://httpbin.org/cookies',cookies=cookies)
print(r.json()) # {'cookies': {'token': 'abcd1234', 'userid': '111111'}}
二、基于POST请求
r = requests.post('http://httpbin.org/post',data={'name':'zhangsan','age':18})
print(r.json()) # {'args': {}, 'data': '', 'files': {}, 'form': {'age': '18', 'name': 'zhangsan'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '20', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67a702b9-7bc957120cdadae371c32908'}, 'json': None, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/post'}
1、GET请求
HTTP默认的请求方法就是GET
1、没有请求体
2、数据必须在1K之内
3、GET请求数据会暴露在浏览器的地址栏中
GET请求常用的操作:
1、在浏览器的地址栏中直接给出URL,那么就一定是GET请求
2、点击页面上的超链接也一定是GET请求
3、提交表单时,表单默认使用GET请求,但可以设置为POST
2、POST请求
1、数据不会出现在地址栏中
2、数据的大小没有上限
3、有请求体
4、请求体中如果存在中文,会使用URL编码!
注:
!!!requests.post()用法与requests.get()完全一致,特殊的是requests.post()有一个data参数,用来存放请求体数据
import requests'''
requests使用
'''print('--------GET请求--------')
# GET请求
r = requests.get('http://httpbin.org/get')
print(r.status_code,r.reason) # 200 OK
print(r.text)
# {
# "args": {},
# "headers": {
# "Accept": "*/*",
# "Accept-Encoding": "gzip, deflate",
# "Host": "httpbin.org",
# "User-Agent": "python-requests/2.32.3",
# "X-Amzn-Trace-Id": "Root=1-67a700f6-138938e6136cffb223f72ef3"
# },
# "origin": "58.241.18.10",
# "url": "http://httpbin.org/get"
# }
# GET带参数请求
r = requests.get('http://httpbin.org/get',params={'name':'zhangsan','age':18})
print(r.json()) # {'args': {'age': '18', 'name': 'zhangsan'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67a700f7-7cf1df80781d94dd57a99d44'}, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/get?name=zhangsan&age=18'}print('--------POST请求--------')
r = requests.post('http://httpbin.org/post',data={'name':'zhangsan','age':18})
print(r.json()) # {'args': {}, 'data': '', 'files': {}, 'form': {'age': '18', 'name': 'zhangsan'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '20', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67a702b9-7bc957120cdadae371c32908'}, 'json': None, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/post'}print('--------自定义headers请求--------')
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62'
headers = {'User-Agent':ua
}
r = requests.get('http://httpbin.org/headers',headers=headers)
print(r.json()) # {'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62', 'X-Amzn-Trace-Id': 'Root=1-67a70344-0928ab01777e0ca91dd4e6db'}}print('--------带cookies请求--------')
cookies = dict(userid='111111', token='abcd1234')
r = requests.get('http://httpbin.org/cookies',cookies=cookies)
print(r.json()) # {'cookies': {'token': 'abcd1234', 'userid': '111111'}}print('--------Basic-auth认证请求--------')
r = requests.get('http://httpbin.org/basic-auth/admin/admin123',auth=('admin','admin123'))
print(r.json()) # {'authenticated': True, 'user': 'admin'}print('--------抛出状态码异常--------')
bad_r = requests.get('http://httpbin.org/status/404')
print(bad_r.status_code) # 404
# bad_r.raise_for_status() # 抛出异常 requests.exceptions.HTTPError: 404 Client Error: NOT FOUND for url: http://httpbin.org/status/404print('--------requests.Session请求对象--------')
# 创建一个Session对象
s = requests.Session()
# Session对象会保存服务器返回的set-cookies头信息里面的内容
s.get('http://httpbin.org/cookies/set/userid/111111')
s.get('http://httpbin.org/cookies/set/token/abcd1234')
# 下次请求将本地所有cookies信息自动添加到请求头信息里面
r = s.get('http://httpbin.org/cookies')
print(r.json()) # {'cookies': {'token': 'abcd1234', 'userid': '111111'}}print('--------requests使用代理--------')
print('不使用代理:', requests.get('http://httpbin.org/ip').json())
proxies = {'http':'http://localhost:8080'
}
# print('使用代理:', requests.get('http://httpbin.org/ip',proxies=proxies).json())print('--------请求超时--------')
r = requests.get('http://httpbin.org/delay/4',timeout=5)
print(r.text)
三、 curl、wget、urllib 和 requests的优缺点及区别
1、curl
优点
- 支持多种协议(HTTP, HTTPS, FTP等)
- 可以处理复杂的HTTP请求,包括认证、cookies等
- 命令行工具,适合脚本和自动化任务
缺点
- 不是Python原生库,需要通过子进程调用
- 对于Python开发者来说不够直观
适用场景
需要跨语言或跨平台使用时
2、wget
优点
- 简单易用,适合下载整个网站或文件
- 支持递归下载,可以下载整个站点
缺点
- 主要用于文件下载,功能相对单一
- 不支持发送自定义HTTP头或复杂请求
- 同样不是Python原生库,需通过命令行调用
适用场景
批量下载静态资源或整个网站
3、urllib
优点
- Python标准库的一部分,无需额外安装
- 支持基本的HTTP/HTTPS请求,包括GET、POST
- 可以处理URL编码、重定向等
缺点
- API设计较为老旧,代码可读性较差
- 处理复杂请求时代码量较大
适用场景
简单的HTTP请求或对库大小敏感的环境
4、requests
优点
- API简洁友好,易于上手
- 支持会话保持、Cookies、文件上传等功能
- 自动处理重定向、SSL验证等
- 社区活跃,文档丰富
缺点
非标准库,需单独安装
适用场景
绝大多数Web爬虫和API交互任务
总结来说,在Python中开发爬虫时,推荐使用requests库,因为它提供了更简洁的API和更好的用户体验。对于简单的HTTP请求,也可以考虑使用urllib。而curl和wget更适合命令行操作或特定需求场景。
相关文章:
Python - 爬虫-网页抓取数据-库requests
requests库是一个功能强大的HTTP库,用于发送各种HTTP请求,如GET、POST、PUT、DELETE等。 requests官网:Requests: HTTP for Humans™ — Requests 2.32.3 documentation 使用requests可以模拟浏览器的请求,比起之前用的urllib&a…...
antv x6使用(支持节点排序、新增节点、编辑节点、删除节点、选中节点)
项目需要实现如下效果流程图,功能包括节点排序、新增节点、编辑节点、删除节点、选中节点等 html部分如下: <template><div class"MindMapContent"><el-button size"small" click"addNode">新增节点&…...
Nginx 是什么?Nginx高并发架构拆解指南
你是一个程序员,你在电脑上编辑了一段文本,将它保存为 txt 文件。将它拖到浏览器打开,就能看到文件里的内容。 但这看起来太过单调,为了让画面更丰富,我们定个规则,在文本边上加个两个h1符号,文…...
JS forEach方法
遍历数组...
可道云支持群晖的docker安装了:全网唯一支持onlyoffice安装说明
在群晖系统上部署可道云面临显著的技术门槛。DSM7.2版本因不兼容Apache2.2等组件,用户需改用Docker手动配置环境,涉及PHP扩展、SQLite3适配及存储路径映射等复杂操作,且安装后需通过WebStation调整脚本语言参数,对非专业用户极不友…...
V4L2杂谈
V4L2的开发手册 在做v4l2的开发的时候, 可以使用v4l2-ctl命令协助调试和软件开发。关于linux多媒体开发可以参考链接:https://www.linuxtv.org/wiki/index.php/Main_Page关于v4l2的api接口开发可以参考:https://linuxtv.org/docs.php在linux…...
Java—HTML:3D形变
今天我要介绍的是在Java HTML中CSS的相关知识点内容之一:3D形变(3D变换)。该内容包含透视(属性:perspective),3D变换,3D变换函数以及案例演示, 接下来我将逐一介绍&…...
Zotero PDF Translate 翻译插件使用OpenAI API配置教程
PDF Translate:提升 Zotero 内置 PDF 阅读器的翻译功能 “PDF Translate” 是一款为 Zotero 设计的插件,旨在方便用户在 Zotero 内置的 PDF 阅读器中进行划词或段落翻译,辅助阅读外文文献。 一、 安装插件 下载插件: 访问 PDF T…...
[raspberrypi 0w and respeaker 2mic]实时音频波形
0. 环境 ubuntu22主机, 192.168.8.162, raspberry 0w, 192.168.8.220 路由器 1. 树莓派 # rpi - send.py # 或者命令行:arecord -D plughw:1,0 -t wav -f cd -r 16000 -c 2 | nc 192.168.8.162 12345import socket imp…...
go-zero自动生成repository文件和测试用例
文章目录 repository的作用自动生成repository文件repo模板文件repo_test模板文件生成结果运行测试用例 repository的作用 在软件开发中,尤其是在采用分层架构或者领域驱动设计(DDD)的项目里,repository(仓库…...
红宝书第三十六讲:持续集成(CI)配置入门指南
红宝书第三十六讲:持续集成(CI)配置入门指南 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、什么是持续集成? 持续集成(CI)就像咖啡厅的…...
【Java学习】如何利用AI学习Java语言开发(二)
利用AI辅助学习Java语言开发可以显著提高学习效率、解决实际问题和优化代码质量。以下是结合AI工具和方法的系统化学习路径: 一、AI辅助学习基础阶段 智能交互式学习平台 使用Codecademy(AI驱动版)或JetBrains Academy的Java课程,AI会根据你的代码实时提供修正建议 尝试Ch…...
【C++算法】53.链表_重排链表
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 143. 重排链表 题目描述: 解法 模拟 找到链表的中间节点 快慢双指针 把后面的部分逆序 双指针,三指针,头插法 合并两个链表 合并两个有…...
Ubuntu安装Docker引擎
安装Docker引擎 一、注意事项 防火墙兼容性 若使用 ufw 或 firewalld,Docker 容器端口会绕过防火墙规则。建议通过 iptables 或 ip6tables 配置防火墙,并将规则添加到 DOCKER-USER 链。仅支持 iptables-nft 和 iptables-legacy࿰…...
[目标检测]2023ICCV:DiffusionDet: Diffusion Model for Object Detection
作者:Shoufa Chen, Peize Sun, Yibing Song, Ping Luo 论文:https://arxiv.org/pdf/2211.09788v2 代码:https://github.com/ShoufaChen/DiffusionDet 摘要 我们提出了一个新的框架DiffusionDet, 将目标检测构建为从噪声框到目标…...
CExercise_09_结构体和枚举_2VS的Debug模式查看它的内存布局,采用结构体数组的方式存储信息,调用函数打印结构体数组.
题目: 下面结构体类型的变量的内存布局是怎样的?请使用VS的Debug模式查看它的内存布局 typedef struct stundent_s {int number;char name[25];char gender;int chinese;int math;int english; } Student;// 结构体对象的声明和初始化 Student s1 { 1, …...
LeetCode 热题 100_零钱兑换(85_322_中等_C++)(动态规划)
LeetCode 热题 100_零钱兑换(85_322) 题目描述:输入输出样例:题解:解题思路:思路一(动态规划): 代码实现代码实现(思路一(动态规划)&a…...
Java——抽象方法抽象类 接口 详解及综合案例
1.抽象方法抽象类 介绍 抽象方法: 将共性的行为(方法)抽取到父类之后, 由于每一个子类执行的内容是不一样, 所以,在父类中不能确定具体的方法体。 该方法就可以定义为抽象方法。 抽象类: 如果一个类中存在抽象方法,那么该类就必须…...
国产芯片解析:LDR6501 Type-C接口OTG充电PD芯片详解
LDR6501 是一款专为 USB Type-C 设备设计的单C口DPR接口PD通信芯片,封装形式为 SOT23-6。此款芯片具有多项实用功能,在耳机转接器、领夹麦克风以及 OTG 转接头等应用中表现出色。 应用领域 耳机转接器:许多新型耳机采用 Type-C 接口&am…...
Payoneer(P卡)会关联吗?如何有效防止P卡关联?
随着跨境电商和全球支付需求的增加,Payoneer(简称P卡)成为了许多商家和个人进行国际支付和收款的重要工具。Payoneer是一种全球支付平台,支持用户跨国收款、汇款,并提供多种货币的账户支持。 许多从事跨境电商的商家和…...
前端基础之《Vue(3)—计算属性》
一、computed选项 1、计算属性 语法:在computed选项中,定义计算属性方法,在方法体使用声明式变量进行若干计算。 2、计算属性一定是个函数。一定有返回值。 3、计算属性的作用 (1)用于优化指令的表达式,…...
【Linux】Linux 权限:数字背后的神秘 “门禁卡” 系统
目录 权限的基本概念Linux上用户的分类超级用户和普通用户用户之间的切换文件访问者的分类 文件属性与访问权限Linux下的文件类型文件后缀在Linux中的作用文件自身的属性【⭐】文件访问者的三种权限【rwx】文件权限值的表示方法 文件访问权限的相关设置方法chmod——设置文件的…...
Java中List方法的使用详解
目录 一、List接口概述二、List常用方法(一)创建List对象(二)添加元素(三)删除元素(四)查找元素(五)遍历列表(六)列表的大小ÿ…...
多模态大语言模型arxiv论文略读(十一)
Can We Edit Multimodal Large Language Models? ➡️ 论文标题:Can We Edit Multimodal Large Language Models? ➡️ 论文作者:Siyuan Cheng, Bozhong Tian, Qingbin Liu, Xi Chen, Yongheng Wang, Huajun Chen, Ningyu Zhang ➡️ 研究机构: 浙江大…...
JS—防抖和节流:1分钟掌握防抖和节流
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–防抖三–节流四–进阶应用五–总结 二. 防抖(Debounce) 防抖(Debebounce)和节流(Throttle)都是前端开发中用于优化高频事件性能的两…...
MCP基础学习二:MCP服务搭建与配置
文章目录 MCP服务搭建与配置一,学习目标:二,学习内容:1. 如何搭建MCP服务端服务端初始化与配置MCP服务架构与数据流交互图核心实现注册服务功能服务器启动与API暴露 2. 本地应用与MCP服务的集成客户端SDK实现客户端应用实现功能演…...
MyBatis 操作数据库
目录 什么是MyBatis? 注释 Mapper注释的介绍和使用 Select注释的介绍和使用 SpringBootTest注释的介绍和使用 Test注释的介绍的使用 MyBatis入门 1)准备工作 <1>创建工程 <2>数据准备 2)配置数据库连接字符串 3ÿ…...
蓉光:科技与自然的千年交响
故事背景 故事发生在中国四川成都,这座千年古城在近未来完成蜕变,青城山的云雾与锦江的碧波间,智能建筑如雨后春笋般生长。全城建筑采用太阳能皮肤,街道流淌着数字化的都江堰水系,杜甫草堂的飞檐与机械芙蓉树共舞&…...
[C语言]gets和fgets函数区别及详解
一、gets 每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的“互联网蠕虫”,它在 UNIX 操作系统的 finger 后台程序中使用一个 gets 调用作为它的攻击方式之一。很显然,对蠕虫病毒的实现来说, gets 函数的功劳不可小视。不…...
【场景应用3】audio_classification:音频分类的微调
1 引言 本笔记展示了如何对多语种预训练的语音模型进行微调,以实现自动语音识别(Automatic Speech Recognition)。 本笔记旨在使用SUPERB数据集中的关键词检测子集,并且可以使用任何来自模型库(Model Hub)的语音模型检查点,只要该模型有一个包含序列分类头(Sequence …...
【前端】【难点】前端富文本开发的核心难点总结与思路优化
前端富文本开发的核心难点总结 富文本编辑器在前端开发中广泛应用于内容管理系统、文章发布、评论区等场景。其开发与集成存在较多复杂性,涵盖内容结构管理、交互体验、跨平台兼容性等方面,以下逐项分析。 二、富文本开发的具体难点分析 (一…...
如何优雅使用 ReentrantLock 进行加解锁:避免常见坑点,提高代码可维护性
引言:锁的基本概念和问题 在多线程编程中,为了确保多个线程在访问共享资源时不会发生冲突,我们通常需要使用 锁 来同步对资源的访问。Java 提供了不同的锁机制,其中 ReentrantLock 是一种最常用且功能强大的锁,它属于…...
帕金森患者行动迟缓,日常生活怎么破局?
帕金森病,是一种常见于中老年人的神经退行性疾病,正悄然改变着无数患者的生活轨迹。它初期症状隐匿,常以手抖为信号,起初可能只是在安静状态下,手部出现轻微且有节律的震颤,随着时间推移,震颤逐…...
7-openwrt-one通过web页面配置访客网络、无线中继等功能
前几个章节一直在介绍编译、分区之类的,都还没正常开始使用这个路由器的wifi。默认wifi是没有启动的,前面还是通过手动修改uci配置启动的,这个章节介绍下官方web页面的使用。特别是访客网络、无线中继 1、开启wifi,配置wifi基本信息 我们使用有线连接路由器,通过192.168.…...
塑造现代互联网的力量:Berkeley在网络领域的影响与贡献
引言 “Berkeley” 这个名字在计算机网络和互联网领域中具有举足轻重的地位,许多关键的技术、协议和工具都与其紧密相关。它与 加利福尼亚大学伯克利分校(UC Berkeley) 密切相关,该校在计算机科学与网络研究中做出了许多开创性的…...
大数据学习(105)-Hbase
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
c# 系列pdf转图片 各种处理3--net3.1到net8 PDFtoImage
最近一直在做pdf渲染图片的问题,nuget PDFtoImage 支持3.1到net8 ,直接上代码 private static void DownloadFileAsync(string url, string localPath){using (HttpClient client new HttpClient()){client.DefaultRequestHeaders.Add("User-Agen…...
宁德时代25年春招笔试演绎数字推理SHL测评题库
宁德时代校招测评包含演绎推理数字推理两部分,请单击以下链接进行测评,详细操作指引请参见如下指引,请在测试前了解,大约用时60分钟。正式测评有两个部分:数字推理18分钟演绎推理18分钟,数字推理共10题,演绎…...
C# 看门狗策略实现
using System; using System.Threading;public class Watchdog {private Timer _timer;private volatile bool _isTaskAlive;private readonly object _lock new object();private const int CheckInterval 5000; // 5秒检测一次private const int TimeoutThreshold 10000; …...
聊透多线程编程-线程池-5.C# 线程池(ThreadPool)详解
1. 线程池的基本概念 线程池的作用 由于每创建一个线程都需要该线程分配一定的内存空间,因此创建大量线程会导致内存使用量迅速增加,并可能导致性能问题。线程池的主要目的是减少线程创建和销毁的开销,从而提高程序性能。线程池维护了…...
清华DeepSeek教程又双叒叕更新了!(共7份PDF下载)
清华团队的DeepSeek教程又双叒叕更新了,目前共计有7份DeepSeek的教程,分别是《DeepSeek从入门到精通》、《DeepSeek赋能职场》、《普通人如何抓住DeepSeek红利》、《DeepSeekDeepResearch:让科研像聊天一样简单》、《DeepSeek与AI幻觉》、《A…...
免费在线文档工具,在线PDF添加空白页,免费在任意位置插入空白页,多样化的文件处理
小白工具(https://www.xiaobaitool.net/files/pdf-add-page/ )是一款免费的在线文档工具,专注于为用户提供便捷的 PDF 空白页添加服务。 功能特点:该工具支持在 PDF 文件的任意位置插入单页或多页空白页,能满足用户不同…...
MATLAB在哪些特定领域比Python更有优势?
文章目录 前言科学研究与工程计算数值计算信号处理控制系统设计 教育领域易于学习和上手教学资源丰富 快速原型开发集成开发环境便捷 前言 MATLAB 在以下特定领域比 Python 更具优势: 科学研究与工程计算 数值计算 高效矩阵运算:MATLAB 以矩阵为基本数…...
CAN协议
CAN简介 TJA1050(高速CAN收发器) 5V供电 界定符用来隔开各个数据 这个时候就要用到采样了 谁先谁后??仲裁机制 发送邮箱用来放帧的 正常模式:正常收发 静默模式:只收不发 环回模式:不读,自己收 环回静…...
MFC案例:用鼠标移动窗口图像的实验
当使用基于对话框的MFC项目窗口显示图像时,如窗口的尺寸小于图像的尺寸,在不做缩放的情况下按照原图尺寸在窗口显示,那么只能看到图像的局部,这时我们希望可以通过鼠标移动图像进而显示其它部分。今天就进行这个实验,编…...
Linux基础IO(五)之用户缓冲区
文章目录 缓冲区FILE初步实现缓冲区 缓冲区 FILE 因为IO相关函数与系统调用接口对应,并且库函数封装系统调用, 所以本质上,访问文件都是通过fd访问的。 所以C库当中的FILE结构体内部,必定封装了fd。 编写代码and查看现象&…...
【Scrapy】Scrapy教程12——中间件
中间件这部分算是一个高阶的Scrapy内容,即便不了解这部分也可以使用Scrapy,但是一些特殊情况使用中间件就比较方便处理了,比如修改请求和响应等。 通过之前的工作原理图中,我们了解到Scrapy中有两个中间件,分别是下载器中间件和爬虫中间件,本节将一一讲解如何激活、编写自…...
C++学习之ORACLE①
目录 1.ORACLE数据库简介 2..ORACLE数据库安装 3..ORACLE体系结构 4..ORACLE基本概念 5..ORACLE基本元素 6..ORACLE数据库启动和关闭 7.SQLPLUS登录ORACLE数据库相关操作 8.SQLPLUS的基本操作 9.oracle中上课使用的方案 10.SQL语言分类 11.SQL中的select语句语法和注…...
vue---按钮防抖和节流----项目问题
一般来说前端都需要做按钮防抖避免一个时间被重复触发,首先可能会出现bug,消耗服务器性能,用户体验也不是很好。 1.防抖 解决方法:main.js文件自定义指令 Vue.directive("preventReClick", {inserted(el, binding) {…...
【LunarVim】解决which-key 自定义键位注册不成功问题
问题描述 LunarVim将which-key设置放在一个keymaps.lua中,然后config.lua调用reload “user.keymaps”,键位没用注册成功,而直接写在config.lua中,就注册成功 这暴露了LunarVim 插件和配置加载顺序的一些细节坑,下面解…...