美文网首页
python学习第三天

python学习第三天

作者: 苦难_69e0 | 来源:发表于2019-07-25 22:48 被阅读0次

可视化展示

  • 绘制曲线图
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()

字典解析和集合解析

  • 字典解析
    和列表推导式很像
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爬虫

html

这是一种超文本标记语言,“超文本”就是指页面内可以包含图片、连接,甚至音乐、程序等非文字元素。包括“头”部(head)、和“主体”部分(body),“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。
网页前端用到的技术#前端技术 html + css + javascript
先写一个HTML file ,命名为'index.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>

开爬

爬取本地网页(上面的)
要将上述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])

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)

爬取豆瓣网视频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()

运行一下,就能找到想要知道的信息了。

使用requests爬取图片

import requests
img_urls = ''
resp = requests.get(img_urls)
img = resp.content
with open('诸葛亮.。png','wb') as f:
    f.write(img)

Json

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
豆瓣电视剧 案例:

import requests
import json
url = 'https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0'
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"}

resp = requests.get(url, headers=headers)

# 获取 json数据
data = resp.content.decode()

# 将Json字符串转化成python类型字典
tv_info_pre = json.loads(data)
# json.dumps()
# print(type(tv_info_pre))
# print(tv_info_pre)

# 获取电视剧信息
# [{},  {},  {}]
tv_info= tv_info_pre['subjects']
tv_info_list = []
for tv in tv_info:
    temp = {}
    #  电视剧名
    temp['title'] = tv['title']
    #  url
    temp['url'] = tv['url']
    # rate
    temp['rate'] = tv['rate']
    tv_info_list.append(temp)


for tv in tv_info_list:
    print(tv)

# 存储成json文件
#  python 转化成 json

f = open('douban.json','w',encoding='utf-8')
# 默认使用ascii编码,需要设置ensure_ascii为False
json.dump(tv_info_list, f, ensure_ascii=False)

相关文章

  • 学习Python日记(三)

    今天是跟着Python大大学习python的第三天,大大给出的例子是示范break的用法。 Python brea...

  • 孤荷凌寒自学python第三天 初识序列

    孤荷凌寒自学python第三天 初识序列 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python的序...

  • 【python】While 和for循环

    1、While循环语句 这是我学习python第三天,由于之前学习过c、java等计算机语言,虽然不算精通,但基本...

  • Python-03

    第三天继续加油! 参考 : 庞雪峰Python教程 Github-Python资源大全 Python中文资源大全 ...

  • Python学习第三天——《A Byte of Python》

    It's the 3rd day,never give up,never!!!尝试用markdown编辑器。每天接...

  • python学习第三天

    今天遇到的主要问题就是因为缩进导致的报错,双引号和单引号的区别及使用,以及各种类型的实参,如何让实参变成可选的,以...

  • 学习Python第三天

    今天原来的输入地址出错,换了个网站输入,结果发现这个网站可以上下线自由切换!但是,退出的时候就回到起始页!原来这些...

  • python学习第三天

    1.匿名函数 结构:lambda x1,x2...xn:表达式 参数:可以是无限多个,但表达式只有一个 2.列表推...

  • Python学习第三天

    可视化 绘制正弦余弦曲线 案例: 输出结果: 饼状图 案例: 输出结果: 散点图 案例: 输出结果: 字典解析 和...

  • python学习第三天

    1、三国人物top10分析 2、lambda表达式 lambda表达式,通常是在需要一个函数,但是又不想费神去命名...

网友评论

      本文标题:python学习第三天

      本文链接:https://www.haomeiwen.com/subject/iwokrctx.html