美文网首页
Python爬取豆瓣即将上映的电影信息优化版

Python爬取豆瓣即将上映的电影信息优化版

作者: C_Z_Q_ | 来源:发表于2019-10-29 20:32 被阅读0次

    1.python中的生成表达式

    1. 列表推导式
      格式[表达式 for 临时变量 in 可迭代对象[条件语句]]
      用途:快速生成一个列表
    #使用普通 for 循环 创建列表
    #声明一个空列表
    li = []
    #for 临时变量 in 可迭代对象
    #   循环体
    for i in range(10):
        li.append(i)
    print(li)
    #以上我们使用4行代码显示一个0-9的列表
    #li2 = [i for i in range(10)]
    #print(li2)
    print([i for i in range(10)])
    
    #生成随机数
    # from random import randint
    # print(randint(60, 100))
    

    1.1 生成一个列表 ['序号:998','序号:998','序号:998']共10个元素

    #普通for循环
    # from random import randint
    # li = []
    # for _ in range(10):         #下划线是给读代码人看的 ,表示下面将不使用—_
    #     li.append("序号{}".format(randint(100, 999)))
    # print(li)
    
    
    
    #列表推导式
    print(['序号:{}'.format(randint(100,999)) for _ in range(10)])
    

    1.2 使用列表推导式生成一个含有20个元素的随机数列表[]
    删选出 所有奇数

    from random import randint
    li = [randint(30, 100) for _ in range(20)]
    print(li)
    print([x for x in li if x%2 ==1 ])
    

    2.三目运算符

    格式:

     返回值 if 满足条件的表达式 else 不满足时要执行的事情
    
    #如何使用一行的 if else?
    li = ['dada']
    # if len(li)==0:
    #     li = 'aa'
    # else:
    #     li = li[0]
    # print(li)
    s = 'aa' if len(li) == 0 else li[0]
    print(s)
    

    3.爬取豆瓣即将上映的电影信息优化版

    from xpinyin import Pinyin
    import requests
    from lxml import html
    import pandas as pd
    # pip install xpinyin
    def spider(city):
        # splitter 是分隔使用符号,默认是 '-'
        city_pinyin = Pinyin().get_pinyin(city,splitter='')
        url = 'https://movie.douban.com/cinema/later/{}/'.format(city_pinyin)
        print('您要爬取的目标站点是', url)
        print('爬虫进行中,请稍后.........')
        # 请求头信息, 目的是伪装成浏览器进行爬虫
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'}
        # 获取网页的源代码
        response = requests.get(url, headers = headers)
        html_data = response.text
        # print(html_data)
        # 提取我们想要的内容
        selector = html.fromstring(html_data)
        div_list = selector.xpath('//div[@id="showing-soon"]/div')
        print('您好,{}市共查询到{}部即将上映的电影'.format(city, len(div_list)))
        movie_info_list = []
        for div in div_list:
            # 获取电影名字
            movie_name = div.xpath('div[1]/h3/a/text()')
            # if len(movie_name)==0:
            #     movie_name = '没有查询到数据'
            # else:
            #     movie_name = movie_name[0]
            movie_name = '对不起,没有查询到数据' if len(movie_name) == 0 else movie_name[0]
            # print(movie_name)
    
            # 上映日期
            date = div.xpath('div[1]/ul/li[1]/text()')
            date = '对不起,没有查询到数据' if len(date) == 0 else date[0]
            # print(date)
    
            # 类型
            type = div.xpath('div[1]/ul/li[2]/text()')
            type = '对不起,没有查询到数据' if len(type) == 0 else type[0]
            # print(type)
    
            # 国家
            country = div.xpath('div[1]/ul/li[3]/text()')
            country = '对不起,没有查询到数据' if len(country) == 0 else country[0]
            # print(country)
    
            # 想看人数
            want_see = div.xpath('div[1]/ul/li[4]/span/text()')
            want_see = '对不起,没有查询到数据' if len(want_see) == 0 else want_see[0]
            want_see = int(want_see.replace('人想看', ''))
            # print(want_see)
    
            # 图片链接
            img_link = div.xpath('a/img/@src')[0]
    
    
            movie_info_list.append({
                "movie_name": movie_name,
                "date": date,
                "type": type,
                "country": country,
                "want_see": want_see,
                "img_link": img_link
                })
    
    
        movie_info_list.sort(key=lambda x: x['want_see'])
    
        # 遍历
        for movie in movie_info_list:
            print(movie)
            # 图片爬取
            with open('./douban_img/{}.jpg'.format(movie['movie_name']), 'wb') as f:   #把爬取下来的图片存在douban_img中
                f.write(requests.get(movie['img_link']).content)
    
        pd.DataFrame(movie_info_list).to_csv('{} douban_movie_info.csv'.format(city_pinyin))
    
    # 在屏幕中输入请输入您要查看即将上映电影信息的城市
    city = input('输入您要查看即将上映电影信息的城市')
    # 调用函数
    spider(city)
    

    4.绘制线形图

    • 安装matplotlib和numpy
    pip install matplotlib
    pip install numpy
    
    • 导入matplotlib库和numpy库
    from matplotlib import pyplot as plt
    import numpy as np
    
    • 选取100等间距的点(x,y)然后进行绘制曲线图
    #绘制  正弦曲线
    
    #若label中的中文无法正常显示,设置支持中文字体
    #设置支持中文字体
    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    #生成[0,2π]区间100个等距离的点
    x = np.linspace(0, 2*np.pi, num=100)
    print(x)
    y = np.sin(x)
    cosy = np.cos(x)
    
    #绘制
    plt.plot(x, y,
             color ='g', #线的颜色
             linestyle=':',#线的风格   '-'代表实线  '--'代表虚线 ':'代表点划线
            marker ='o',   #标记点的样式 'o'代表实心圆
            markerfacecolor ='r',   #标记点的颜色
            alpha =0.8,   #设置透明度
             label='sin(x)'
             )
    plt.plot(x, cosy, marker='o',linestyle='-',  alpha =0.8,label = 'sin(x)' )
    plt.xlabel('time(s)')
    plt.ylabel('电压(v)')
    plt.title('电压随时间变化曲线')
    plt.legend()  #设置图例
    plt.show()
    

    5.条形图

    • 随机生成6只口红价格,以柱状图显示
    #若label中的中文无法正常显示,设置支持中文字体
    #设置支持中文字体
    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    from random import randint
    x = ['口红{}'.format(i) for i in range(1,7)]
    print(x)
    y =[randint(200, 1000) for _ in range(6)]
    print(y)
    plt.bar(x, y)
    plt.grid()
    plt.xlabel('口红品牌')
    plt.ylabel('口红价格(元)')
    plt.show()
    

    相关文章

      网友评论

          本文标题:Python爬取豆瓣即将上映的电影信息优化版

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