py爬虫入门笔记(request.get的使用)

news2024/10/2 22:16:26

文章目录

  • Day1
    • 1. 了解浏览器开发者工具
    • 2. Get请求http://baidu.com
    • 3. Post请求https://fanyi.baidu.com/sug
    • 4. 肯德基小作业
  • Day2
    • 1. 正则表达式
    • 2. 使用re模块
    • 3. 爬取豆瓣电影Top250的第一页
    • 4. 爬取豆瓣电影Top250所有的250部电影信息
  • Day3
    • 1. xpath的使用
    • 2. 认识下载照片+线程池的语法
  • 题外话

我所参考的学习资料,该教程位于B站并可以通过 传送门访问。

没有完全照着视频敲,所以代码和视频的有些不一样,但是大体上的思路是一样的。下面的笔记供自己复习,简单的爬虫格式还是很固定的,爬点简单的东西拷贝过来直接用就行(虽然其实是我记不住接口😭😭😭)

Day1

1. 了解浏览器开发者工具

基本介绍浏览器开发工具的各个部分

image-20240104145639496

源码介绍

image-20240104144011996

其余的相关字段

image-20240104144239197

相对应的字段

image-20240104144132543

来源:https://blog.csdn.net/maidu_xbd/article/details/94062690

爬虫拿到的不是Elements,拿到的是源码

2. Get请求http://baidu.com

装requests包,请求http://baidu.com再获取响应并且写入文件

import requests

url='http://baidu.com'

resp=requests.get(url) #请求百度,记住接受返回值,类型是Response类
print(type(resp)) #检查resp的类型

# print(resp.text) #还可以打印状态码,报头等等

with open("mybaidu.html",mode="w") as f:
    f.write(resp.text) #写入文件

文件内容

<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>

pycharm有个小图标可以直接点开,也可以自己创建一个html文件复制进去。

content=“0;url=http://www.baidu.com/”:规定了刷新的时间间隔和目标 URL。这里的 0 表示立即刷新,url=http://www.baidu.com/ 是重定向的目标 URL。所以会展示出百度的页面

3. Post请求https://fanyi.baidu.com/sug

打开百度翻译,随便输入一个单词,打开Network->XHR->找到你输入的这个单词的请求->找到请求的类型和请求的url->发现携带了数据,在写代码时记得构建数据

注意会有多个请求,你输入一个单词就会造成一个请求,比如你输入apple,会出现 a ap app appl apple这么几个请求

image-20240104153513721

如果收到的response是乱码的,可以检查request的编码,然后修改代码在发送的请求加上对应的编码

image-20240104153738876

import requests

url="https://fanyi.baidu.com/sug"
mydata={
    "kw":"apple"
}

resp=requests.post(url,data=mydata)
resp.encoding="utf-8"
print(resp.status_code)
print(resp.text) #打出的字符含有\u是json的转义字符,使用json方法解析json数据返回的是一个字典
print(resp.json())

output:

200
{"errno":0,"data":[{"k":"Apple","v":"n. \u82f9\u679c\u516c\u53f8\uff0c\u539f\u79f0\u82f9\u679c\u7535\u8111\u516c\u53f8"},{"k":"apple","v":"n. \u82f9\u679c; \u82f9\u679c\u516c\u53f8; \u82f9\u679c\u6811"},{"k":"APPLE","v":"n. \u82f9\u679c"},{"k":"apples","v":"n. \u82f9\u679c\uff0c\u82f9\u679c\u6811( apple\u7684\u540d\u8bcd\u590d\u6570 ); [\u7f8e\u56fd\u53e3\u8bed]\u68d2\u7403; [\u7f8e\u56fd\u82f1\u8bed][\u4fdd\u9f84\u7403]\u574f\u7403; "},{"k":"Apples","v":"[\u5730\u540d] [\u745e\u58eb] \u963f\u666e\u52d2"}],"logid":2500940021}
{'errno': 0, 'data': [{'k': 'Apple', 'v': 'n. 苹果公司,原称苹果电脑公司'}, {'k': 'apple', 'v': 'n. 苹果; 苹果公司; 苹果树'}, {'k': 'APPLE', 'v': 'n. 苹果'}, {'k': 'apples', 'v': 'n. 苹果,苹果树( apple的名词复数 ); [美国口语]棒球; [美国英语][保龄球]坏球; '}, {'k': 'Apples', 'v': '[地名] [瑞士] 阿普勒'}], 'logid': 2500940021}

4. 肯德基小作业

image-20240104171815843

import requests

url="https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"
mydata={
"cname":"",
"pid":"",
"keyword": "徐家汇",
"pageIndex": "1",
"pageSize": "10",
}

resp=requests.post(url,data=mydata)
print(resp.status_code)
print(resp.json())

output:

200
{'Table': [{'rowcount': 3}], 'Table1': [{'rownum': 1, 'storeName': '瑞金', 'addressDetail': '徐家汇路618号B2层商铺号B2-F-13', 'pro': 'Wi-Fi,点唱机,礼品卡,溯源', 'provinceName': '上海市', 'cityName': '上海市'}, {'rownum': 2, 'storeName': '上海肯德基有限公司徐家汇公园K-COFFEE', 'addressDetail': '徐家汇公园内', 'pro': '高铁店,手机点餐', 'provinceName': '上海市', 'cityName': '上海市'}, {'rownum': 3, 'storeName': '上海肯德基有限公司徐家汇公园K-COFFEE', 'addressDetail': '徐家汇公园内', 'pro': '高铁店,手机点餐', 'provinceName': '上海市', 'cityName': '上海市'}]}

进程已结束,退出代码0

Day2

1. 正则表达式

板书,直接搬过来了(正则不用去纠结很难的,一些简单的会写就行,严格的话比如检测用户名之类的都有现成的,比自己写得好还没啥漏洞)

![Y [ ] Y []_Y []YXU A Y P C I 5 B Q Q 67 ‘ M t m b ] ( h t t p s : / / p i c − 1304888003. c o s . a p − g u a n g z h o u . m y q c l o u d . c o m / i m g / Y AYPCI5BQQ67`M_tmb](https://pic-1304888003.cos.ap-guangzhou.myqcloud.com/img/Y AYPCI5BQQ67‘Mtmb](https://pic1304888003.cos.apguangzhou.myqcloud.com/img/Y%5B%5D_Y X U XU XUAYPCI5BQQ67%60M_tmb.png)

惰性匹配与贪婪匹配(惰性匹配有就匹配一次,贪婪匹配就是能匹配多少就匹配多少)

image-20240104174303550

正则匹配网站:https://tool.oschina.net/regex?optionGlobl=global

手册:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html

2. 使用re模块

导入re模块(内置的,不用pip)->练习findall search finditer方法

import re

print("findall")
result=re.findall(r"\d+","这是一个测试字符串,包含123和456。") #找到所有的数字,这里的r是为了避免处理转义字符,不加r字符串里的\默认转义
print(result) #返回的是一个列表
print()

print("search")
result=re.search(r"\d+","这是一个测试字符串,包含123和456。")
print(result) #Match对象
print(result.group()) #使用group分组处理
print()

print("finditer")
result=re.finditer(r"\d+","这是一个测试字符串,包含123和456。")
print(result) #迭代器对象
for item in result:
    # print(item) #每个item都是Match对象,group处理
    print(item.group())
print()

output

findall
['123', '456']

search
<re.Match object; span=(12, 15), match='123'>
123

finditer
<callable_iterator object at 0x0000015AF5B88C70>
123
456


进程已结束,退出代码0

finditer和findall的区别,如果大量数据处理可使用finditer节省内存,即不用一次性处理所有数据,迭代器结合循环就可以获取前一百个匹配啊之类的

使用compile预处理构造正则表达式对象,符合复用原则,也提高了代码的可读性

import re
obj=re.compile(r"\d+") #构建正则对象obj
result=obj.findall("这是一个测试字符串,包含123和456。")
print(result)
result=obj.search("这是一个测试字符串,包含123和456。")
print(result.group())

output

['123', '456']
123

进程已结束,退出代码0

使用group进行分组提取出信息

import re
s="""
<div><a href="baidu.com">我是百度</a></div>
<div><a href="google.com">我是谷歌</a></div>
<div><a href="360.com">我是360</a></div>
"""
obj=re.compile(r'<div><a href="(?P<url>.*?)">(?P<name>.*?)</a></div>') #用.*?惰性匹配,?P<url>是进行分组,组名是url
result=obj.finditer(s)
for item in result:
    # print(item.groupdict()) #返回字典
    url=item.group("url")
    name=item.group("name")
    print(url,name)

output:

baidu.com 我是百度
google.com 我是谷歌
360.com 我是360

进程已结束,退出代码0

3. 爬取豆瓣电影Top250的第一页

我们要获取电影的名字 年份 和平均得分

image-20240106020715561

通过豆瓣电影Top250页面源码可知我们可以直接获得这些信息,所以爬取的基本流程就是获取源码->正则提取出需要的信息->分组打印即可

关键在于正则的编写

其中有一个关于反爬的机制,需要给我们的请求头部加一些特定的信息,比如

“User-Agent”:“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36”,

表示我们的请求不是由自动化程序发出的,如果不加伪装,默认情况下写的py爬虫的请求头部User-Agent的值会是

‘User-Agent’: ‘python-requests/2.28.1’

豆瓣那边发现是自动化程序发出的请求就不会给响应了(状态码也变成了418)

所以我们改一下头部信息再发过去(伪装成一个正常设备发过去的请求)

import re
import requests

url="https://movie.douban.com/top250"
header={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
}
resp=requests.get(url,headers=header)
resp.encoding="utf-8" 
print(resp.status_code) #观察状态码是不是200
# print(resp.text)

obj=re.compile(r'<div class="item">.*?'
               r'<span class="title">(?P<name>.*?)</span>.*?'
               r'<br>(?P<year>.*?)&nbsp.*?'
               r'<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
               ,re.S) #.*里的.默认匹配非换行符之外的所有字符,re.S选项表示换行符也参与匹配。因为请求到的源码里有很多换行符,所以必须加这个选项

result=obj.finditer(resp.text)
for item in result:
    name=item.group('name')
    year=item.group('year')
    year=year.split()[0] #split返回的是列表,处理一下
    score=item.group('score')
    print(name,year,score)

output

200
肖申克的救赎 1994 9.7
霸王别姬 1993 9.6
阿甘正传 1994 9.5
泰坦尼克号 1997 9.5
这个杀手不太冷 1994 9.4
千与千寻 2001 9.4
美丽人生 1997 9.5
星际穿越 2014 9.4
盗梦空间 2010 9.4
辛德勒的名单 1993 9.5
楚门的世界 1998 9.4
忠犬八公的故事 2009 9.4
海上钢琴师 1998 9.3
三傻大闹宝莱坞 2009 9.2
放牛班的春天 2004 9.3
机器人总动员 2008 9.3
疯狂动物城 2016 9.2
无间道 2002 9.3
控方证人 1957 9.6
大话西游之大圣娶亲 1995 9.2
熔炉 2011 9.4
教父 1972 9.3
触不可及 2011 9.3
当幸福来敲门 2006 9.2
寻梦环游记 2017 9.1

进程已结束,退出代码0

数据拿到之后怎么处理就不是爬虫关心的事情了。

4. 爬取豆瓣电影Top250所有的250部电影信息

找到分页的规律构造每一页的url,构造好url后就转换成了爬取每一页的电影信息

找url的规律(点击分页按钮,发现start后面的数字呈规律性递增)

https://movie.douban.com/top250?start=0&filter=

https://movie.douban.com/top250?start=25&filter=

https://movie.douban.com/top250?start=50&filter=

import re
import requests
def GetOnePage(url:str):#传入url爬取这一页的所有电影信息
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    }
    resp = requests.get(url, headers=header)
    # resp=requests.get(url)
    resp.encoding = "utf-8"
    # print(resp.request.headers)
    # print(resp.status_code)
    # print(resp.text)

    obj = re.compile(r'<div class="item">.*?'
                     r'<span class="title">(?P<name>.*?)</span>.*?'
                     r'<br>(?P<year>.*?)&nbsp.*?'
                     r'<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                     , re.S)
    result = obj.finditer(resp.text)
    for item in result:
        name = item.group('name')
        year = item.group('year')
        year = year.split()[0]
        score = item.group('score')
        str=name+" "+year+"  "+score+"\n" #构建表示信息的字符串
        # print(str)
        with open('info.txt',mode='a') as f:
            f.write(str)#创建文件如何写入电影信息


# GetOnePage('https://movie.douban.com/top250') #测试函数
# https://movie.douban.com/top250?start=25&filter=
for i in range(0,10): #循环构造url
    page=i*25
    url=f"https://movie.douban.com/top250?start={page}&filter=" #f-string便于插入值,r-string取消转义,利用f-str构造url
    GetOnePage(url)

output:

写到了文件里面

image-20240110011308355

Day3

1. xpath的使用

语法文档:https://docs.python.org/zh-cn/3/library/xml.etree.elementtree.html?highlight=xpath#elementtree-parsing-xml

熟悉xpath相关的一些语法

import requests
from lxml import etree

url='http://www.baidu.com/' #这里没加请求头,baidu有反爬机制,加了请求头和不加得到的数据是不同的
#myhead={
#    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
#}
resp=requests.get(url)
resp.encoding='utf-8'
# print(resp.text) #打印响应的数据
et=etree.HTML(resp.text)
print(et) #印证确实是Element html对象

result=et.xpath("/html/head/title/text()") #逐层往下找,text()表示标签之间的文本,如<p>123</p>
print(result)
result=et.xpath("/html/head/link/@href") #匹配link标签的href属性
print(result)

print()
keys=et.xpath("//div[@id='u1']/a/text()") #//div表示匹配HTML里所有的div,div[@id='u1']选择特定属性的div
# print(keys)
values=et.xpath("//div[@id='u1']/a/@href")
# print(values)
result=dict(zip(keys,values))
for item in result.items(): #一一对应输出
    print(item)

output:

<Element html at 0x294a32b1000>
['百度一下,你就知道']
['http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css']

('新闻', 'http://news.baidu.com')
('hao123', 'http://www.hao123.com')
('地图', 'http://map.baidu.com')
('视频', 'http://v.baidu.com')
('贴吧', 'http://tieba.baidu.com')
('更多产品', '//www.baidu.com/more/')

进程已结束,退出代码0

2. 认识下载照片+线程池的语法

下载图片

import requests

url='https://images.pexels.com/photos/2950499/pexels-photo-2950499.jpeg' #网上随便找了一张图片
resp=requests.get(url)
print(resp.status_code) #看一下请求是否成功

#写入图片得使用content,返回的是二进制数据,所以得使用wb打开而不是w。不能使用text,text返回的是文本数据
with open('test.jpg',mode='wb') as f: 
    f.write(resp.content)

output:

运行成功后当前目录下多出一张test.jpg的图片

image-20240111221022400

线程池

导包->创建线程池->确定线程池里最大线程的数量,提交任务

记得提交的任务要封装成一个函数

#导包,名字还挺长
from concurrent.futures import ThreadPoolExecutor

def func():
    for i in range(0,10):
        print(f"子线程{i}")

def main():
    with ThreadPoolExecutor(max_workers=10) as executor: #线程池同时最多执行十个线程
        executor.submit(func) #提交任务,func而不是func(),如果是func()会立即执行而不会放在线程池中跑
        for i in range(0, 10): #交替打印
            print(f"主线程{i}")


    # for i in range(0, 10): #线程池的任务完成了才会运行到这
    #     print(f"主线程{i}")

if __name__ == '__main__':
    main()

output:

可以明显看到交替打印的现象

子线程0主线程0
主线程1

主线程2子线程1

子线程2主线程3
主线程4
子线程3

主线程5子线程4

主线程6
主线程7子线程5
子线程6
主线程8
子线程7
主线程9

子线程8
子线程9

进程已结束,退出代码0

我没有做视频里的项目,但是我自己做了别的网站的,实现的效果差不多就是构建图库。

题外话

上面有错误的话敬请大佬斧正。

request.get的使用和加请求头之类的这些知识只是入门的,真正的爬虫和逆向紧密相关,所以会使用request.get不表示会爬虫🤡,要精通爬虫与多个方向都相关,比如加密算法,js逆向等,是一个很大的板块。但是学会上面的东西爬一些简单的不设防的网站没啥问题,比如构建自己的壁纸图库等。其实去年五月份就爬了ttok,按博主分类爬了几千个视频,但是调用别人的API终究不是自己写的,前两天想再运行的时候发现代码文件命名混乱和没写注释使得完全跑不了了,蚌。包括爬一些数据加密过的网站都是有难度的。

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

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

相关文章

【翻译】在Qt Designer中创建主窗口(Main Windows)

原文地址&#xff1a;https://doc.qt.io/qt-6/designer-creating-mainwindows.html Qt Designer 可用于为不同用途创建用户界面&#xff0c;并为每个用户界面提供不同类型的模板。主窗口模板用于创建具有菜单栏、工具栏和停靠窗口部件的应用程序窗口。 通过打开文件菜单并选择…

工程档案数字化的意义

工程档案数字化可以提高档案管理效率、节约资源成本、保护档案安全、提高档案可持续性、提升检索与利用的便捷性&#xff0c;促进信息共享与合作&#xff0c;具有重要的意义和价值。 1. 提高档案管理效率&#xff1a;数字化档案可以通过电子方式进行存储、检索和共享&#xff0…

企业网盘的价值:为什么企业需要它?

企业网盘因其主打的文件管理协作功能&#xff0c;正好符合信息时代高速发展下企业的需要&#xff0c;能够帮助企业集中管理文件数据&#xff0c;提供便捷的文件协作服务&#xff0c;一跃成为近两年企业服务类产品榜单中的一匹黑马。 企业网盘真的这么好用吗&#xff1f;企业真…

ant-desgin的table的上移、下移

文章目录 html部分函数部分 html部分 <a-table :columns"columns" :data-source"dataList" :loading"listLoading" :pagination"false"><template #bodyCell"{ column, record, index }"><template v-if&qu…

class_10:this关键字

this关键字是指向调用对象的指针 #include <iostream> #include <iostream> using namespace std;class Car{ public://成员数据string brand; //品牌int year; //年限//构造函数名与类名相同Car(string brand,int year){cout<<"构造函数中&#…

字面量(java)

字面量类型&#xff1a; 整数类型&#xff1a;不带小数的数字&#xff0c;如666、-88 小数类型&#xff1a;带小数点的数字&#xff0c;如13.14、-5.21 字符串类型&#xff1a;用双引号引起来的内容&#xff0c;如"HelloWorld"&#xff0c;""," &q…

HCIA交换技术

VLAN的作用&#xff08;只记录MAC&#xff09;&#xff1a; 路由器和交换机协同工作&#xff0c;为了解决广播域带来的问题&#xff0c;人们引入了VLAN&#xff08;virtual local area network&#xff09;&#xff0c;即虚拟局域网技术&#xff1a;通过在交换机上部署VLAN&…

【软件测试】学习笔记-精准测试

软件测试行业从最开始的手工测试到自动化测试&#xff0c;从黑盒测试到白盒测试&#xff0c;测试理念和技术都发生了日新月异的变化。现如今&#xff0c;几乎所有的软件公司都有一套强大且复杂的自动化测试用例&#xff0c;用来夜以继日地保证产品的正确性和稳定性。 然而&…

Nginx的access_log 状态码499的问题排查

前提&#xff1a;公司的项目网站&#xff0c;运行环境是lnmp环境下 一、起因 如下图&#xff0c;网站请求超过60s(如&#xff1a;导出半年的报表数据到excel)时&#xff0c;报如下错误&#xff0c;且浏览器上没有返回值 二、发展 查找nginx和php-fpm都没有报错日志。于是先把…

万字讲解新一代分布式任务调度框架Power-job

1、简介 Power-Job 的设计目标是成为企业级的分布式任务调度平台&#xff0c;整个公司统一部署调度中心 power-job-server&#xff0c;旗下所有业务线应用只需要依赖 power-job-worker 即可接入调度中心获取任务调度与分布式计算能力。 Power-job官方网址&#xff1a;http:/…

ELK 分离式日志

目录 一.ELK组件 ElasticSearch&#xff1a; Kiabana&#xff1a; Logstash&#xff1a; 可以添加的其它组件&#xff1a; ELK 的工作原理&#xff1a; 二.部署ELK 节点都设置Java环境: 每台都可以部署 Elasticsearch 软件&#xff1a; 修改elasticsearch主配置文件&…

QT-QML2048小游戏

QT-QML2048小游戏 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Dialogs 1.1 import QtQuick.Window 2.1 import "2048.js" as MyScriptAp…

使用pyechart创建折线图

import json from pyecharts.charts import Line from pyecharts import options# 首先使用文件打开数据 f_us open(Desktop/python/Project/数据可视化/美国.txt,r,encoding"UTF-8") f_rb open(Desktop/python/Project/数据可视化/日本.txt,r,encoding"UTF-8…

基于springboot+vue的蜗牛兼职网的设计与实现系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Pypputeer自动化

Pyppeteer简介 pyppeteer 是 Python 语言的一个库&#xff0c;它是对 Puppeteer 的一个非官方端口&#xff0c;Puppeteer 是一个 Node 库&#xff0c;Puppeteer是Google基于Node.js开发的一个工具&#xff0c;它提供了一种高层次的 API 来通过 DevTools 协议控制 Chrome 或 Ch…

【XTuner 大模型单卡低成本微调实战】学习笔记

参考学习教程【XTuner 大模型单卡低成本微调实战】 理论 Finetune简介 大语言模型 微调模式 增量预训练 指令跟随微调 LoRA和QLoRA Xtuner介绍 实战 自定义微调 用 Medication QA 数据集进行微调 将数据转为 XTuner 的数据格式 目标格式&#xff1a;(.jsonL) 写提示词请C…

清晰光谱空间:全自动可调波长系统的高光谱成像优势

高光谱成像技术 高光谱成像技术是一种捕获和分析宽波长信息的技术&#xff0c;能够对材料和特征进行详细的光谱分析和识别。高光谱成像技术的实现通过高光谱相机&#xff0c;其工作原理是使用多个光学传感器或光学滤波器分离不同波长的光&#xff0c;并捕获每个波段的图像&…

CSS笔记II

CSS第二天笔记 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 三大特性继承性层叠性优先级优先级-叠加计算规则 Emmet写法 背景属性背景图平铺方式位置缩放固定复合属性 显示模式转换显示模式 复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通…

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating ability_main.xml <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"oh…

格密码基础:最短格基与KZ基

目录 一. 介绍 二. 最短向量长度 三. GapSVP问题的困难性 四. 如何解决近似SVP问题 五. 推荐论文 一. 介绍 KZ基的全称叫Korkine-Zolotarev格基&#xff0c;KZ基也被称之为最短的格基。接下来我们介绍什么是KZ基&#xff1f; 给定任意秩为n的格&#xff0c;首先第一步寻…