爬虫学习第一天

news2024/11/21 1:46:20

爬虫-1

  • 爬虫学习第一天
    • 1、什么是爬虫
    • 2、爬虫的工作原理
    • 3、爬虫核心
    • 4、爬虫的合法性
    • 5、爬虫框架
    • 6、爬虫的挑战
    • 7、难点
    • 8、反爬手段
      • 8.1、Robots协议
      • 8.2、检查 User-Agent
      • 8.3、ip限制
      • 8.4、SESSION访问限制
      • 8.5、验证码
      • 8.6、数据动态加载
      • 8.7、数据加密-使用加密算法
    • 9、用python学习爬虫,需要用到 request模块
    • 10、函数
    • 11、requests模块
      • 11.3、玩一下
    • 12、玩一玩豆瓣读书

爬虫学习第一天

1、什么是爬虫

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

通俗来讲,假如你需要互联网上的信息,如商品价格,图片视频资源等,但你又不想或者不能自己一个一个自己去打开网页收集,这时候你便写了一个程序,让程序按照你指定好的规则去互联网上收集信息,这便是爬虫,我们熟知的百度,谷歌等搜索引擎背后其实也是一个巨大的爬虫

2、爬虫的工作原理

爬虫的基本工作流程通常包括以下几个步骤:

  1. 发起请求:爬虫首先向目标网站发送HTTP请求,请求特定的网页内容1。
  2. 获取响应:服务器处理这些请求后,会返回相应的网页内容,爬虫接收这些内容1。
  3. 解析内容:爬虫对获取的网页内容进行解析,提取有用信息。这通常涉及到HTML、CSS和JavaScript的解析。
  4. 提取数据:解析后的内容中,爬虫会根据预设的规则提取所需的数据,如文本、图片、链接等。
  5. 存储数据:提取的数据会被存储到数据库或文件中,以便后续的分析和使用。
  6. 发现新链接:在解析内容的过程中,爬虫会发现新的链接地址,这些链接将被加入到待爬取的队列中,循环执行上述步骤。

3、爬虫核心

  • **爬取网页:**爬取整个页面,包含了网页中所有的内容

  • **解析数据:**将网页中你得到的数据,进行解析,获取需要的数据

  • **存储数据:**将解析后的数据保存到数据库、文件系统或其他存储介质中,以便后续的访问和使用。

  • **分析数据:**对存储的数据进行统计、挖掘和分析,提取有价值的信息或洞察,为决策提供支持。

  • **可视化数据:**将分析结果通过图表、图形等形式直观展现出来,帮助用户更好地理解和利用数据。

4、爬虫的合法性

爬虫技术本身是中立的,其合法性取决于使用爬虫的目的和方式。一般来说,只要爬虫的行为不影响网站的正常运行,并且不是出于商业目的,大多数网站只会采取技术手段限制爬虫,如封禁IP或账号,而不涉及法律风险1。此外,许多网站通过robots.txt文件声明了哪些内容可以被抓取,哪些不可以,这是一种行业约定,虽然没有法律约束力,但遵守这些规则是一种良好的网络道德行为1。

5、爬虫框架

随着爬虫技术的发展,出现了一些成熟的爬虫框架,如Scrapy。这些框架提供了一套完整的解决方案,包括请求管理、数据解析、数据存储等,使得开发者能够更专注于爬虫逻辑的实现。

6、爬虫的挑战

爬虫在实际应用中可能会遇到一些挑战,如网站的反爬策略、动态加载的内容、登录认证等。这些挑战需要爬虫开发者具备一定的技术能力,包括但不限于JavaScript逆向、模拟登录、使用代理IP等。

7、难点

  • 爬虫和反爬虫之间的博弈
  • 爬虫会加大系统负载!并发(每秒访问的人数100)爬虫1000
  • 什么是反爬虫
    • 阻止非正常用户来访问我的系统
    • 登录站点=》输入验证码(图片,手机)
      • 刷新太快

8、反爬手段

8.1、Robots协议

image-20240404221428586

8.2、检查 User-Agent

image-20240404221715577

8.3、ip限制

  • 通过对访问频率进行限制,如果某个IP地址在单位时间内请求次数过多,则可能暂时或永久封禁该IP地址。

image-20240404221941859

8.4、SESSION访问限制

image-20240404222045274

8.5、验证码

image-20240404222102843

8.6、数据动态加载

image-20240404222424982

8.7、数据加密-使用加密算法

image-20240404222448039

9、用python学习爬虫,需要用到 request模块

image-20240404223601491

通常先用dir或者help来查看怎么使用

Requests is an HTTP library, written in Python, for human beings.
Requests是一个HTTP库,用Python编写,供人类使用。

image-20240404223921700

这段文本是Python中`requests`库的一个函数文档字符串,描述了`get`函数的用途和参数。`requests`是一个非常流行的HTTP库,用于发送HTTP请求并处理返回的响应。下面是对这段文档的详细解释:

### 函数名称
`get` - 这是`requests`库中的一个函数,用于发送HTTP GET请求。

### 参数
- `url`: 这是必须提供的参数,表示要发送GET请求的目标URL。这个URL可以是完整的,也可以是相对路径,如果是相对路径,它会基于当前的URL上下文进行解析。
- `params`: 这是一个可选参数,用于传递查询字符串。它可以是一个字典、列表或元组,也可以是字节串。这个参数中的数据会被添加到URL的查询字符串中。例如,当你想要传递查询参数如`page=1`和`limit=10`时,你可以这样做:`params={'page': 1, 'limit': 10}`。
- `**kwargs`: 这是Python中的参数字典,它允许你传递任意数量的其他参数给函数。在`get`函数中,这可以用来传递`requests`库中`Request`对象支持的其他参数,比如`headers`、`cookies`、`auth`等。

### 返回值
- `Response`对象 - 当GET请求发送并接收到服务器响应后,`get`函数会返回一个`Response`对象。这个对象包含了服务器返回的所有信息,包括状态码、响应头、以及响应体(通常是HTML、JSON或其他格式的数据)。

### 示例代码
```python
import requests

# 发送GET请求
response = requests.get('https://api.example.com/data', params={'page': 1, 'limit': 10})

# 打印响应状态码
print(response.status_code)

# 打印响应内容
print(response.text)
```

在这个示例中,我们使用`requests.get`函数向`https://api.example.com/data`发送了一个GET请求,并且传递了查询参数`page=1`和`limit=10`。然后,我们打印出响应的状态码和响应的内容。

总的来说,`requests.get`函数是一个非常方便的工具,用于发送HTTP GET请求并处理响应。通过这个函数,你可以轻松地与Web服务进行交互,获取或提交数据。

10、函数

 get(url,params=None,**kwargs)

括号中的变量叫函数的参数

  • url=>位置参数(有顺序,按位置依次给数据)

  • params=None =>默认参数(如果你没有传递会给一个默认值)

  • *args => 可变长位置参数

  • **kwargs => 可变长关键字参数

image-20240404225443545

位置参数的使用:

image-20240404230226496

# 定义一个函数,实现摄氏度转华氏度
# 32°F + 摄氏度 × 1.8

def Celsius_To_Fahrenheit(a):
    b=(a*1.8)+32
    print(f"{a}°C 转换成 华氏度 为:{b:.2f}°F")

Celsius_To_Fahrenheit(44.5)

更好的写法:

c84e9a7001f5f3fa6e33a33d8a69aa76

# get(url, params=None, **kwargs)
# 括号中的变量叫函数的参数
# url         => 必选位置参数(有顺序,按位置依次给数据)
#             => 注意按顺序传递参数
# params=None => 默认参数(如果你没有传递会给一个默认值)
# *args       => 可变长位置参数
# **kwargs    => 可变长关键字参数

# 调用:requests.get("test", "http://www.baidu.com")             X  位置参数调用
#      requests.get(params="test", url="http://www.baidu.com")  J  关键字参数调用

# def 函数名(参数列表<0-n>):
#     函数体
#     return value =>返回值
def mysum(a, b):
    return a+b
# a = 1
# b = 2
# 位置参数的调用
print(mysum(1,2))
# 关键字参数的调用
print(mysum(a=1, b=2))
print(mysum(b=2, a=1))
# TypeError: mysum() missing 1 required positional argument: 'b'
# mysum(1)


# 定义一个函数,实现摄氏度转华氏度
# 32°F+ 摄氏度 × 1.8
# 传递一个摄氏温度 -> 返回一个华氏度温度

# 参数名:数据类型 => 告诉调用者,该函数需要是什么类型的!
#               =>类型声明是可写可不写的
# -> 数据类型    => 函数的返回值
# return 接返回值 => 函数如果没有return语句,表示返回None
# 文档注释(document string)和类型注解(type hint)都是可选的

def ctof(celsius:int) -> float:
    """ document string 文档注释 => 直接用作帮助文档
    :param celsius: 传递一个int类型的摄氏温度
    :return:  返回一个float类型的华氏度温度
    """
    result = 32+celsius*1.8
    return result
# pass => 占位符 => 什么也不做 => 保持语法完整

print(ctof(10))

# 定义一个函数,实现摄氏度转华氏度
# 如果没有传温度过来,当作计算 0摄氏度对应的华氏度
# 默认参数
def ctof(celsius:int=0) -> float:
    """ document string 文档注释 => 直接用作帮助文档
    :param celsius: 传递一个int类型的摄氏温度
    :return:  返回一个float类型的华氏度温度
    """
    result = 32+celsius*1.8
    return result
print(ctof())


# 默认参数的推荐写法:先给它一个默认值为None,在函数体中处理默认
def ctof(celsius=None) -> float:
    """ document string 文档注释 => 直接用作帮助文档
    :param celsius: 传递一个int类型的摄氏温度
    :return:  返回一个float类型的华氏度温度
    """
    if celsius is None:
        celsius = 0
    result = 32+celsius*1.8
    return result
import requests
# print(dir(requests))
help(requests.get)


# get(url, params=None, **kwargs)
# 括号中的变量叫函数的参数
# url         => 必选位置参数(有顺序,按位置依次给数据)
#             => 注意按顺序传递参数
# params=None => 默认参数(如果你没有传递会给一个默认值)
# *args       => 可变长位置参数
# **kwargs    => 可变长关键字参数

# 调用:requests.get("test", "http://www.baidu.com")             X  位置参数调用
#      requests.get(params="test", url="http://www.baidu.com")  J  关键字参数调用

# def 函数名(参数列表<0-n>):
#     函数体
#     return value =>返回值
def mysum(a, b):
    return a+b
# a = 1
# b = 2
# 位置参数的调用
print(mysum(1,2))
# 关键字参数的调用
print(mysum(a=1, b=2))
print(mysum(b=2, a=1))
# TypeError: mysum() missing 1 required positional argument: 'b'
# mysum(1)


# 定义一个函数,实现摄氏度转华氏度
# 32°F+ 摄氏度 × 1.8
# 传递一个摄氏温度 -> 返回一个华氏度温度

# 参数名:数据类型 => 告诉调用者,该函数需要是什么类型的!
#               =>类型声明是可写可不写的
# -> 数据类型    => 函数的返回值
# return 接返回值 => 函数如果没有return语句,表示返回None
# 文档注释(document string)和类型注解(type hint)都是可选的

def ctof(celsius:int) -> float:
    """ document string 文档注释 => 直接用作帮助文档
    :param celsius: 传递一个int类型的摄氏温度
    :return:  返回一个float类型的华氏度温度
    """
    result = 32+celsius*1.8
    return result
# pass => 占位符 => 什么也不做 => 保持语法完整

print(ctof(10))

# 定义一个函数,实现摄氏度转华氏度
# 如果没有传温度过来,当作计算 0摄氏度对应的华氏度
# 默认参数
def ctof(celsius:int=0) -> float:
    """ document string 文档注释 => 直接用作帮助文档
    :param celsius: 传递一个int类型的摄氏温度
    :return:  返回一个float类型的华氏度温度
    """
    result = 32+celsius*1.8
    return result
print(ctof())


# 默认参数的推荐写法:先给它一个默认值为None,在函数体中处理默认
def ctof(celsius=None) -> float:
    """ document string 文档注释 => 直接用作帮助文档
    :param celsius: 传递一个int类型的摄氏温度
    :return:  返回一个float类型的华氏度温度
    """
    if celsius is None:
        celsius = 0
    result = 32+celsius*1.8
    return result


# *args    => 可变长位置参数   => 接受多个(位置)参数
# **kwargs => 可变长关键字参数  => 接受多个(关键字)参数

# 实现一个mysum函数,可以接收多个数据,计算这个数据的和
# args => arguments
# kw =>keyword
def mysum2(*args, **kwargs) ->int :
    """
    计算出所有传进来的数据之和
    :param args:
    :param kwargs:
    :return:
    """
    print("args:", args, type(args))
    print("kwargs:", kwargs, type(kwargs))

mysum2(1,2,3,4, a=1, b=2, c=3)
# 注意 : SyntaxError: positional argument follows keyword argument
# 位置参数必须写在关键字参数的前面
mysum2(1, 2, a=1, b=2)
#!/usr/bin/env python
# @FileName :1.python函数.py
# @Time :2024/3/10 14:59
# @Author :wenyao

# 4月底 => 爬虫+数据分析+数据可视化
# requests => dir哪些功能, help函数具体怎么用
# requests.get函数

# get(url, params=None, **kwargs)
"""
# 注意参数类型的顺序
def 函数名(位置参数,默认参数,可变长位置参数,可变长关键字参数) -> 返回值类型:
    pass
    return 返回值
def function(a:int, b:int=0, *args, **kwargs) -> int:
    return a
如果函数没有返回值,相当于return None
"""

def sum(*args, **kwargs)->int:
    # args => 保存调用时传的所有的位置参数
    # kwargs => 保存调用时传的所有的关键字参数(如:a=1)
    print(args)     # tuple
    print(kwargs)   # dict
    s = 0
    for i in args:
        s+=i
    for key in kwargs:
        s+=kwargs[key]
    return s

# 什么情况下需要return => 如果算出来的结果还有其他用途

print(sum(1,2,3,a=4,b=5,c=6))

"""
1. 函数定义参数的类型4类(注意顺序)
2. 函数调用参数类型2类(注意顺序)
3. 注释:文档注释(写的一些帮助信息->help时可以看到),类型注解(给参数和返回值做类型声明) 
        类型注解在高版本中是否有强制类型限制
4. 返回值: return =>如果结果还需要用(一般情况建议返回)
"""

import requests
help(requests.get)

11、requests模块

11.3、玩一下

#获取百度首页信息
import requests

url = "https://www.baidu.com"
response = requests.get(url)
print(response,type(response))
# requests模块功能
# 相当于一个模块浏览器,发送网络请求,获取数据

import requests
# 获取百度首页的数据
url="http://www.baidu.com"
response = requests.get(url)
print(response, type(response))
# status_code => 200 OK
#             => 用代码的方式告诉你,你的请求是否正确
#             =>2XX 成功
#             =>4XX 客户端错误
#             =>5XX 服务端错误
#             => $? => 0 成功,其他错误
# 取出当前响应的状态码
print(response.status_code)
# 获取当前的网页数据
# text => string
print(response.text[:100])
# content  => bytes
print(response.content[:100])
# 获取请求的url
print(response.url)
# 获取响应头信息
print(response.headers)
print(dir(response))
# 获取编码方式   UTF8(全球),GBK(中文)
print(response.encoding)
# 推荐!
print(response.apparent_encoding)

12、玩一玩豆瓣读书

import requests


def download(url:str) -> str:
    """
    这个函数用来获取url的数据,返回网页的string
    :param url: 这应该提供一个网址
    :return: 返回网页的string类型的数据
    """
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    else:
        return None

print(download("http://www.baidu.com"))

def download(url: str) -> str | None:
    """
    这个函数用来获取url的数据,返回网页的string
    :param url: 这应该提供一个网址
    :return: 返回网页的string类型的数据
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/58.0.3029.110 Safari/537.3'
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        return None

print(download("https://book.douban.com/"))

大佬写的:

import requests
import time

# def download(url:str) -> str:
#     """
#     这个函数数用来获取url的数据,返回网页的string
#     :param url: 应该提供一个网址
#     :return: 返回网页的string类型的数据
#     """
#     response = requests.get(url)
#     if response.status_code == 200:
#         # 指定正确的网页编码
#         response.encoding = response.apparent_encoding
#         return response.text
#     else:
#         return ""

# try...except
def download(url:str) -> str:
    """
    这个函数数用来获取url的数据,返回网页的string
    :param url: 应该提供一个网址
    :return: 返回网页的string类型的数据
    """
    # 反爬虫1:添加user-agent
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
    }
    response = requests.get(url, headers=headers)
    # 如果没有获取到网页或者获取到网页了,但状态码不对,那么请报异常
    # 4xx , 5xx 都会抛出异常
    response.raise_for_status()
    # 指定正确的网页编码
    response.encoding = response.apparent_encoding

    # 反爬虫2:增加sleep
    time.sleep(1)
    return response.text

# print(download("http://www.baidu3sdf.com"))
# print(download("https://gitee.com/asdfasdf"))

# 1. 获取数据
data = download("https://book.douban.com/top250")
# 2. 提取数据
# re模块:正则表达式,速度最快,使用难度最高
# lxml(xpath): 速度较快,使用难度一般
# BeautifulSoup: 慢,最简单
PS E:\downloads\san_chuang\pycharm\allProjects\pa_chong> pip install beautifulsoup4
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting beautifulsoup4
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl (147 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 147.9/147.9 kB 1.1 MB/s eta 0:00:00
Collecting soupsieve>1.2 (from beautifulsoup4)
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/4c/f3/038b302fdfbe3be7da016777069f26ceefe11a681055ea1f7817546508e3/soupsieve-2.5-py3-none-any.whl (36 kB)
Installing collected packages: soupsieve, beautifulsoup4
Successfully installed beautifulsoup4-4.12.3 soupsieve-2.5
PS E:\downloads\san_chuang\pycharm\allProjects\pa_chong> 

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

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

相关文章

汽车疲劳测试试验平台技术要求(北重厂家)

汽车疲劳测试试验平台技术要求通常包括以下几个方面&#xff1a; 车辆加载能力&#xff1a;测试平台需要具备足够的承载能力&#xff0c;能够同时测试多种车型和不同重量的车辆。 动力系统&#xff1a;测试平台需要具备稳定可靠的动力系统&#xff0c;能够提供足够的力和速度来…

C++ 指针与数组

指针与数组名都是地址&#xff0c;可以混合使用访问数组元素。 用指针访问数组&#xff0c;计算数组元素之和。 总结 如图所示&#xff0c;获取数组起始地址的方法有两种&#xff0c; 其一为数组名&#xff0c; 其二为通过数组的首元素地址。指针变量p是通过数组名获得指向…

通用开发技能系列:SQL基础学习

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能 SQL基础 进行学习 1.数据库简介 1.1.数据库中的一些名称 DataBase&#xff1a;数据库 程序员只负责怎么维护存取数据&#xff0c;不管数据库是什么 DBA…

Deep Unsupervised Learning using Nonequilibrium Thermodynamics

就直接从算法部分开始了&#xff1a; 2 算法 我们的目标是定义一个前向&#xff08;或者推理&#xff09;扩散过程&#xff0c;这个过程能够转换任意的复杂数据分部到一个简单、tractable、分布&#xff0c;并且学习有限时间扩散过程的反转 从而 定义我们的生成模型分布。我们…

“人性化设计”技术概要

本文是由《埃森哲技术愿景 2024&#xff1a;“人性化设计”技术将通过提高生产力和创造力来重塑行业并重新定义领导者》这个文章来翻译解读的。原文地址如下&#xff0c;大家可以自行下载&#xff1a; 下载地址 其实看到这篇文章的时候&#xff0c;联想到这些年机器人的市场发展…

使用 HTMX 和 Bun 进行全栈 Web 开发

将 HTMX 放在前端&#xff0c;Bun 放在后端&#xff0c;然后将它们与 Elysia 和 MongoDB 连接起来&#xff0c;形成快速便捷的技术栈&#xff0c;使开发 Web 应用程序变得轻而易举。 Bun 和 HTMX 是目前软件领域最有趣的两个事情。 Bun 是一个速度极快的一体化服务器端 JavaSc…

SpringBoot快速入门笔记(3)

文章目录 一、MybatisPlus1、ORM2、添加依赖3、全局配置4、Navicat5、UserController6、CRUD操作7、BaseMapper8、两个注解 二、多表查询1、模拟用户订单2、通过用户查相关订单3、UserMapperNew4、查询订单和所属用户5、OrderMapper6、OrderController 三、条件查询四、分页查询…

爬虫 新闻网站 并存储到CSV文件 以红网为例 V2.0 (控制台版)升级自定义查询关键词、时间段,详细注释

爬虫&#xff1a;红网网站&#xff0c; 获取指定关键词与指定时间范围内的新闻&#xff0c;并存储到CSV文件 V2.0&#xff08;控制台版&#xff09; 爬取目的&#xff1a;为了获取某一地区更全面的在红网已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 对比V1.0升级的…

瑞吉外卖实战学习--14、菜品上传

添加菜品接口 前言效果图1、菜品分类查询接口2、上传图片和下载图片3、创建接收数据的Dto4、创建提交的方法 前言 本项目gitee位置&#xff1a;gitee网址 本篇文章是学习了添加菜品的总结&#xff0c;其中包括菜品分类的接口&#xff0c;图片上传接口&#xff0c;数据整体上传…

【Spring篇】Spring IoC DI

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring系列】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 前言一、IoC二、…

语义分割——自动驾驶鱼眼数据集

一、重要性及意义 环境感知&#xff1a;语义分割技术能够精确识别道路、车辆、行人、障碍物、交通标志和信号等各种交通场景元素。这为自动驾驶系统提供了丰富的环境信息&#xff0c;有助于车辆准确理解周围环境的结构和动态变化。决策规划&#xff1a;基于语义分割的结果&…

AI Kimi:帮助教师做好试卷命题

原文&#xff1a;https://www.toutiao.com/article/7353661304307778083/?log_fromcfd0a50014034_1712243146922 最近&#xff0c;Kimichat工具很火。这款软件不仅仅是一个聊天和阅读工具&#xff0c;还是一个强大的教学辅助工具。作为一位教师&#xff0c;尝试使用Kimichat&…

【React】useState为何返回数组而非对象

useState的正确语法如下 const [count, setCount] useState(0)通过打印可以看到useState返回一个数组&#xff0c;那么为何不返回对象呢 涉及到数组与对象间解构方式的差异 数组的解构&#xff1a;根据索引 const [a,,b] [1,2,3] console.log(a) // 1 console.log(b) // 3…

蓝桥集训之垒骰子

蓝桥集训之垒骰子 核心思想&#xff1a;矩阵乘法 f[i]存顶面数值 构造a矩阵 使得*f[i] f[i-1]a 则f[i] f[1] * an 快速幂优化 #include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;const int N 6,m…

xilinx AXI CAN驱动开发

CAN收发方案有很多&#xff0c;常见的解决方案通过是采用CAN收发芯片&#xff0c;例如最常用的SJA1000,xilinx直接将CAN协议栈用纯逻辑实现&#xff0c;AXI CAN是其中一种&#xff1b; 通过这种方式硬件上只需外接一个PHY芯片即可 上图加了一个电平转换芯片 软件设计方面&…

Unity:2D SpriteShape

1.1 简介 Sprite Shape 可以很灵活的更改sprite的轮廓。比如&#xff1a; 它由两部分组成&#xff1a;Sprite Shape Profile、Sprite Shape Controller&#xff0c;需要导入2D Sprite Shape Package. 1.1.1 Sprite导入要求 Texture Type - ‘Sprite (2D and UI)’.Sprite Mo…

【动手学深度学习】深入浅出深度学习之RMSProp算法的设计与实现

目录 &#x1f31e;一、实验目的 &#x1f31e;二、实验准备 &#x1f31e;三、实验内容 &#x1f33c;1. 认识RMSProp算法 &#x1f33c;2. 在optimizer_compare_naive.py中加入RMSProp &#x1f33c;3. 在optimizer_compare_mnist.py中加入RMSProp &#x1f33c;4. 问…

C#/WPF Inno Setup打包程序

Inno Setup介绍 Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年&#xff0c;现在已经更新到Inno Setup 6了。Inno Setup是一个十分简单实用的打包小工具&#xff0c;可以按照我们自己的意愿设置功能&#xff0c;稳定性也很好。 官方网址&#xff1…

考研人千万不能犯的错误——什么情况下求极限可以直接带入值?

博主最近在复习考研的过程中&#xff0c;做了武忠祥老师的每日一题发现有一个题型错的很集中&#xff0c;就是关于极限数值带入的问题&#xff0c;相信也有不少的宝子容易在这种题型上犯错&#xff0c;今天带大家梳理总结一下常见的计算极限时容易犯的错误 极限的四则运算定义…

harmonyOS安装ohpm

下载 下载地址 HUAWEI DevEco Studio和SDK下载和升级 | 华为开发者联盟 初始化 注意&#xff1a;初始化ohpm前&#xff0c;需先完成node.js环境变量配置 1.解压文件&#xff0c;进入commandline-tools-windows-2.0.0.2\command-line-tools\ohpm\bin 2.执行&#xff1a; init.ba…