学习python的第四天

爬虫

  • 需要导入requests,lxml包
  • 思路:
    1.url:获取站点地址
    2.headers: 获取地址响应表头
    3.用requests.get(url,headers)接收网页后台服务器响应的内容
    4.html.fromstring()提取目标站信息
    5.使用xpath语法获取想要的数据


    学习python的第四天_第1张图片
    获取数据的路径表达式

    比如:.xpath('//div[@id="container"]/a/text()')选取id为container的div中a标签转为文本格式
    6.遍历出想要统计的数据进行排序和绘制成图形展示等操作

实例:从https://movie.douban.com/cinema/later/chongqing/中获取八月份即将上映的电影名称,得出上映时间,类型,想看人数,上映电影国家,并将上映国家,和最想看的电影top用饼状图和柱状图展示出来

import requests
from lxml import html
from matplotlib import pyplot as plt

plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


def spider_movie():
    moviv_list = []
    # 目标站点地址
    url = 'https://movie.douban.com/cinema/later/chongqing/'
    # print(url)

    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)
    html_data = resp.text
    # 将html页面写入本地
    # with open('movie.html', 'w', encoding='utf-8') as f:
    #     f.write(html_data)

    # 提取目标站的信息
    selector = html.fromstring(html_data)
    div_list = selector.xpath('//div[@id="showing-soon"]/div')
    print('您好,共有{}部电影上映'.format(len(div_list)))
    #
    # # 遍历 div_list
    for div in div_list:
        # 电影名
        title = div.xpath('./div/h3/a/text()')[0]
        print(title)
        # 获取ul
        ul_list = div.xpath('./div/ul/li/text()')
        print(ul_list[0])  # 上映日期
        print(ul_list[1])  # 类型
        print(ul_list[2])  # 上映国家
        person = div.xpath('./div/ul/li[@class="dt last"]/span/text()')[0]
        person = int(person.replace('人想看', ''))  # 想看人数

        # person =person.isdigit()
        print(person)
        # 添加每一部电影的信息
        moviv_list.append({
            'name': title,
            'time': ul_list[0],
            'type': ul_list[1],
            'country': ul_list[2],
            'person': person
        })

    # 按照想看人数进行排序
    moviv_list.sort(key=lambda x: x['person'], reverse=True)

    # 遍历moviv_list
    for movie in moviv_list:
        print(movie)

    # 绘制top5最想看的电影的柱状图
    top5_movie = [moviv_list[i] for i in range(5)]
    # 电影的名称
    x = [x['name'] for x in top5_movie]
    print(x)
    # 电影人数
    y = [x['person'] for x in top5_movie]
    print(y)
    # plt.bar(x, y)
    plt.barh(x, y)
    plt.show()

    cout = {}
    # 绘制即将上映电影国家的占比图
    for i in moviv_list:
        # print(i['country'])
        cout[i['country']] = cout.get(i['country'], 0) + 1
    # print(cout)
    print(cout.values())
    print(cout.keys())
    counts = cout.values()
    labels = cout.keys()
    # 距离圆心点距离
    explode = [0.1, 0, 0, 0]
    plt.pie(counts, explode=explode, shadow=True, labels=labels, autopct='%1.1f%%')
    plt.legend(loc=2)
    plt.axis('equal')
    plt.show()


spider_movie()

爬出数据展示:

学习python的第四天_第2张图片
数据字典列表

学习python的第四天_第3张图片
即将上映电影TOP5

学习python的第四天_第4张图片
即将上映电影国家

你可能感兴趣的:(学习python的第四天)