day01

1、变量

"""
变量在内存中创建一个空间,专门存储数据name = zhangsan命名规范不能以数字、特殊字符开头,不能以关键字命名英文单词、数字、下划线的组合first_name_1 = 'zhangsan'大驼峰FirstName = 'zhangsan'小驼峰firstName = 'zhangsan'见名知意第一次出现变量名就是定义后续再次出现相同变量名时就是重新赋值
"""name = '张三'
name = '李四'
print(name)

2、数据类型

"""
numberint     <class 'int'>float   <class 'float'>bool    <class 'bool'>"""num = 100
print(num)
print( type(num) )folat_1 = 100.123
print(folat_1)
print( type(folat_1) )bool_1 = True  # False
print(bool_1)
print(type(bool_1))
"""
字符串单引号双引号三引号区别单引号、双引号 存储单行的数据三引号 存储多行数据<class 'str'>序列下标、索引"""
name = '暴走萝莉'
name = "孙尚香"
# name = """马克菠萝"""
print(name)
print(type(name))str1 = "好看的皮囊千篇一律,有趣的灵魂万一挑一"
# 从左边往右边进行计算 0、1、2、3、4、5。。。。
# 从右边往左边进行计算 -1、-2、-3、-4.。。
# 单个提取字符
# str1[下标数值]
print( str1[0] )
print( str1[-1])
print( len(str1)  )
# 范围(多个)提取
# str1[起始下标 : 结束下标 -1 ]
# 左闭右开的原则
# 0 <= 范围 < 2
print( str1[0:2])
print( str1[:])  #如果不写起始位置或者不写结束位置,默认从0开始,到结尾
print( str1[::] ) #两个冒号 作用同上
# print( str1[17:19])
# print( str1[:2])
# print( str1[10:])
# print( str1[-2:])# 步长 step
# str1[ :: step]
# str1[ 0:3  ]
print( str1[::3] )
# print( str1[10:2])
print( str1[::-2]  )# 提取后面字符 有趣的灵魂万一挑一  并且进行倒叙
print(  str1[10::-1]  )
str2 = str1[10:]
print(str2[::-1])print( str1[10:][::-1]   )

3、列表、元组

"""
列表[]  <class 'list'>一个存储容器可以存储任意的类型增删改查的操作列表也是一个序列"""
list_1 = []
print( list_1)
print( type(list_1))# 根据关键字创建空列表
list_2 = list()
print( list_2)
print( type(list_2))list_3 = ['周一','周二','周三','周四','周五']
# 查找操作,
print( list_3[-1] )
# 范围查找
print( list_3[0:3])  # 列表范围提取,返回的也是一个列表的类型# 添加元素
#1、append( 添加的元素内容  )   #只添加到列表的最后
list_3.append('周六')
print(list_3)
#2、insert(第一参数添加的位置, 第二参数添加的元素)   可在任意位置进行添加
list_3.insert(1,'周天')
print(list_3)
#3、extend(添加多元素内容)  # 同时添加多个元素
list_4 = [1,2,3,True]
list_3.extend(list_4)
print(list_3)
#4、拼接 +        并不是在原来的列表中进行添加,而是组合成了新的元素。
list_3 = [0, False, '周一'] + list_3
print(list_3)#删除
# remove( 你要删除的元素 )   从左到右边第一个匹配到的内容,进行删除
list_3.remove(False)
list_3.remove(False)
list_3.remove('周一')
print(list_3)
#  pop()  移除列表中最后一位
# 如果不需要这个移除的元素,不用变量进行接收
# 用变量进行接受一下
# res = list_3.pop()
# print(res)#
# del list_3[0]
# print(list_3)# del list_3
# print(list_3)  #会报一个没有定义的错误
# print(  abcd )#更改元素   先定位到这个元素,然后再重新赋值
list_3[0] = '周天'
print(list_3)#排序
# list_5 = [5,6,3,9,2,8,1,8,4]
# print(list_5)
# print( list_5[::-1] )
# list_5.sort()  # 这个方法么有返回值  从小到大顺序
# print(  list_5.sort()  )
# print(list_5)
# list_5.reverse() # 反转
# print(list_5)# list_5.sort( reverse=True  )
# print(list_5)``````python
"""
元组()  <class 'tuple'>特点元组的元素是不可以更改的"""
#创建方法一
tuple_1 = ()
print(tuple_1)
print(type(tuple_1))
#方法二
tuple_2 = tuple()#查询方法
# 根据下标索引进行定位
tuple_3 = ('周一','周二','周三','周四','周五')
print(tuple_3)
print( tuple_3[0] )
print( tuple_3[2:])    #返回的是元组类型# 类型的转换
# 元组类型转换成列表
list_1 = list(tuple_3)
list_1.append('周六')
print(list_1)
tuple_3 = tuple(list_1)
print(tuple_3)#拼接
tuple_3 = tuple_3 + ('周天',)
print(tuple_3)# res = ('周天',)  # 当元组 只有一个元素的时候,元素后面必须要加一个英文逗号
# print(res)
# print(type(res))

4、set集合、字典

"""
set集合{}特点去重无序"""
#创建
set_1 = set()
print(set_1)
print(type(set_1))# set_2 = {}   如果以大括号来创建空集合的话,必然是一个字典类型
# print(set_2)
# print(type(set_2))set_3 = { '周一','周二','周三','周四','周五','周五','周一' }
print(set_3)# 查找不行
# print(  set_3[0] )# 更改也不行
# 删除
set_3.remove('周一')
print(set_3)
# set_3.pop()#添加元素
set_3.add( 123  )
print(set_3)
set_3.update( ['周天','周六'] )   # extend
print(set_3)set_4 = { 3,6,5,8, '周天','周六',4,9,7,2,1,6,8,2 }  # 如果set集合里面有数值,会进行排序
print(set_4)
"""
字典常用的特殊容器{ key : value , key:value, key:value }<class 'dict'>key是不可以更改, 唯一的value可以是任意类型,随意更改"""
# 创建
dict_1 = {}
print(dict_1)
print(type(dict_1))
#
dict_2 = dict()
print(dict_2)
print(type(dict_2))dict_3 = {'name': '张三', 'class': 1, 1.123: [1, 2, 3]}
print(dict_3)# 查找
# 根据字典的 key来定位,获取value
print( dict_3['name'] )
print( dict_3[1.123] )
# print( dict_3['hobby'])  # 在查找过程中,没有这个key,会返回一个 keyerror# 更改   先定位到这个位置,然后在重新赋值  , 必须是有这个key,进行赋值操作,是更改
dict_3['class'] = 10
print(dict_3)# 添加     必须没有这个key,进行赋值操作,就是添加
dict_3['hobby'] = '玩游戏'
print(dict_3)# 删除
del dict_3['hobby']
print(dict_3)
# del dict_3
# print(dict_3)#获取所有的key
print( dict_3.keys()  )  #返回的就是之前定义的所有key#获取所有的value
print( dict_3.values() ) # 返回的就是定义的所有值
#获取所有的key 和 value
print( dict_3.items() ) # [ (key,value),(key,value),(key,value) ]

5、分支结构

"""
分支结构if 条件表达式:代码块...else:代码块...条件表达式返回 要么为true  要么为FalseTrue:正数、负数、不包含0的 其他所有非空的字符串、列表、元组、集合、字典。。False:0、None、null、其他所有为空的 字符串、列表、元组、集合、字典。。else 可写可不写"""
a = 1
if a < 10 :print('正确')
else:print('错误')# if -0.01:
#     print('正确')
# else:
#     print('错误')#逻辑运算
# and
# if [0] and {0} and 0 :
#     print('正确')
# or
# if [] or {} or 1 < 2 or 1+1 != 2:
#     print('正确')
# not
# if not [0]:
#     print('打印输出正确')# 多重判断
"""
if 条件表达式:代码块...
elif 条件表达式:代码块。。。
elif 条件表达式:代码块
else:代码块如果第一个条件表达式为True,那么后面的所有判断将不会在执行
如果第一个为False,那么紧跟着判断第二个条件是否为True,
"""
if True:print('第一条件表达式成立')
elif True:print('第二条件表达式成立')
elif True:print('第三条件表达式成立')
else:print('不成立')# 嵌套判断a = 1
b = 5
if a**a < b:a +=1  # 2b *= 2 # 10if b*5 < 50:print('正确')else:print('错误')

day02

1、分支结构

"""
分支结构if 条件表达式:代码块...else:代码块...条件表达式返回 要么为true  要么为FalseTrue:正数、负数、不包含0的 其他所有非空的字符串、列表、元组、集合、字典。。False:0、None、null、其他所有为空的 字符串、列表、元组、集合、字典。。else 可写可不写"""
a = 1
if a < 10 :print('正确')
else:print('错误')# if -0.01:
#     print('正确')
# else:
#     print('错误')#逻辑运算
# and
# if [0] and {0} and 0 :
#     print('正确')
# or
# if [] or {} or 1 < 2 or 1+1 != 2:
#     print('正确')
# not
# if not [0]:
#     print('打印输出正确')# 多重判断
"""
if 条件表达式:代码块...
elif 条件表达式:代码块。。。
elif 条件表达式:代码块
else:代码块如果第一个条件表达式为True,那么后面的所有判断将不会在执行
如果第一个为False,那么紧跟着判断第二个条件是否为True,
"""
if True:print('第一条件表达式成立')
elif True:print('第二条件表达式成立')
elif True:print('第三条件表达式成立')
else:print('不成立')# 嵌套判断a = 1
b = 5
if a**a < b:a +=1  # 2b *= 2 # 10if b*5 < 50:print('正确')else:print('错误')

2、函数

"""
函数用过哪些函数print() 控制台输出打印input() 键盘输入type()  查看数据类型的len()   返回长度什么是函数有特定功能、完成指定任务的一段代码块为什么使用函数可以隐藏代码的实现细节提高代码的复用性代码的可读性、可维护性定义def 自定义名称(参数1,参数2,参数3.。。。):函数体return参数:形参:形式上的参数,并没有实际意义,也可以称之为占位符,在定义函数的地方出现实参:实际的参数,在调用函数的地方出现传递参数的方法位置传递:按照位置的先后顺序进行传递参数关键字传递: 在调用地方,传递变量值,通过变量名称去定义函数地方找寻,有没有相对应的关键字,如果没有,报错。如果有这个关键字,那么会把这个变量值赋值给这个关键字return返回一个值:默认是什么类型就返回什么类型返回多个值:默认是元组类型自定义返回值: 设定返回的 类型不返回值: 是空类型
"""
#定义一个函数
def addition( a , b ):c = a + breturn
#调用函数
res = addition( ['10'], ['20'] )
print(type(res))
print( res )res_2 = addition( b=30, a=50)
print(type(res_2))
print(res_2)

3、类和对象

"""
面向过程面向过程的核心思想就是以 过程为主,流水线式的一套生产模式优点简单明了,方便理解缺点扩展性差应用范围linux、git代码管理工具面向对象面向对象的核心思想就是以 对象为主。想知道对象是什么,先把自己当成上帝,看待一切事务都是对象。优点扩展性强缺点可控性差应用范围应用用户层,抖音、快手 游戏类、对象\实例、实例化
类:类别、物以聚类。相同属性、相同行为的事务的统称为类
对象: 在类中的一个具体事例 称之为对象
实例化: 从类生成到对象的一个过程 称之为实例化定义class 自定义变量名():属性行为方法"""
#创建学生类
class Student():#属性name = ''age = 0userid = ''#行为方法def eat(self):# self: 谁调用方法,谁就是self# zhangsan调用的eat方法, zhangsan就是self,# zhangsan = self# zhangsan.name   zhangsan.age,  zhangsan.userid# self.name   self.age,   self.useridprint(self.name, '正在吃饭')# self.sleep()  ?self.sleep()def sleep(self):print(self.name, '正在休息')
# 创建对象
zhangsan = Student()
# 通过对象访问属性
# 对象名.属性名
zhangsan.name = '张三'
zhangsan.age = 20
zhangsan.userid = '001'
print( zhangsan.name )
#通过对象访问行为
#对象名.方法名(),  如果不加括号的话,只是查看这个方法的地址信息。加上括号才是调用
zhangsan.eat()lisi = Student()
lisi.name = '李四'
lisi.age = 21
lisi.userid = '002'
lisi.eat()

4、初始化方法

"""
初始化方法构造方法__init__运行类的第一个启动方法,就是初始化方法"""
class Student(object):def __init__(self, name, age, userid):print('我是一个初始化方法')# self.name 是创建的对象属性self.name = nameself.age = ageself.userid = useriddef sleep(self):print('正在休息')zhangsan = Student(  '张三', 20, '001' )print( zhangsan.name )

5、学生管理系统

"""
1、欢迎界面1、2、3、...
2、数据保存位置:内存
3、一个是针对学生信息录入保存, 对象另一个是针对这个系统的增删改查
4、添加学生信息键盘输入input添加到对象里(集合)进行保存
5、删除学生信息先判断,集合中有没有学生信息如果有学生信息通过某个属性来定位学生,进行删除没有学生信息提示先录入才可进入删除模块
6、更改学生信息先判断,集合中有没有学生信息有通过某个属性定位学生,进行更改操作没有提示录入才可以进入更改模块
7、查询学生直接遍历显示学生信息
8、退出
"""# 创建学生保存对象功能
class Student:def __init__(self, name , age, userid):self.name = nameself.age = ageself.userid = userid# 创建管理的类
class studentManage():def __init__(self):#创建 保存的集合容器self.data = set()def addStudent(self):#添加学生信息方法name = input('请输入学生姓名:')age = input('请输入学生年龄:')userid = input('请输入学生学号:')# 把输入的内容,保存到学生对象中stu = Student(name, age, userid)#将学生对象保存到set集合里self.data.add(stu)print('添加学生{} 成功!'.format(name))def delStudent(self):#删除学生信息方法if self.data:uid = input('请输入需要删除的学生id:')# { stu1, stu2, stu3, stu4 }for stu in self.data:#循环出来的内容,都是每个对象if stu.userid == uid:#如果学号相等,我们就可以删除这个学生对象print('学生{}信息删除成功!'.format( stu.name ))self.data.remove(stu)# breakreturnelse: # 因为,集合中如果没有查找到的学生,需要进行提示print('当前集合没有找寻到删除的学生')else:print('你需要先录入学生信息之后再进入删除功能!')def updateStudent(self):#更改学生信息if self.data:uid = input('请输入需要更改的学生学号:')for stu in self.data:if stu.userid == uid:#将学生对象属性重新赋值stu.name = input('重新输入姓名:')stu.age = input('重新输入年龄:')returnelse:print('当前集合没有找寻到此学生')else:print('你需要先录入学生信息之后再进行更改的功能!')def showStudent(self):#展示学生信息for stu in self.data:print("{}\t\t\t{}\t\t\t{}".format(stu.name,stu.age,stu.userid))def run(self):#启动方法while True:print('欢迎来到管理系统')print('1、添加学生信息')print('2、删除学生信息')print('3、更改学生信息')print('4、查找学生信息')print('5、退出')num = input('请输入选择的编号:')if num == '1':self.addStudent()elif num == '2':self.delStudent()elif num == '3':self.updateStudent()elif num == '4':self.showStudent()else:print('退出')breaksm = studentManage()
sm.run()

day03

1、爬虫

"""
爬虫基础是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。爬虫的分类通用网络爬虫从一些种子url扩充到整个web页面一般都是搜索引擎: 百度、必应、搜狗、谷歌聚焦(主题)网络爬虫有目的性的爬虫,是指选择性地爬取定义好的主题相关内容增量式网络爬虫对下载网页采取增量式更新和只爬取新产生的数据,或者说是已经发生变化的网页深度网络爬虫对于一些提交表单信息、需要查询参数的网页,采取的爬取方式是深度网络爬虫爬虫的原理数据的分类用户产生的数据:百度指数、微信朋友圈政府产生的数据:公司管理的数据:聚合数据爬虫数据能干什么人工智能、机器学习、数据分析alphago 围棋李世石、柯洁卖robots协议网站跟爬虫之间的协议,txt格式的文件,告诉对方哪些站点不能访问,哪些是可以访问的。反爬ip封禁,  代理ip验证码静态图片验证码文字验证动态苹果验证文字混淆douyinjs加密通过你逆向js点击验证码滑动验证码cookie  身份验证九宫格图片点选滑动轨迹静态数据在页面中包含的所有数据   html、css、js、img、 data
动态数据二次加载的数据chrmoe 进行调试url
请求头
请求数据cookie
session
"""

2、requests

"""
requests网络请求库   urllib模拟浏览器发送请求安装requestspip install -i https://pypi.douban.com/simple requests"""import requests#get方法
#1、先指定url地址
url = "https://www.baidu.com"
douban_url = "https://movie.douban.com/subject/35422807/comments"
#2、指定请求头
hd = {"user-agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36 Edg/96.0.1054.29"
}
#3、请求
res = requests.get(douban_url, headers=hd)
# print(res)
#4、响应
#状态码
# print( res.status_code )
# 头部信息
# print( res.headers )
# 文本  源码
# print( res.text)
# json数据
# print( res.json() )
# 二进制流
print( res.content )

3、英雄联盟所有的英雄皮肤图片案例

"""1、目的 下载所有的英雄皮肤图片
2、分析网页1、找寻所有英雄2、查看单个英雄皮肤内容3、根据英雄皮肤的页面 进行分析接口(皮肤的接口是通过英雄的id进行加载)https://game.gtimg.cn/images/lol/act/img/js/hero/1.js?ts=2729565
"""
import requests
import time# 保存文件的方法
def save_img( data , filename):# data是图片的二进制流with open('./img/{}.jpg'.format(filename), 'wb') as file:file.write( data )print('{}图片下载成功!'.format(filename))# 访问提取单个英雄的皮肤
def get_hero_skins( heroId ):url = "https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js?ts=2729565".format(heroId)hd = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"}res = requests.get(url, headers=hd)data = res.json()skins = data['skins']for skin in skins:# print(skin)mainImg = skin['mainImg']heroName = skin['name']if mainImg:print(mainImg)img_res = requests.get(mainImg)# 保存文件save_img(img_res.content, heroName)#获取所有的英雄id
def get_hero_ids():url = "https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js?ts=2729567"hd = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"}res = requests.get(url, headers=hd)data = res.json()heros = data['hero']for hero in heros:# hero是个字典heroId = hero['heroId']print(heroId,  '='*100)get_hero_skins(heroId)time.sleep(1)# 强制等待1秒
get_hero_ids()# get_hero_skins()

4、json

"""
json数据特点跟python中的字典格式是一摸一样json数据必须要用双引号来表示轻量级的数据交互格式{ key:value, key:value }"""
import json# json_1 = '{"name":"张三", "age":18}'
# print( type(json_1))
# print(json_1)
# # json字符串转化成字典格式
# data = json.loads(json_1)
# print(data)
# print(type(data))# '单引号'的json字符串是否可以转化成字典
# json_2 = "{'name':'张三','age':18}"
# data = json.loads(json_2)
# print(data)# 字典转化成json数据   如不想转义中文, 可使用 ensure_ascii=False
dict_1 = {'name':'张三'}
res = json.dumps(dict_1, ensure_ascii=False)
print(res)
print(type(res))dict_2 = {"name":"张三"}
res_2 = json.dumps(dict_2, ensure_ascii=False)
print(res_2)

day04

1、 requests-post

"""
post方法某些网站需要提交表单信息才会返回数据的请求例如,登录、注册"""
import requests# 请求的地址
url = "https://passport.17k.com/ck/user/login"
# 请求头
hd = {"user-agent":"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36 Edg/96.0.1054.29"
}# 表单的数据
data = {"loginName":"13168837959","password":"a343105980"
}res = requests.post(url, headers=hd,  data=data)
# print(res)
# 响应头
set_cookie = res.headers['Set-Cookie']
split_res_list = set_cookie.split(';')  # 根据set_cookie里的token值,进行提取
cookie = ''
for i in split_res_list:if 'accessToken' in i:cookie = i.split(',')[-1].strip()
print(cookie)# 书架的接口链接
books_url = "https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919"
# 请求头中,添加cookie身份令牌
hd2 = {"user-agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36 Edg/96.0.1054.29","cookie":cookie
}
res_books = requests.get(books_url, headers=hd2)
# 处理编码
res_books.encoding = 'utf-8'
print( res_books.status_code)
books_data = res_books.json()
data_list = books_data['data']
for i in data_list:bookName = i['bookName']print(bookName)

2、链家网案例

"""
链家网的详细信息1、目的:爬取房源信息房源的标题位置户型总价单价/平米2、链接  https://zz.lianjia.com/ershoufang/rs%E5%B0%8F%E5%8C%BA/
3、分析是否静态或动态页面
4、针对性标签定位"""
import time
import csv
import requests
from urllib.parse import quote
from bs4 import BeautifulSoup# url编码
# wd = '小区'
# res = quote(wd)
# print(res)class LianJia():def __init__(self):self.base_url = "https://zz.lianjia.com/ershoufang/pg{}rs{}"self.headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36 Edg/96.0.1054.29"}file = open('链家网.csv', 'w', encoding='utf-8-sig', newline='')self.csv_file = csv.writer(file)self.csv_file.writerow(['房源名','地理位置','户型朝向','总价','单价'])def requests_get(self, url, headers):# 请求return requests.get(url , headers=headers)def parse(self, html):#进行解析提取数据soup = BeautifulSoup(html, 'html.parser')div_list = soup.find_all('div', attrs={"class":"info clear"})for div in div_list:# print(div)# 获取名称标题title = div.find('div', attrs={"class":"title"}).find('a').stringprint(title)# 获取位置positionInfo = div.find('div', attrs={"class":"positionInfo"}).text.strip()print(positionInfo)# 获取房间信息houseInfo = div.find('div', attrs={"class":"houseInfo"}).textprint(houseInfo)# 获取总价totalprice = div.find('div', attrs={"class":"totalPrice totalPrice2"}).text.strip()print(totalprice)# 获取单价unitPrice = div.find('div', attrs={"class":"unitPrice"}).textprint(unitPrice)self.csv_file.writerow([title,positionInfo,houseInfo,totalprice,unitPrice])print('='*200)def run(self):#启动函数for page in range(1,10):url = self.base_url.format( page,  quote('小区'))#请求链接res = self.requests_get(url, self.headers)self.parse(res.text)time.sleep(1)LianJia().run()

day05

1、selenium

"""
seleniumSelenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样代码 > 驱动 > 浏览器chrome版本版本 96.0.4664.45(正式版本) (32 位)chromedriver网址  https://npm.taobao.org/mirrors/chromedriver/对应版本  96....安装seleniumpip install selenium"""
#导入selenium模块
from selenium import webdriver
import time
# 创建driver对象
driver = webdriver.Chrome(executable_path='C:\chromedriver_win32\chromedriver.exe')
# 浏览器最大化
driver.maximize_window()# driver 访问网址
# driver.get('https://www.baidu.com')
driver.get('https://www.jd.com/')# # 1、找寻到输入框
# kw = driver.find_element_by_css_selector('#kw')
# # 2、输入内容
# kw.send_keys('中国知网')
# # 3、找寻到百度一下按钮
# su = driver.find_element_by_css_selector('#su')
# # 4、点击这个按钮
# su.click()time.sleep(3)# 在浏览器中截图
# driver.save_screenshot('百度一下.png')# lg_img = driver.find_element_by_css_selector('#s_lg_img_new')
# lg_img.screenshot('百度log.png')#  {{http://www...}}
# 获取当前页面的源码
# html = driver.page_source
# print(html)
# time.sleep(999)#执行js脚本
for i in range(20):driver.execute_script('window.scrollBy(0,500);')time.sleep(1)

2、网易云音乐案例

"""
网易云音乐下载"""import requests
from bs4 import BeautifulSoup#指定访问链接
url = "https://music.163.com/artist?id=11127"  # 歌手主页的链接,里面有50首歌曲
#请求头
hd = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
res = requests.get(url, headers=hd)
# print(res.text)
html = res.text#创建soup对象
soup = BeautifulSoup(html, 'html.parser')
# span标签得到的内容为空
# span_all = soup.find_all('span', attrs={"class":"txt"})
# for span in span_all:
#     a = span.find('a')
#     print(a)
#     print('='*100)
# ul标签
a_list = soup.find('ul', attrs={"class":"f-hide"}).find_all('a')
for a in a_list:# 提取标签中的属性 href# 第一种方式提取属性href = a['href']# 第二种方式提取属性# href2 = a.attrs['href']# print(href2)ids = href[9:]# ids = href.split('=')[-1]# 歌曲名称name = a.textsong_url = 'https://music.163.com/song/media/outer/url?id=' + idsprint(song_url)#请求这个歌曲链接,进行保存下载song_res = requests.get(song_url)with open('./音乐/{}.mp3'.format(name), 'wb') as f:f.write(song_res.content)print('='*100)

python学习记录(基础知识+案例实现)相关推荐

  1. Python学习(基础知识2)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.python文件基本操作 1.单个文件的读写 2.多个文件的读写 3.文件特定行的读写 二.Python常见的异常 ...

  2. Python学习0——基础知识1

    复习一下:Python基础知识学习 菜鸟教程:Python3 基础语法 | 菜鸟教程 (runoob.com) 一.数据类型 1.Number(数字) (1)数字类型 Python包括4种数字类型:i ...

  3. 和菜鸟一起学linux之bluetooth学习记录基础知识

    蓝牙技术是一项新兴的技术.它的主要目的就是要在全世界范围内建立一个短距离的无线通信标准.它使用 2.4-2.5 GHz的 ISM(Industrion ScientifcMedical ) 频段来传送 ...

  4. Python学习心得——基础知识(六)

    一.lambda表达式 1.定义 针对简单的函数,用lambda表达式来展现更方便. 2.样例 1 #普通函数 2 def f1(a): 3 return a+1 4 print(f1(7)) 5 6 ...

  5. Python学习手册 - 基础知识汇总(精简版)

    1.列表 (列表是动态的) 基本操作: list = ["A","B","C"]#列表检索list[0] #0 - 位置list[-1] # ...

  6. python基础语法及知识总结-Python 学习完基础语法知识后,如何进一步提高?

    ---4.30更新---感谢大家支持,点赞都破两千了.给大家整理出来新的资料,需要的小伙伴来自取: Python练手项目视频如下: Python自学基础知识如下: 以下为原文内容: Python 学习 ...

  7. python基础知识资料-学习Python列表的基础知识汇总

    千里之行,始于足下.要练成一双洞悉一切的眼睛,还是得先把基本功扎扎实实地学好.今天,本喵带大家仔细温习一下Python的列表.温故而知新,不亦说乎. 当然,温习的同时也要发散思考,因为有些看似无关紧要 ...

  8. 关于图计算图学习的基础知识概览:前置知识点学习(PGL)[系列一]

    关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 0.1图计算基本概念 首先看到百度百科定义: 图计算(Graph Processin ...

  9. A.关于图计算图学习的基础知识概览:前置知识点学习(Paddle Graph L)【一】

    图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk.node2vec):图神经网络算法(GCN.GAT.GraphSage),部分进阶 GNN 模型(UniMP标签传播.ERNIESa ...

  10. 聚焦传统网络,学习SDN基础和案例

    聚焦传统网络,学习SDN基础和案例 author:pasca time:2018/12/10 目录 文章目录 聚焦传统网络,学习SDN基础和案例 目录 一.网络基础 1.网络组成三要素 2.网络通信三 ...

最新文章

  1. 初级开发人员的缺点_这是我想放弃初级开发人员时所做的事情
  2. 项目CPU异常高分析
  3. 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符
  4. word文字中带有数学公式的行间距设置
  5. The xxx collides with a package/type
  6. linux 子目录 挂载,linux – NFS4 – 挂载多个子目录
  7. android 单元测试 多线程,多线程之单元测试(Junit)
  8. 职场人际关系该如何拿捏
  9. 异步fifo_同步FIFO设计实现
  10. 2020年全球亿万富豪的财富增加了1.9万亿美元
  11. 任正非:假设未来数据流量管道变粗…
  12. linux tomcat/bin/shutdown.sh 关闭不了
  13. 二项式展开 matlab,二项式造句_造句大全
  14. 汇编——dosbox的debug常用指令
  15. 【转】谷俊丽:基于大数据的深度学习
  16. 计算机毕设凑不够字数,撰写毕业论文字数不够要怎样去增加?
  17. css画扇形的几种实现方式
  18. {“error“:“incorrect region, please use up-z1.qiniup.com“}
  19. 算法 - 递归实现汉诺塔(The Tower of Hanoi)
  20. 二维表 转一维表 mysql_Excel二维表转换成一维表(2种方法)

热门文章

  1. A-LOAM代码结构分析
  2. 韦东山 IMX6ULL和正点原子_「正点原子Linux连载」第四十四章设备树下的LED驱动实验...
  3. c语言自学教材 轮子,七月新增开源项目:你学习的速度跟得上前端造轮子的速度吗?...
  4. R以及Rstudio的安装(Windows)
  5. linux mint 下安装matplotlib
  6. 正则表达式-至少包含一个大小写字母和数字且有位数限制
  7. qt基于MVC架构的设计
  8. 机器学习基础知识总结!
  9. SpringCloud之Sleuth全链路日志跟踪
  10. JavaScript中创建对象的步骤