今天是学习python第三天,接着昨天来学习。
对分析的数据进行可视化表示--绘制曲线图
from matplotlib import pyplot as plt # 名字来源于MATLAB
plt.rcParams["font.sans-serif"] = ['SimHei'] #这句和下句是导入字体 按格式写就行
plt.rcParams['axes.unicode_minus'] = False
import numpy as np
#绘制正弦曲线
# [0-2pi]闭区间等间距的100个点
x = np.linspace(0, 2*np.pi, num=100)
print(x)
siny = np.sin(x)
cosy = np.cos(x)
plt.xlabel('时间(s)') #x轴描述
plt.ylabel('电压(V)') #y轴描述
plt.title('时间与电压的关系') #题头
plt.plot(x, siny, label='sin(x)') #具体都有啥参数可以按ctrl+鼠标箭头指向plot
plt.plot(x, cosy, color='g', linestyle='--', marker='+', label='cos(x)') #label标签 marker标识 color 线颜色 linestyle线风格
plt.legend() #描述线分别 代表啥意思
plt.show()
对分析的数据进行可视化表示--绘制饼图
from matplotlib import pyplot as plt # 名字来源于MATLAB
plt.rcParams["font.sans-serif"] = ['SimHei'] #这句和下句是导入字体 按格式写就行
plt.rcParams['axes.unicode_minus'] = False
from random import randint
import string
counts = [randint(3500, 40000)for i in range(5)]
print(counts)
labels =['员工{}'.format(i) for i in string.ascii_uppercase[:5]] #上节讲过哒
print(labels)
explode = [0.1, 0, 0, 0, 0] #将第一个凸显出来 间距是0.1 其余是0
colors=['red', 'yellow', 'blue', 'purple', 'green'] #将每个自定义颜色
plt.pie(counts, explode=explode, labels=labels, shadow=True,
colors=colors, autopct='%1.1f%%') #一些属性,还是可以ctrl+鼠标光标指向看具体参数 具体看图对比 shadow影子 autopct占百分比
plt.axis('equal') #轴位置
plt.legend(loc=2)#描述每个颜色分别 代表啥意思
plt.title('员工工资图')
plt.show()
对分析的数据进行可视化表示--绘制散点图
from matplotlib import pyplot as plt # 名字来源于MATLAB
plt.rcParams["font.sans-serif"] = ['SimHei'] #这句和下句是导入字体 按格式写就行
plt.rcParams['axes.unicode_minus'] = False
import numpy as np
x = np.random.normal(0, 1, 10000)#随机点10000个
y = np.random.normal(0, 1, 10000)
plt.scatter(x, y,alpha=0.1) #alpha透明度
plt.show()
11. 字典解析和集合解析
字典解析
和列表推导式很像
from random import randint
from matplotlib import pyplot as plt
stu_grade = {'student{}'.format(i): randint(30, 100) for i in range(1, 10)} #随机产生10个学生成绩 字典
for k, v in stu_grade.items():
print(k, v) #打印
# 筛选及格学生
res_dict = {k:v for k, v in stu_grade.items() if v > 60}
for k, v in res_dict.items():
print(k, v)
几何解析
set = {randint(50, 100) for i in range(1, 20)} #随机产生50-100区间的20个数
print(set)
# 筛选出能被三整除的
res = {x for x in set if x % 3 == 0}
for x in res:
print(x)
我们第一部分python的基础知识就到这里了,我们下面讲的是专项知识,也会持续更新,希望小伙伴们坚持住哦。
第二部分 python爬虫
1.html
这是一种超文本标记语言,“超文本”就是指页面内可以包含图片、连接,甚至音乐、程序等非文字元素。包括“头”部(head)、和“主体”部分(body),“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。
网页前端用到的技术#前端技术 html + css + javascript
先写一个HTML file ,命名为'index0.html', 代码如下 我们在代码中注释
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我的王者荣耀</title>
</head>
<body>
<h1>欢迎来到王者荣耀</h1>
<!--有序列表ol-->
<ol>
<li>猪八戒</li>
<!-- src="" alt="" 都是 img这个标签的属性 俩箭号之间是内容 -->
<li><a href="https://pvp.qq.com/web201605/herodetail/513.shtml"><img src="waner.jpg" alt="">上官婉儿</a></li>
<li>虞姬</li>
<li>典韦</li>
</ol>
<!-- div可能有很多 给他命个名字id , id是唯一的 -->
<div id="header" style="background-color: aquamarine" >
<!-- ul是无需序列-->
<ul>
<li>曹操</li>
<li>吕布</li>
<li>安琪拉</li>
</ul>
</div>
<!--div + css盒子模型-->
<!--div是无色无味的容器 , class不一定唯一-->
<div class="div-top" >这是div标签</div>
<div id="container">
<p>上官婉儿选择一个点,然后以自己的位置为终点进行书写,落笔的一瞬间对触碰的敌人造成150/180/210/240/270/300(+20%法术加成)点法术伤害,书写过程中将会对触碰敌人造成300/360/420/480/540/600(+40%法术加成)点法术伤害和50%减速持续2秒(每12秒储存一次笔势,最多可储备2次)</p>
<a href="http://www.baidu.com">点击跳转至百度</a>
</div>
</body>
</html>
2.开爬
-
爬取本地网页(上面的)
要将上述html放到工程文件夹下
from lxml import html, etree #导入这俩库
#使用xpath , bs4 ,css选择器,正则表达式 我们选择用xpath
#使用xpath 爬本地html页面
with open('index0.html', 'r', encoding='utf-8') as f: #读取
html_data = f.read()
# print(html_data) #打印
#使用xpath提取
seletor = html.fromstring(html_data)
print(seletor)
# / 代表从根目录出发 text()添加到末尾代表获取标签内容
h1 = seletor.xpath('/html/body/h1/text()')
if len(h1) == 0: #如果不写这个判断h1==0时会报错 防止没爬到东西的不必要报错
h1 = ''
else:
h1[0]
print(h1)
# if else 三元表达式形式 #跟上式一个意思,可进行简化
#series_number = ['a']
#if len(series_number) == 0:
# series_number = ''
#else:
# series_number = series_number[0]
#print(series_number)
series_number = '' if len(series_number) == 0 else series_number[0]
print(series_number)
#获取a标签的内容
# //从任意节点出发
# //标签名1[@属性='属性值']/标签名[@属性='属性值'].../text()
a = seletor.xpath('//div[@id="container"]/a/text()')[0] #写[0]是啥意思,我们爬到的东西是以列表的形式给出,[0]是去掉列表
print(a)
ul_list = seletor.xpath('//ul/li')
print(len(ul_list))
for li in ul_list:
hero = li.xpath('./text()')[0]
print(hero)
#获取上官婉儿 a 标签的href属性
a = seletor.xpath('//ol/li[2]/a/@href') # li可能有多个,li查数时从1开始查数
print(a[0])
a = seletor.xpath('//div[@id="container"]/a/@href')
print(a[0])
3.resquests库
import requests
response = requests.get('https://www.baidu.com')
# 查看编码方式
print(response.encoding)
# 修改编码方式
response.encoding = 'utf-8'
# 获取 str类型的响应
html_data = response.text
# bytes获取 bytes类型的响应
bytes_data = response.content
# 修改content的编码方式
response.content.decode('utf-8')
print(bytes_data)
print(html_data)
# 获取响应状态码 200 正常
print(response.status_code)
# 请求头信息
print(response.headers)
with open('baidu.html', 'w', encoding='utf-8') as f: #写出一个baidu.html的文件
f.write(html_data)
print(response)
有些网站会设置反爬系统,当他检测出在获取它的信息不是本公司的信息时就会不会给你正确响应,进而让你爬不到东西,这时我们可以设置请求头来爬取,就能成功获取响应,这里拿出个例子:
import requests
#没有添加请求头的知乎 返回400
resp = requests.get('http://www.zhihu.com')
print(resp.status_code)
import requests
#有添加请求头的知乎 返回200
#定义请求头 以字典的形式定义
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) #知乎主界面-F12-Network-All-刷新-任意选一个200的-单击左键-Herder-拉到下面有个User-Agent'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'}
resp = requests.get('http://www.zhihu.com/', headers=headers) #
print(resp.status_code)
# User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
再介绍下使用requests库爬取图片
import requests
# 爬个美丽的紫霞吧
img_urls ='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1564031005586&di=f056da9c16d8a15d74335877a9cb04dd&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201702%2F10%2F20170210221154_vCVyn.jpeg'
resp = requests.get(img_urls)
img = resp.content
# w写 b 二进制
with open('zixia.png', 'wb') as f:
f.write(img)
4. 爬取豆瓣网视频top250信息
还是爬豆瓣top250,再将每个电影的宣传图片下载到一个文件夹里,这用到了上面刚说到的技术。重要注释放在了程序里。
import requests
from lxml import etree
import pandas as pd
def parse():
"""豆瓣网top250爬虫"""
# 珍惜运行次数,人家后台也是有检测的 爬虫速度太快人家知道不是人去复制粘贴的 可能封你ip 你就进不去了
# 设请求头,
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"}
# 定义一个字典 把每个电影的数据放到一块
movie_info_list = []
# 循环每一页
# 1、获取url地址
for i in range(0, 226, 25):
url = 'https://movie.douban.com/top250?start={}&filter='.format(i)
# print(url)
# 获取 byte的类型的响应
resp = requests.get(url, headers=headers)
data = resp.content
# 调用etree.HTML获取html对象,然后调用html的xpath语法
html = etree.HTML(data)
movie_list = html.xpath('//div[@id="content"]//ol/li')
# print(len(movie_list))
# 循环爬取每个电影 其格式按道理是相同的 要不然豆瓣程序师得累死
for movie in movie_list:
# 获取电影序号
serial_number = movie.xpath('./div[@class="item"]/div[@class="pic"]/em/text()')
serial_number = '' if len(serial_number) == 0 else serial_number[0]
# print(serial_number)
# 获取电影名字 ./div/div[2]/div[1]/a/span[1]
movie_name = movie.xpath('./div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/span[1]/text()')
movie_name = '' if len(movie_name) == 0 else movie_name[0]
# print(movie_name)
# # 获取电影介绍
introduce = movie.xpath('./div[@class="item"]/div[@class="info"]/div[@class="bd"]/p[1]/text()')
introduce = '' if len(introduce) == 0 else introduce[0]
introduce = introduce.strip()
# print(introduce)
# # 获取电影星级
star = movie.xpath(
'./div[@class="item"]/div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[2]/text()')
star = '' if len(star) == 0 else star[0]
# print(star)
# 获取电影的评价
evalute = movie.xpath(
'./div[@class="item"]/div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[4]/text()')
evalute = '人评价' if len(evalute) == 0 else evalute[0]
evalute = evalute.replace('人评价', '')
# print(evalute)
# 获取电影的描述
describe = movie.xpath('./div[@class="item"]/div[@class="info"]/div[@class="bd"]/p[2]/span/text()')
describe = '' if len(describe) == 0 else describe[0]
# print(describe)
# 详情链接地址
link = movie.xpath('./div[@class="item"]/div[@class="pic"]/a/@href')
link = '' if len(link) == 0 else link[0]
# print(link)
# 图片地址
photo = movie.xpath('./div[@class="item"]/div[@class="pic"]/a/img/@src')
photo = '' if len(photo) == 0 else photo[0]
# print(photo)
# 往字典里添加元素
movie_info_list.append({
'serial_number': serial_number,
'movie_name': movie_name,
'introduce': introduce,
'star': star,
'evalute': evalute,
'describe': describe,
'link': link,
'photo': photo
})
# 遍历字典
for movie_info in movie_info_list:
print(movie_info)
resp = requests.get(movie_info['photo'])
if resp.status_code == 200:
# 执行图片写入操作
# 参考图片命名格式 0000001.jpg
img_name = '000000{}.jpg'.format(movie_info['serial_number'])
with open('./imgs/{}'.format(img_name), 'wb') as f:
f.write(resp.content)
# 存储成csv 调用panda库:
df = pd.DataFrame(movie_info_list)
df.to_csv('douban_top250_info.csv')
parse()
运行一下,你就看到震撼的一幕了,我们想看的信息都在这上面呢
今天分享的就到这里了,明天见。piupiupiu。