【爬虫开发】爬虫从0到1全知识md笔记第2篇:requests模块,知识点:【附代码文档】

爬虫开发从0到1全知识教程完整教程(附代码资料)主要内容讲述:爬虫课程概要,爬虫基础爬虫概述,爬虫的分类,http协议复习。requests模块,requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. requests模块发送post请求,5. 利用requests.session进行状态保持。数据提取概要,数据提取概述1. 响应内容的分类,2. 认识xml以及和html的区别,1. jsonpath模块的使用场景,2. jsonpath模块的使用方法,3. jsonpath练习,1. 了解 lxml模块和xpath语法。Selenium课程概要selenium的介绍,selenium提取数据。Selenium课程概要,反爬与反反爬selenium的其它使用方法。反爬与反反爬常见的反爬手段和解决思路。反爬与反反爬验证码处理,chrome浏览器使用方法介绍。反爬与反反爬,Mongodb数据库JS的解析,介绍,内容,mongodb文档,Mongodb的介绍和安装,小结。Mongodb数据库介绍,内容,mongodb文档,mongodb的简单使用,小结,Mongodb的的增删改查。Mongodb数据库介绍,内容,mongodb文档,mongodb的聚合操作,2 mongodb的常用管道和表达式,Mongodb的索引操作。Mongodb数据库,scrapy爬虫框架介绍,内容,mongodb文档,mongodb和python交互,小结,介绍。scrapy爬虫框架,scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy的入门使用,小结,介绍。scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy管道的使用,小结,scrapy的crawlspider爬虫。scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy中间件的使用,小结,scrapy_redis概念作用和流程。scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy_redis原理分析并实现断点续爬以及分布式爬虫,小结,scrapy_splash组件的使用。scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy的日志信息与配置,小结,scrapyd部署scrapy项目。利用appium抓取app中的信息,利用appium抓取app中的信息介绍,内容,appium环境安装,介绍,内容,利用appium自动控制移动设备并提取数据。appium环境安装,Mongodb的介绍和安装,小结。scrapy的概念和流程 ,小结,selenium的介绍,常见的反爬手段和解决思路。数据提取概述1. 响应内容的分类,2. 认识xml以及和html的区别,爬虫概述,http协议复习。mongodb的简单使用,小结,scrapy的入门使用,小结。selenium提取数据,利用appium自动控制移动设备并提取数据。验证码处理。数据提取-jsonpath模块1. jsonpath模块的使用场景,2. jsonpath模块的使用方法,3. jsonpath练习,chrome浏览器使用方法介绍,Mongodb的的增删改查,小结。scrapy数据建模与请求,小结,selenium的其它使用方法。数据提取-lxml模块1. 了解 lxml模块和xpath语法,2. 谷歌浏览器xpath helper插件的安装和使用,3. xpath的节点关系,4. xpath语法-基础节点选择语法,5. xpath语法-节点修饰语法,6. xpath语法-其他常用节点选择语法。JS的解析,mongodb的聚合操作,2 mongodb的常用管道和表达式。scrapy模拟登陆,小结,Mongodb的索引操作,小结,scrapy管道的使用,小结。Mongodb的权限管理,小结,scrapy中间件的使用,小结。mongodb和python交互,小结,scrapy_redis概念作用和流程,小结,scrapy_redis原理分析并实现断点续爬以及分布式爬虫,小结。scrapy_splash组件的使用,小结,scrapy的日志信息与配置,小结。scrapyd部署scrapy项目,13.Gerapy,13.Gerapy。1.2.1-简单的代码实现,目标urlscrapy的crawlspider爬虫。

全套笔记资料代码移步: 前往gitee仓库查看

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~


全套教程部分目录:


部分文件图片:

requests模块

本阶段课程主要学习requests这个http模块,该模块主要用于发送请求获取响应,该模块有很多的替代模块,比如说urllib模块,但是在工作中用的最多的还是requests模块,requests的代码简洁易懂,相对于臃肿的urllib模块,使用requests编写的爬虫代码将会更少,而且实现某一功能将会简单。因此建议大家掌握该模块的使用

requests模块

知识点:
  • 掌握 headers参数的使用
  • 掌握 发送带参数的请求
  • 掌握 headers中携带cookie
  • 掌握 cookies参数的使用
  • 掌握 cookieJar的转换方法
  • 掌握 超时参数timeout的使用
  • 掌握 ip参数proxies的使用
  • 掌握 使用verify参数忽略CA证书
  • 掌握 requests模块发送post请求
  • 掌握 利用requests.session进行状态保持

前面我们了解了爬虫的基础知识,接下来我们来学习如何在代码中实现我们的爬虫

1. requests模块介绍

requests文档[

1.1 requests模块的作用:

  • 发送http请求,获取响应数据

1.2 requests模块是一个第三方模块,需要在你的python(虚拟)环境中额外安装

  • pip/pip3 install requests

1.3 requests模块发送get请求

  1. 需求:通过requests向百度首页发送请求,获取该页面的源码

  2. 运行下面的代码,观察打印输出的结果

  # 1.2.1-简单的代码实现import requests # 目标urlurl = ' # 向目标url发送get请求response = requests.get(url)# 打印响应内容print(response.text)

知识点:掌握 requests模块发送get请求

2. response响应对象

观察上边代码运行结果发现,有好多乱码;这是因为编解码使用的字符集不同早造成的;我们尝试使用下边的办法来解决中文乱码问题

  # 1.2.2-response.contentimport requests # 目标urlurl = ' # 向目标url发送get请求response = requests.get(url)# 打印响应内容# print(response.text)print(response.content.decode()) # 注意这里!
  1. response.text是requests模块按照chardet模块推测出的编码字符集进行解码的结果
  2. 网络传输的字符串都是bytes类型的,所以response.text = response.content.decode(‘推测出的编码字符集’)
  3. 我们可以在网页源码中搜索charset,尝试参考该编码字符集,注意存在不准确的情况

2.1 response.text 和response.content的区别:

  • response.text

    • 类型:str
    • 解码类型: requests模块自动根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
  • response.content

    • 类型:bytes
    • 解码类型: 没有指定

知识点:掌握 response.text和response.content的区别

2.2 通过对response.content进行decode,来解决中文乱码

  • response.content.decode() 默认utf-8

  • response.content.decode("GBK")

  • 常见的编码字符集

    • utf-8
    • gbk
    • gb2312
    • ascii (读音:阿斯克码)
    • iso-8859-1

知识点:掌握 利用decode函数对requests.content解决中文乱码

2.3 response响应对象的其它常用属性或方法

response = requests.get(url)中response是发送请求获取的响应对象;response响应对象中除了text、content获取响应内容以外还有其它常用的属性或方法:

  • response.url响应的url;有时候响应的url和请求的url并不一致
  • response.status_code 响应状态码
  • response.request.headers 响应对应的请求头
  • response.headers 响应头
  • response.request._cookies 响应对应请求的cookie;返回cookieJar类型
  • response.cookies 响应的cookie(经过了set-cookie动作;返回cookieJar类型
  • response.json()自动将json字符串类型的响应内容转换为python对象(dict or list)
  # 1.2.3-response其它常用属性import requests# 目标urlurl = '# 向目标url发送get请求response = requests.get(url)# 打印响应内容# print(response.text)# print(response.content.decode())             # 注意这里!print(response.url)                            # 打印响应的url
print(response.status_code)                    # 打印响应的状态码
print(response.request.headers)                # 打印响应对象的请求头
print(response.headers)                        # 打印响应头
print(response.request._cookies)            # 打印请求携带的cookies
print(response.cookies)                        # 打印响应中携带的cookies

知识点:掌握 response响应对象的其它常用属性

3. requests模块发送请求

3.1 发送带header的请求

我们先写一个获取百度首页的代码

import requestsurl = 'response = requests.get(url)print(response.content.decode())# 打印响应对应请求的请求头信息print(response.request.headers)
3.1.1 思考
  1. 对比浏览器上百度首页的网页源码和代码中的百度首页的源码,有什么不同?

    • 查看网页源码的方法:

      • 右键-查看网页源代码 或
      • 右键-检查
  2. 对比对应url的响应内容和代码中的百度首页的源码,有什么不同?

    • 查看对应url的响应内容的方法:

      1. 右键-检查
      2. 点击 Net work
      3. 勾选 Preserve log
      4. 刷新页面
      5. 查看Name一栏下和浏览器地址栏相同的url的Response
  3. 代码中的百度首页的源码非常少,为什么?

    • 需要我们带上请求头信息

    回顾爬虫的概念,模拟浏览器,欺骗服务器,获取和浏览器一致的内容

    • 请求头中有很多字段,其中User-Agent字段必不可少,表示客户端的操作系统以及浏览器的信息
3.1.2 携带请求头发送请求的方法

requests.get(url, headers=headers)

  • headers参数接收字典形式的请求头
  • 请求头字段名作为key,字段对应的值作为value
3.1.3 完成代码实现

从浏览器中复制User-Agent,构造headers字典;完成下面的代码后,运行代码查看结果

import requestsurl = 'headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}# 在请求头中带上User-Agent,模拟浏览器发送请求response = requests.get(url, headers=headers) print(response.content)# 打印请求头信息print(response.request.headers)

知识点:掌握 headers参数的使用

3.2 发送带参数的请求

我们在使用百度搜索的时候经常发现url地址中会有一个 ?,那么该问号后边的就是请求参数,又叫做查询字符串

3.2.1 在url携带参数

直接对含有参数的url发起请求

import requestsheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}url = 'response = requests.get(url, headers=headers)
3.2.2 通过params携带参数字典

​ 1.构建请求参数字典

​ 2.向接口发送请求的时候带上参数字典,参数字典设置给params

import requestsheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}# 这是目标url# url = '# 最后有没有问号结果都一样url = '# 请求参数是一个字典 即wd=pythonkw = {'wd': 'python'}# 带上请求参数发起请求,获取响应response = requests.get(url, headers=headers, params=kw)print(response.content)

知识点:掌握发送带参数的请求的方法

3.3 在headers参数中携带cookie

网站经常利用请求头中的Cookie字段来做用户访问状态的保持,那么我们可以在headers参数中添加Cookie,模拟普通用户的请求。我们以github登陆为例:

3.3.1 github登陆抓包分析
  1. 打开浏览器,右键-检查,点击Net work,勾选Preserve log
  2. 访问github登陆的url地址 `
  3. 输入账号密码点击登陆后,访问一个需要登陆后才能获取正确内容的url,比如点击右上角的Your profile访问`
  4. 确定url之后,再确定发送该请求所需要的请求头信息中的User-Agent和Cookie

requests-3-2-1-4

3.3.2 完成代码
  • 从浏览器中复制User-Agent和Cookie
  • 浏览器中的请求头字段和值与headers参数中必须一致
  • headers请求参数字典中的Cookie键对应的值是字符串
import requestsurl = '# 构造请求头字典headers = {# 从浏览器中复制过来的User-Agent'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',# 从浏览器中复制过来的Cookie'Cookie': 'xxx这里是复制过来的cookie字符串'
}# 请求头参数字典中携带cookie字符串resp = requests.get(url, headers=headers)print(resp.text)
3.3.3 运行代码验证结果

在打印的输出结果中搜索title,html中的标题文本内容如果是你的github账号,则成功利用headers参数携带cookie,获取登陆后才能访问的页面

requests-3-2-3


知识点:掌握 headers中携带cookie

3.4 cookies参数的使用

上一小节我们在headers参数中携带cookie,也可以使用专门的cookies参数

  1. cookies参数的形式:字典

cookies = {"cookie的name":"cookie的value"}

  • 该字典对应请求头中Cookie字符串,以分号、空格分割每一对字典键值对
  • 等号左边的是一个cookie的name,对应cookies字典的key
  • 等号右边对应cookies字典的value
  1. cookies参数的使用方法

response = requests.get(url, cookies)

  1. 将cookie字符串转换为cookies参数所需的字典:

cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}

  1. 注意:cookie一般是有过期时间的,一旦过期需要重新获取
import requestsurl = '# 构造请求头字典headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
}# 构造cookies字典cookies_str = '从浏览器中copy过来的cookies字符串'cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}# 请求头参数字典中携带cookie字符串resp = requests.get(url, headers=headers, cookies=cookies_dict)print(resp.text)

知识点:掌握 cookies参数的使用

3.5 cookieJar对象转换为cookies字典的方法

使用requests获取的resposne对象,具有cookies属性。该属性值是一个cookieJar类型,包含了对方服务器设置在本地的cookie。我们如何将其转换为cookies字典呢?

  1. 转换方法

cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)

  1. 其中response.cookies返回的就是cookieJar类型的对象

  2. requests.utils.dict_from_cookiejar函数返回cookies字典


知识点:掌握 cookieJar的转换方法

3.6 超时参数timeout的使用

在平时网上冲浪的过程中,我们经常会遇到网络波动,这个时候,一个请求等了很久可能任然没有结果。

在爬虫中,一个请求很久没有结果,就会让整个项目的效率变得非常低,这个时候我们就需要对请求进行强制要求,让他必须在特定的时间内返回结果,否则就报错。

  1. 超时参数timeout的使用方法

response = requests.get(url, timeout=3)

  1. timeout=3表示:发送请求后,3秒钟内返回响应,否则就抛出异常
import requestsurl = '
response = requests.get(url, timeout=3)     # 设置超时时间

知识点:掌握 超时参数timeout的使用

3.7 了解以及proxy参数的使用

proxy参数通过指定ip,让ip对应的正向服务器转发我们发送的请求,那么我们首先来了解一下ip以及服务器

3.7.1 理解使用的过程
  1. ip是一个ip,指向的是一个服务器
  2. 服务器能够帮我们向目标服务器转发请求

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.7.2 正向和反向的区别

前边提到proxy参数指定的ip指向的是正向的服务器,那么相应的就有反向服务器;现在来了解一下正向服务器和反向服务器的区别

  1. 从发送请求的一方的角度,来区分正向或反向

  2. 为浏览器或客户端(发送请求的一方)转发请求的,叫做正向

    • 浏览器知道最终处理请求的服务器的真实ip地址,例如VPN
  3. 不为浏览器或客户端(发送请求的一方)转发请求、而是为最终处理请求的服务器转发请求的,叫做反向

    • 浏览器不知道服务器的真实地址,例如nginx
3.7.3 ip(服务器)的分类
  1. 根据ip的匿名程度,IP可以分为下面三类:

    • 透明(Transparent Proxy):透明虽然可以直接“隐藏”你的IP地址,但是还是可以查到你是谁。目标服务器接收到的请求头如下:

REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP

* 匿名(Anonymous Proxy):使用匿名,别人只能知道你用了,无法知道你是谁。目标服务器接收到的请求头如下:```python
REMOTE_ADDR = proxy IP
HTTP_VIA = proxy IP
HTTP_X_FORWARDED_FOR = proxy IP
  • 高匿(Elite proxy或High Anonymity Proxy):高匿让别人根本无法发现你是在用,所以是最好的选择。毫无疑问使用高匿效果最好。目标服务器接收到的请求头如下:
REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
HTTP_X_FORWARDED_FOR = not determined
  1. 根据网站所使用的协议不同,需要使用相应协议的服务。从服务请求使用的协议可以分为:

    • http:目标url为http协议

    • https:目标url为https协议

    • socks隧道(例如socks5)等:

      1. socks 只是简单地传递数据包,不关心是何种应用协议(FTP、HTTP和HTTPS等)。
      2. socks 比http、https耗时少。
      3. socks 可以转发http和https的请求
3.7.4 proxies参数的使用

为了让服务器以为不是同一个客户端在请求;为了防止频繁向一个域名发送请求被封ip,所以我们需要使用ip;那么我们接下来要学习requests模块是如何使用ip的

  • 用法:
response = requests.get(url, proxies=proxies)
  • proxies的形式:字典

  • 例如:

proxies = { "http": " "https": " 
}
  • 注意:如果proxies字典中包含有多个键值对,发送请求时将按照url地址的协议来选择使用相应的ip

知识点:掌握 ip参数proxies的使用

3.8 使用verify参数忽略CA证书

在使用浏览器上网的时候,有时能够看到下面的提示(2018年10月之前的12306网站):

12306ssl错误

  • 原因:该网站的CA证书没有经过【受信任的根证书颁发机构】的认证
  • **[关于CA证书以及受信任的根证书颁发机构点击了解更多](
3.8.1 运行代码查看代码中向不安全的链接发起请求的效果

运行下面的代码将会抛出包含ssl.CertificateError ...字样的异常

import requests
url = "
response = requests.get(url)
3.8.2 解决方案

为了在代码中能够正常的请求,我们使用verify=False参数,此时requests模块发送请求将不做CA证书的验证:verify参数能够忽略CA证书的认证

import requests
url = " 
response = requests.get(url,verify=False)

知识点:掌握 使用verify参数忽略CA证书

4. requests模块发送post请求

思考:哪些地方我们会用到POST请求?

  1. 登录注册( 在web工程师看来POST 比 GET 更安全,url地址中不会暴露用户的账号密码等信息)
  2. 需要传输大文本内容的时候( POST 请求对数据长度没有要求)

所以同样的,我们的爬虫也需要在这两个地方回去模拟浏览器发送post请求

4.1 requests发送post请求的方法

  • response = requests.post(url, data)

  • data参数接收一个字典

  • requests模块发送post请求函数的其它参数和发送get请求的参数完全一致

4.2 POST请求练习

下面面我们通过金山翻译的例子看看post请求如何使用:

  1. 地址:[
思路分析
  1. 抓包确定请求的url地址

  1. 确定请求的参数

  1. 确定返回数据的位置

  1. 模拟浏览器获取数据
4.2.3 抓包分析的结论
  1. url地址:`

  2. 请求方法:POST

  3. 请求所需参数:

data = {'f': 'auto', # 表示被翻译的语言是自动识别't': 'auto', # 表示翻译后的语言是自动识别'w': '人生苦短' # 要翻译的中文字符串
}
  1. pc端User-Agent:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

4.2.4 代码实现

了解requests模块发送post请求的方法,以及分析过移动端的百度翻译之后,我们来完成代码

import requests
import jsonclass King(object):def __init__(self, word):self.url = "self.word = wordself.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}self.post_data = {"f": "auto","t": "auto","w": self.word}def get_data(self):response = requests.post(self.url, headers=self.headers, data=self.post_data)# 默认返回bytes类型,除非确定外部调用使用str才进行解码操作return response.contentdef parse_data(self, data):# 将json数据转换成python字典dict_data = json.loads(data)# 从字典中抽取翻译结果try:print(dict_data['content']['out'])except:print(dict_data['content']['word_mean'][0])def run(self):# url# headers# post——data# 发送请求data = self.get_data()# 解析self.parse_data(data)if __name__ == '__main__':# king = King("人生苦短,及时行乐")king = King("China")king.run()# python标准库有很多有用的方法,每天看一个标准库的使用

知识点:掌握 requests模块发送post请求

5. 利用requests.session进行状态保持

requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。接下来我们就来学习它

5.1 requests.session的作用以及应用场景

  • requests.session的作用

    • 自动处理cookie,即 下一次请求会带上前一次的cookie
  • requests.session的应用场景

    • 自动处理连续的多次请求过程中产生的cookie

5.2 requests.session使用方法

session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie

session = requests.session() # 实例化session对象
response = session.get(url, headers, ...)
response = session.post(url, data, ...)
  • session对象发送get或post请求的参数,与requests模块发送请求的参数完全一致

5.3 课堂测试

使用requests.session来完成github登陆,并获取需要登陆后才能访问的页面

5.3.1 提示
  1. 对github登陆以及访问登陆后才能访问的页面的整个完成过程进行抓包

  2. 确定登陆请求的url地址、请求方法和所需的请求参数

    • 部分请求参数在别的url对应的响应内容中,可以使用re模块获取
  3. 确定登陆后才能访问的页面的的url地址和请求方法

  4. 利用requests.session完成代码

5.3.2 参考代码
import requests
import re# 构造请求头字典headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
}# 实例化session对象session = requests.session()# 访问登陆页获取登陆请求所需参数response = session.get(' headers=headers)
authenticity_token = re.search('name="authenticity_token" value="(.*?)" />', response.text).group(1) # 使用正则获取登陆请求所需参数# 构造登陆请求参数字典data = {'commit': 'Sign in', # 固定值'utf8': '✓', # 固定值'authenticity_token': authenticity_token, # 该参数在登陆页的响应内容中'login': input('输入github账号:'),'password': input('输入github账号:')
}# 发送登陆请求(无需关注本次请求的响应)session.post(' headers=headers, data=data)# 打印需要登陆后才能访问的页面response = session.get(' headers=headers)
print(response.text)

知识点:掌握 利用requests.session进行状态保持

未完待续, 同学们请等待下一期

全套笔记资料代码移步: 前往gitee仓库查看

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

财富池指标--通达信顾比均线实战指标免费源码

顾比均线是由两组均线构成,短期组为3、5、8、10、12、15。长期组为:30、35、40、45、50、60。顾比均线由澳大利亚的投资家戴若-顾比先生发明,因此叫顾比线。 顾比均线可以广泛运用于股票、期货和外汇交易中,只要是能运用K线图的投…

<QT基础(3)>QLineEdit使用笔记

LineEdit 这次要用的是两个功能:初始化展示参数值,修改参数值。 初始化 将l_num的默认值显示 ui.lineEdit->setText(QString::number(l_num));信号 textChanged() 文本发生改变textEdited() 文本编辑信号cursorPositionChanged()光标发…

KVM:尝试安装windows2008

最终目的是在lxd部署windows2008镜像 WindowsServer2008镜像: cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_x64_dvd_617598.iso 镜像参考链接: https://discussion.scottibyte.com/t/migrate-a-hyper-v-windows-vir…

【娱乐】战双帕弥什游戏笔记攻略

文章目录 Part.I IntroductionChap.I Information Part.II 新手攻略Chap.I 角色和武器挑选Chap.II 新手意识推荐 Part.II 阵容搭配Chap.I 一拖二Chap.II 毕业队 Reference Part.I Introduction 2019年12月5日全平台公测。 偶然间入坑战双,玩了几天,觉得…

Codeforces Round 937 (Div. 4)

目录 A. Stair, Peak, or Neither? B. Upscaling C. Clock Conversion D. Product of Binary Decimals E. Nearly Shortest Repeating Substring F. 0, 1, 2, Tree! G. Shuffling Songs A. Stair, Peak, or Neither? 直接按照题意模拟即可 void solve(){int a,b,c; c…

YOLOv9改进策略 : C2f改进 | 引入YOLOv8 C2f结构

💡💡💡本文改进内容:应订阅者需求,如何将YOLOv8 C2f结构引入到YOLOv9 💡💡💡C2f层是一种特殊的卷积层,用于将不同尺度的特征图融合在一起,以提高目标检测的准…

真心建议今年拿下软考证书,再不冲就晚了!

随着国家计算机与软件技术的发展,每年报名参加计算机软件资格考试(简称:软考)的人越来越多。 据工信部新闻发布会消息:2023年有超500万人都在考软考,报名人数较2020年直翻10倍。 据悉,国内持软…

leetcode216组合总和III

本题思考: 对于输入样例k3,n9 输出里面为什么只有 [[1,2,6],[1,3,5],[2,3,4]]而没有下图所示的重复情况出现呢? 当时代码写错了,思考许久不得解,后面经过仔细对比代码之后发现是我的代码出现了逻辑错误,而正是这一关键…

了解一下npm i的流程与原理

流程 执行npm install,先判断有无lock文件。 1、没有lock文件。会先根据依赖构建出扁平的依赖关系决定下哪些包。新版本的依赖关系是扁平化的,老版本是树结构,可能会出现依赖重复安装的问题,老版本示意图如下: 作为前…

Jupyter notebook修改默认存储位置

1. 首先,打开Anaconda Prompt 输入命令: jupyter notebook --generate-config2. 根据刚才命令行输出的结果找到config文件,如图所示 3. 打开文件 ctrl F ,然后输入notebooks and kernels找到对应的内容,在The dire…

Git实现提交代码自动更新package.json版本号

此文章主要讲诉如何通过git提交代码来自动更新我们的版本号,也可以指定固定分支才能更新 只要涉及到package version的项目都可以,例如:Vue、React、Node等等 前提是当前项目已经关联了Git仓库 一、编写我们的Node更新版本逻辑,名…

Qt与编码

ASCII码:一个字节&#xff0c;256个字符。 Unicode:字母&#xff0c;汉字都占用两个字节。 utf-8:字母一个字节&#xff0c;汉字3个字节。 gbk:字母一个字节&#xff0c;汉字2个字节。 gb2312:可以表示汉字&#xff0c;gb2312<gbk。 编码查看&#xff1a; https://www.…