day01
1、变量
"""
变量
在内存中创建一个空间,专门存储数据
name = zhangsan
命名规范
不能以数字、特殊字符开头,不能以关键字命名
英文单词、数字、下划线的组合
first_name_1 = 'zhangsan'
大驼峰
FirstName = 'zhangsan'
小驼峰
firstName = 'zhangsan'
见名知意
第一次出现变量名就是定义
后续再次出现相同变量名时就是重新赋值
"""
name = '张三'
name = '李四'
print(name)
2、数据类型
"""
number
int <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
print(bool_1)
print(type(bool_1))
"""
字符串
单引号
双引号
三引号
区别
单引号、双引号 存储单行的数据
三引号 存储多行数据
<class 'str'>
序列
下标、索引
"""
name = '暴走萝莉'
name = "孙尚香"
print(name)
print(type(name))
str1 = "好看的皮囊千篇一律,有趣的灵魂万一挑一"
print( str1[0] )
print( str1[-1])
print( len(str1) )
print( str1[0:2])
print( str1[:])
print( str1[::] )
print( str1[::3] )
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])
list_3.append('周六')
print(list_3)
list_3.insert(1,'周天')
print(list_3)
list_4 = [1,2,3,True]
list_3.extend(list_4)
print(list_3)
list_3 = [0, False, '周一'] + list_3
print(list_3)
list_3.remove(False)
list_3.remove(False)
list_3.remove('周一')
print(list_3)
list_3[0] = '周天'
print(list_3)
```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)
4、set集合、字典
"""
set集合
{}
特点
去重
无序
"""
set_1 = set()
print(set_1)
print(type(set_1))
set_3 = { '周一','周二','周三','周四','周五','周五','周一' }
print(set_3)
set_3.remove('周一')
print(set_3)
set_3.add( 123 )
print(set_3)
set_3.update( ['周天','周六'] )
print(set_3)
set_4 = { 3,6,5,8, '周天','周六',4,9,7,2,1,6,8,2 }
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)
print( dict_3['name'] )
print( dict_3[1.123] )
dict_3['class'] = 10
print(dict_3)
dict_3['hobby'] = '玩游戏'
print(dict_3)
del dict_3['hobby']
print(dict_3)
print( dict_3.keys() )
print( dict_3.values() )
print( dict_3.items() )
5、分支结构
"""
分支结构
if 条件表达式:
代码块...
else:
代码块...
条件表达式
返回 要么为true 要么为False
True:正数、负数、不包含0的 其他所有非空的字符串、列表、元组、集合、字典。。
False:0、None、null、其他所有为空的 字符串、列表、元组、集合、字典。。
else 可写可不写
"""
a = 1
if a < 10 :
print('正确')
else:
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
b *= 2
if b*5 < 50:
print('正确')
else:
print('错误')
day02
1、分支结构
"""
分支结构
if 条件表达式:
代码块...
else:
代码块...
条件表达式
返回 要么为true 要么为False
True:正数、负数、不包含0的 其他所有非空的字符串、列表、元组、集合、字典。。
False:0、None、null、其他所有为空的 字符串、列表、元组、集合、字典。。
else 可写可不写
"""
a = 1
if a < 10 :
print('正确')
else:
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
b *= 2
if b*5 < 50:
print('正确')
else:
print('错误')
2、函数
"""
函数
用过哪些函数
print() 控制台输出打印
input() 键盘输入
type() 查看数据类型的
len() 返回长度
什么是函数
有特定功能、完成指定任务的一段代码块
为什么使用函数
可以隐藏代码的实现细节
提高代码的复用性
代码的可读性、可维护性
定义
def 自定义名称(参数1,参数2,参数3.。。。):
函数体
return
参数:
形参:形式上的参数,并没有实际意义,也可以称之为占位符,在定义函数的地方出现
实参:实际的参数,在调用函数的地方出现
传递参数的方法
位置传递:按照位置的先后顺序进行传递参数
关键字传递: 在调用地方,传递变量值,通过变量名称去定义函数地方找寻,
有没有相对应的关键字,如果没有,报错。
如果有这个关键字,那么会把这个变量值赋值给这个关键字
return
返回一个值:默认是什么类型就返回什么类型
返回多个值:默认是元组类型
自定义返回值: 设定返回的 类型
不返回值: 是空类型
"""
def addition( a , b ):
c = a + b
return
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 = 0
userid = ''
def eat(self):
print(self.name, '正在吃饭')
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 = name
self.age = age
self.userid = userid
def 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 = name
self.age = age
self.userid = userid
class studentManage():
def __init__(self):
self.data = set()
def addStudent(self):
name = input('请输入学生姓名:')
age = input('请输入学生年龄:')
userid = input('请输入学生学号:')
stu = Student(name, age, userid)
self.data.add(stu)
print('添加学生{} 成功!'.format(name))
def delStudent(self):
if self.data:
uid = input('请输入需要删除的学生id:')
for stu in self.data:
if stu.userid == uid:
print('学生{}信息删除成功!'.format( stu.name ))
self.data.remove(stu)
return
else:
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('重新输入年龄:')
return
else:
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('退出')
break
sm = studentManage()
sm.run()
day03
1、爬虫
"""
爬虫基础
是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
爬虫的分类
通用网络爬虫
从一些种子url扩充到整个web页面
一般都是搜索引擎: 百度、必应、搜狗、谷歌
聚焦(主题)网络爬虫
有目的性的爬虫,是指选择性地爬取定义好的主题相关内容
增量式网络爬虫
对下载网页采取增量式更新和只爬取新产生的数据,或者说是已经发生变化的网页
深度网络爬虫
对于一些提交表单信息、需要查询参数的网页,采取的爬取方式是深度网络爬虫
爬虫的原理
数据的分类
用户产生的数据:百度指数、微信朋友圈
政府产生的数据:
公司管理的数据:聚合数据
爬虫
数据能干什么
人工智能、机器学习、数据分析
alphago 围棋
李世石、柯洁
卖
robots协议
网站跟爬虫之间的协议,txt格式的文件,告诉对方哪些站点不能访问,哪些是可以访问的。
反爬
ip封禁, 代理ip
验证码
静态
图片验证码
文字验证
动态
苹果验证
文字混淆
douyin
js加密
通过你逆向js
点击验证码
滑动验证码
cookie 身份验证
九宫格图片点选
滑动轨迹
静态数据
在页面中包含的所有数据 html、css、js、img、 data
动态数据
二次加载的数据
chrmoe 进行调试
url
请求头
请求数据
cookie
session
"""
2、requests
"""
requests
网络请求库 urllib
模拟浏览器发送请求
安装requests
pip install -i https://pypi.douban.com/simple requests
"""
import requests
url = "https://www.baidu.com"
douban_url = "https://movie.douban.com/subject/35422807/comments"
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"
}
res = requests.get(douban_url, headers=hd)
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):
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:
mainImg = skin['mainImg']
heroName = skin['name']
if mainImg:
print(mainImg)
img_res = requests.get(mainImg)
save_img(img_res.content, heroName)
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:
heroId = hero['heroId']
print(heroId, '='*100)
get_hero_skins(heroId)
time.sleep(1)
get_hero_ids()
4、json
"""
json数据
特点
跟python中的字典格式是一摸一样
json数据必须要用双引号来表示
轻量级的数据交互格式
{ key:value, key:value }
"""
import json
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)
set_cookie = res.headers['Set-Cookie']
split_res_list = set_cookie.split(';')
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"
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
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:
title = div.find('div', attrs={"class":"title"}).find('a').string
print(title)
positionInfo = div.find('div', attrs={"class":"positionInfo"}).text.strip()
print(positionInfo)
houseInfo = div.find('div', attrs={"class":"houseInfo"}).text
print(houseInfo)
totalprice = div.find('div', attrs={"class":"totalPrice totalPrice2"}).text.strip()
print(totalprice)
unitPrice = div.find('div', attrs={"class":"unitPrice"}).text
print(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
"""
selenium
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样
代码 > 驱动 > 浏览器
chrome
版本
版本 96.0.4664.45(正式版本) (32 位)
chromedriver
网址 https://npm.taobao.org/mirrors/chromedriver/
对应版本 96....
安装selenium
pip install selenium
"""
from selenium import webdriver
import time
driver = webdriver.Chrome(executable_path='C:\chromedriver_win32\chromedriver.exe')
driver.maximize_window()
driver.get('https://www.jd.com/')
time.sleep(3)
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"
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)
html = res.text
soup = BeautifulSoup(html, 'html.parser')
a_list = soup.find('ul', attrs={"class":"f-hide"}).find_all('a')
for a in a_list:
href = a['href']
ids = href[9:]
name = a.text
song_url = 'https://music.163.com/song/media/outer/url?id=' + ids
print(song_url)
song_res = requests.get(song_url)
with open('./音乐/{}.mp3'.format(name), 'wb') as f:
f.write(song_res.content)
print('='*100)
|