精华内容
下载资源
问答
  • python爬虫,将天气预报可视化
    千次阅读
    2022-01-04 13:43:16

    🏅 前言

    划水许久,终于在今天,开始了2022年的第一篇文章。

    在想题材之际,打开私信,有许多萌新&小伙伴询问我之前写的一篇《python爬取天气预报数据,并实现数据可视化》中的bug怎么解决,虽然我在之前,就在评论区提供了自己的解决思路,但可能不够清楚,于是写这篇文章,来解决bug,并对程序进行优化。

    • 爬取思路可以看之前那篇文章哟:

    《python爬取天气预报数据,并实现数据可视化》

    ⚔ 结果展示

    • 其中:

    红线代表当天最高气温,蓝线代表最低气温,最高气温点上的标注为当天的天气情况。

    如果使夜晚运行程序,则最高气温和最低气温的点会重合,使由爬取数据产生误差导致的。

    在这里插入图片描述

    ⚔ 程序代码

    详细请看注释

    # -*- coding: UTF-8 -*-
    """
    # @Time: 2022/1/4 11:02
    # @Author: 远方的星
    # @CSDN: https://blog.csdn.net/qq_44921056
    """
    import chardet
    import requests
    from lxml import etree
    from fake_useragent import UserAgent
    import pandas as pd
    from matplotlib import pyplot as plt
    
    
    # 随机产生请求头
    ua = UserAgent(verify_ssl=False, path='D:/Pycharm/fake_useragent.json')
    
    
    # 随机切换请求头
    def random_ua():
        headers = {
            "user-agent": ua.random
        }
        return headers
    
    
    # 解析页面
    def res_text(url):
        res = requests.get(url=url, headers=random_ua())
        res.encoding = chardet.detect(res.content)['encoding']
        response = res.text
        html = etree.HTML(response)
        return html
    
    
    # 获得未来七天及八到十五天的页面链接
    def get_url(url):
        html = res_text(url)
        url_7 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[2]/a/@href')[0]
        url_8_15 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[3]/a/@href')[0]
        # print(url_7)
        # print(url_8_15)
        return url_7, url_8_15
    
    
    # 获取未来七天的天气情况
    def get_data_7(url):
        html = res_text(url)
        list_s = html.xpath('//*[@id="7d"]/ul/li')  # 获取天气数据列表
        Date, Weather, Low, High = [], [], [], []
        for i in range(len(list_s)):
            list_date = list_s[i].xpath('./h1/text()')[0]  # 获取日期,如:4日(明天)
            # print(list_data)
            list_weather = list_s[i].xpath('./p[1]/@title')[0]  # 获取天气情况,如:小雨转雨夹雪
            # print(list_weather)
            tem_low = list_s[i].xpath('./p[2]/i/text()')  # 获取最低气温
            tem_high = list_s[i].xpath('./p[2]/span/text()')  # 获取最高气温
            if tem_high == []:  # 遇到夜晚情况,筛掉当天的最高气温
                tem_high = tem_low  # 无最高气温时,使最高气温等于最低气温
            tem_low = int(tem_low[0].replace('℃', '')) # 将气温数据处理
            tem_high = int(tem_high[0].replace('℃', ''))
            # print(type(tem_high))
            Date.append(list_date), Weather.append(list_weather), Low.append(tem_low), High.append(tem_high)
        excel = pd.DataFrame()  # 定义一个二维列表
        excel['日期'] = Date
        excel['天气'] = Weather
        excel['最低气温'] = Low
        excel['最高气温'] = High
        # print(excel)
        return excel
    
    
    def get_data_8_15(url):
        html = res_text(url)
        list_s = html.xpath('//*[@id="15d"]/ul/li')
        Date, Weather, Low, High = [], [], [], []
        for i in range(len(list_s)):
            # data_s[0]是日期,如:周二(11日),data_s[1]是天气情况,如:阴转晴,data_s[2]是最低温度,如:/-3℃
            data_s = list_s[i].xpath('./span/text()')
            # print(data_s)
            date = modify_str(data_s[0])  # 获取日期情况
            weather = data_s[1]
            low = int(data_s[2].replace('/', '').replace('℃', ''))
            high = int(list_s[i].xpath('./span/em/text()')[0].replace('℃', ''))
            # print(date, weather, low, high)
            Date.append(date), Weather.append(weather), Low.append(low), High.append(high)
        # print(Date, Weather, Low, High)
        excel = pd.DataFrame()  # 定义一个二维列表
        excel['日期'] = Date
        excel['天气'] = Weather
        excel['最低气温'] = Low
        excel['最高气温'] = High
        # print(excel)
        return excel
    
    
    # 将8-15天日期格式改成与未来7天一致
    def modify_str(date):
        date_1 = date.split('(')
        date_2 = date_1[1].replace(')', '')
        date_result = date_2 + '(' + date_1[0] + ')'
        return date_result
    
    
    # 实现数据可视化
    def get_image(date, weather, high, low):
        # 用来正常显示中文标签
        plt.rcParams['font.sans-serif'] = ['SimHei']
        # 用来正常显示负号
        plt.rcParams['axes.unicode_minus'] = False
        # 根据数据绘制图形
        fig = plt.figure(dpi=128, figsize=(10, 6))
        ax = fig.add_subplot(111)
        plt.plot(date, high, c='red', alpha=0.5, marker='*')
        plt.plot(date, low, c='blue', alpha=0.5, marker='o')
        # 给图表中两条折线中间的部分上色
        plt.fill_between(date, high, low, facecolor='blue', alpha=0.2)
        # 设置图表格式
        plt.title('邳州近15天天气预报', fontsize=24)
        plt.xlabel('日期', fontsize=12)
        # 绘制斜的标签,以免重叠
        fig.autofmt_xdate()
        plt.ylabel('气温', fontsize=12)
        # 参数刻度线设置
        plt.tick_params(axis='both', which='major', labelsize=10)
        # 修改刻度
        plt.xticks(date[::1])
        # 对点进行标注,在最高气温点处标注当天的天气情况
        for i in range(15):
            ax.annotate(weather[i], xy=(date[i], high[i]))
        # 显示图片
        plt.show()
    
    
    def main():
        base_url = 'http://www.weather.com.cn/weather1d/101190805.shtml'
        url_7, url_8_15 = get_url(base_url)
        data_1 = get_data_7(url_7)
        data_2 = get_data_8_15(url_8_15)
        data = pd.concat([data_1, data_2], axis=0, ignore_index=True)  # ignore_index=True实现两张表拼接,不保留原索引
        get_image(data['日期'], data['天气'], data['最高气温'], data['最低气温'])
    
    
    if __name__ == '__main__':
        main()
    
    

    ⚔ 期望

    这是以一个城市为例的可视化,下次争取做到根据输入的城市进行天气预报可视化📡

    ⚔ 完善(2022.1.5)

    • ①、新增一个函数:

    用于根据使用者需要,获取相应城市的名称和编号。

    需要注意的是,城市名称在输入时,不要加上“市”,如北京市,输入北京即可;深圳市,输入深圳即可。

    函数中用到的本地文件,可用下面的百度网盘链接下载:

    链接https://pan.baidu.com/s/10T8e6mNcL11jsgdW0DwVQw
    提取码:ol39

    def city_num():
        city = input("请输入您想要查询天气情况的城市:")
        file = pd.read_csv('D:/中国天气城市编号.csv', encoding="utf-8")  # 读取本地文件
        index = file[file['城市'] == '{}'.format(city)].index.tolist()[0]  # 根据城市查找行标签
        num = file.loc[index, '编号']  # 根据行标签和列表签锁定值
        return city, num
    
    • ②、对可视化的细节进行一部分修改:
      在图像中可直观看到气温变化,最高气温和最低气温数值,及每天的天气情况
    • ③、完善后的结果:
      在这里插入图片描述
    • ④、完善后的源码:
    # -*- coding: UTF-8 -*-
    """
    # @Time: 2022/1/4 11:02
    # @Author: 远方的星
    # @CSDN: https://blog.csdn.net/qq_44921056
    """
    import chardet
    import requests
    from lxml import etree
    from fake_useragent import UserAgent
    import pandas as pd
    from matplotlib import pyplot as plt
    
    
    # 随机产生请求头
    ua = UserAgent(verify_ssl=False, path='D:/Pycharm/fake_useragent.json')
    
    
    # 随机切换请求头
    def random_ua():
        headers = {
            "user-agent": ua.random
        }
        return headers
    
    
    def city_num():
        city = input("请输入您想要查询天气情况的城市:")
        file = pd.read_csv('D:/中国天气城市编号.csv', encoding="utf-8")  # 读取本地文件
        index = file[file['城市'] == '{}'.format(city)].index.tolist()[0]  # 根据城市查找行标签
        num = file.loc[index, '编号']  # 根据行标签和列表签锁定值
        return city, num
    
    
    # 解析页面
    def res_text(url):
        res = requests.get(url=url, headers=random_ua())
        res.encoding = chardet.detect(res.content)['encoding']
        response = res.text
        html = etree.HTML(response)
        return html
    
    
    # 获得未来七天及八到十五天的页面链接
    def get_url(url):
        html = res_text(url)
        url_7 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[2]/a/@href')[0]
        url_8_15 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[3]/a/@href')[0]
        # print(url_7)
        # print(url_8_15)
        return url_7, url_8_15
    
    
    # 获取未来七天的天气情况
    def get_data_7(url):
        html = res_text(url)
        list_s = html.xpath('//*[@id="7d"]/ul/li')  # 获取天气数据列表
        Date, Weather, Low, High = [], [], [], []
        for i in range(len(list_s)):
            list_date = list_s[i].xpath('./h1/text()')[0]  # 获取日期,如:4日(明天)
            # print(list_data)
            list_weather = list_s[i].xpath('./p[1]/@title')[0]  # 获取天气情况,如:小雨转雨夹雪
            # print(list_weather)
            tem_low = list_s[i].xpath('./p[2]/i/text()')  # 获取最低气温
            tem_high = list_s[i].xpath('./p[2]/span/text()')  # 获取最高气温
            if tem_high == []:  # 遇到夜晚情况,筛掉当天的最高气温
                tem_high = tem_low  # 无最高气温时,使最高气温等于最低气温
            tem_low = int(tem_low[0].replace('℃', '')) # 将气温数据处理
            tem_high = int(tem_high[0].replace('℃', ''))
            # print(type(tem_high))
            Date.append(list_date), Weather.append(list_weather), Low.append(tem_low), High.append(tem_high)
        excel = pd.DataFrame()  # 定义一个二维列表
        excel['日期'] = Date
        excel['天气'] = Weather
        excel['最低气温'] = Low
        excel['最高气温'] = High
        # print(excel)
        return excel
    
    
    def get_data_8_15(url):
        html = res_text(url)
        list_s = html.xpath('//*[@id="15d"]/ul/li')
        Date, Weather, Low, High = [], [], [], []
        for i in range(len(list_s)):
            # data_s[0]是日期,如:周二(11日),data_s[1]是天气情况,如:阴转晴,data_s[2]是最低温度,如:/-3℃
            data_s = list_s[i].xpath('./span/text()')
            # print(data_s)
            date = modify_str(data_s[0])  # 获取日期情况
            weather = data_s[1]
            low = int(data_s[2].replace('/', '').replace('℃', ''))
            high = int(list_s[i].xpath('./span/em/text()')[0].replace('℃', ''))
            # print(date, weather, low, high)
            Date.append(date), Weather.append(weather), Low.append(low), High.append(high)
        # print(Date, Weather, Low, High)
        excel = pd.DataFrame()  # 定义一个二维列表
        excel['日期'] = Date
        excel['天气'] = Weather
        excel['最低气温'] = Low
        excel['最高气温'] = High
        # print(excel)
        return excel
    
    
    # 将8-15天日期格式改成与未来7天一致
    def modify_str(date):
        date_1 = date.split('(')
        date_2 = date_1[1].replace(')', '')
        date_result = date_2 + '(' + date_1[0] + ')'
        return date_result
    
    
    # 实现数据可视化
    def get_image(city, date, weather, high, low):
        # 用来正常显示中文标签
        plt.rcParams['font.sans-serif'] = ['SimHei']
        # 用来正常显示负号
        plt.rcParams['axes.unicode_minus'] = False
        # 根据数据绘制图形
        fig = plt.figure(dpi=128, figsize=(10, 6))
        ax = fig.add_subplot(111)
        plt.plot(date, high, c='red', alpha=0.5, marker='*')
        plt.plot(date, low, c='blue', alpha=0.5, marker='o')
        # 给图表中两条折线中间的部分上色
        plt.fill_between(date, high, low, facecolor='blue', alpha=0.2)
        # 设置图表格式
        plt.title('{}近15天天气预报'.format(city), fontsize=24)
        plt.xlabel('日期', fontsize=12)
        # 绘制斜的标签,以免重叠
        fig.autofmt_xdate()
        plt.ylabel('气温', fontsize=12)
        # 参数刻度线设置
        plt.tick_params(axis='both', which='major', labelsize=10)
        # 修改刻度
        plt.xticks(date[::1])
        # 对点进行标注,在最高气温点处标注当天的天气情况
        for i in range(15):
            ax.annotate(weather[i], xy=(date[i], low[i]+1))
            ax.annotate(str(high[i])+'℃', xy=(date[i], high[i]+0.2))
            ax.annotate(str(low[i])+'℃', xy=(date[i], low[i]+0.2))
        # 显示图片
        plt.show()
    
    
    def main():
        city, num = city_num()
        base_url = 'http://www.weather.com.cn/weather1d/{}.shtml'.format(num)
        url_7, url_8_15 = get_url(base_url)
        data_1 = get_data_7(url_7)
        data_2 = get_data_8_15(url_8_15)
        data = pd.concat([data_1, data_2], axis=0, ignore_index=True)  # ignore_index=True实现两张表拼接,不保留原索引
        get_image(city, data['日期'], data['天气'], data['最高气温'], data['最低气温'])
    
    
    if __name__ == '__main__':
        main()
    
    

    如果对你有帮助,记得点个赞👍哟,也是对作者最大的鼓励🙇‍♂️。
    如有不足之处可以在评论区👇多多指正,我会在看到的第一时间进行修正

    作者:远方的星
    CSDN:https://blog.csdn.net/qq_44921056
    本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。

    更多相关内容
  • python爬取c罗(也可爬取其他运动员)数据,绘制数据散点图,加上文本和图片信息生成可视化图表
  • 之后,就一直想着拿到数据自己做一个,但是没有坚持做这个事,前几天用Python爬了一下成绩查询网站,顺着下去,把这个需求给做出来。  话不多说,先上图吧: 中国疫情地图   各省详细情况 湖北省各市疫情数据分布...
  • 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计图表,非常的细致,有需要的小伙伴可以参考下
  • 大家好,我是天空之城,今天给大家带来小福利,Python带你一秒爬虫获取疫情数据和绘制数据图表! import requests import json import pandas as pd url='...

    大家好,我是天空之城,今天给大家带来小福利,Python带你一秒爬虫获取疫情数据和绘制数据图表!

    import requests
    import json
    import pandas as pd
    url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&_t=0.5759220376658807'
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'}
    
    resp=requests.get(url,headers=headers)
    resps=resp.json()
    resps=resps["data"]
    dataw=json.loads(resps)
    datas=dataw["areaTree"][0]['children']
       
    datas_list=[]
    for i in datas:
        datas_dict={}
        datas_dict['地区名称']=i['name']
        datas_dict['新增确诊']=i['total']['nowConfirm']
        datas_dict['累计确诊']=i['total']['confirm']
        datas_dict['死亡人数']=i['total']['dead']
        datas_dict['治愈人数']=i['total']['heal']
        datas_dict['死亡率']=i['total']['deadRate']
        datas_dict['治愈率']=i['total']['healRate']
        datas_list.append(datas_dict)
    
    df=pd.DataFrame(datas_list)
    print(df)
    
    

    获得数据截图如下:
    在这里插入图片描述
    绘制饼图如下:

    
    pie=(
           Pie()
          .add(
               '',
              [list(i) for i in zip(df_2['地区名称'].values.tolist(),df_2['新增确诊'].values.tolist())],
              radius=['10%','30%']
           )
            .set_global_opts(
                legend_opts=opts.LegendOpts(orient="vertical",pos_top="66%",pos_left="66%")
           )
           .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        )
    pie.render_notebook()
    

    获得饼图如下:
    在这里插入图片描述
    折线图:

    line = (
            Line()
           .add_xaxis(list(df['地区名称'].values))
           .add_yaxis("治愈率",df['治愈率'].values.tolist())
           .add_yaxis("死亡率", df['死亡率'].values.tolist())
           .set_global_opts(
               title_opts=opts.TitleOpts(title="死亡率与治愈率")
           )
        )
                                                                                
                                                                              
    line.render_notebook ()
    

    图片如下
    在这里插入图片描述
    柱状图:

    bar = (
            Bar()
           .add_xaxis(list(df['地区名称'].values)[:6])
           .add_yaxis("死亡", df['死亡人数'].values.tolist()[:6])
           .add_yaxis("治愈",df['治愈人数'].values.tolist()[:6])
           .set_global_opts(
               title_opts=opts.TitleOpts(title="各地区确诊人数与死亡人数情况"),
               datazoom_opts=[opts.DataZoomOpts()]
            )
        )
    bar. render_notebook()
    

    图片
    在这里插入图片描述

    展开全文
  • Python数据图表可视化

    千人学习 2020-06-05 15:29:07
    数据分析是一门重要的技能,职场中掌握了数据分析技术往往能让人另眼相看,而数据可视化是数据分析的结果展示最有效的手段,本视频是Pandas数据分析课程的后续课程,可以掌握各种图表绘制方法,通过实际案例的讲解...
  • python 爬虫及数据可视化展示

    千次阅读 2022-02-11 10:17:54
    学了有关python爬虫及数据可视化的知识,想着做一些总结,加强自己的学习成果,也能给各位小伙伴一些小小的启发。 1、做任何事情都要明确自己的目的,想要做什么,打算怎么做,做到什么样的程度,自己有一个清晰的...

    python 爬虫及数据可视化展示

    学了有关python爬虫及数据可视化的知识,想着做一些总结,加强自己的学习成果,也能给各位小伙伴一些小小的启发。

    1、做任何事情都要明确自己的目的,想要做什么,打算怎么做,做到什么样的程度,自己有一个清晰的定位,虽然计划永远赶不上变化,但是按计划走,见招拆招或许也是不错的选择。

    2、本项目是爬取豆瓣的250部电影,将电影名,电影链接,评分等信息爬取保存到本地。将相关信息以列表的形式展示在网页上,访问者可通我的网站直接挑转到豆瓣查看电影,将评分制作评分走势图,将电影制作成词云图在网页上展示,共有五个网页,可相互跳转。

    项目流程图:

    在这里插入图片描述

    数据爬取:

    # -*- codeing = utf-8 -*-
    # @Time : 2022/1/11 22:39
    # @Author : lj
    # @File : spider.PY
    # @Software: 4{PRODUCT_NAME}
    import bs4  # 网页解析,获取数据 对网页的数据进行拆分
    import re   #正则表达式,进行文字匹配   对数据进行提炼
    import urllib.request,urllib.error  #指定url 获取网页数据 怕网页
    import xlwt  #进行excel 操作  存再excel中
    import sqlite3 #进行sqllite 数据库操作 存在数据库中
    import time
    # 主函数
    def main():
        # 调用函数
        url = "https://movie.douban.com/top250?start="
        datalist1 = allData(url)
        # savepath = "豆瓣电影top250.xls"
        # savedata(datalist1,savepath)
        dbpath = "move.db"
        savedatasql(datalist1,dbpath)
    #匹配所需内容的正则表达式
    linkpattern = re.compile(r'<a href="(.*?)/">')
    #匹配图片的正则表达式
    imagepattern = re.compile(r'<img .*src=".*"/>',re.S)#re.S 忽略换行符,.表示除了换行符以外的所有字符
    #匹配影名的正则表达式
    namepattern = re.compile(r'<span class="title">(.*)</span>')
    # 影片评分
    gradepattern = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
    # 评价人数
    peoplepattern = re.compile(r'<span>(\d*)人评价</span>')#(\d*) 零个或多个
    #概况
    thinkpattern = re.compile(r'<span class="inq">(.*)</span>')
    #影片的相关内容
    contentpattern = re.compile(r'<p class="">(.*?)</p>',re.S)#忽略换行符
    
    #1、爬取一个网页
    def getData(url1):
        head = {
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0"}
        request = urllib.request.Request(url1,headers=head)
        html = ""
        try:
            response = urllib.request.urlopen(request)
            html = response.read().decode("utf-8")
            # print(html)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                print(e.code)
            if hasattr(e,"reason"):
                print(e.reason)
        return html  #返回给调用的地方
    # 2、爬取所有网页,匹配分析
    def allData(url):
        datalist = []
        for i in range(0, 10):  # 左闭右开 调用十次,每次二十五条信息
            url1 = url + str(i * 25)
            html = getData(url1) #保存获取到的网页源码
            time.sleep(1)
            # 逐页解析
            soup = bs4.BeautifulSoup(html,"html.parser") #返回树型结构
            for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,返回列表,class加下划线
                data = []
                item = str(item)
                #link 获取到影片的超链接
                link = re.findall(linkpattern,item)[0]
                data.append(link)
                # 影片图片
                image = re.findall(imagepattern,item)[0]
                data.append(image)
                # 影片名
                name = re.findall(namepattern,item)
                if(len(name)==2):
                    chinaname = name[0]
                    data.append(chinaname)
                    outername = name[1].replace("/","")#.replace("/","") 列表内置的方法,将/替换为空""
                    data.append(outername)
                else:
                    data.append(name[0])
                    data.append('  ')#外文名空出来
                # 影片评分
                grade = re.findall(gradepattern,item)[0]
                data.append(grade)
                # 影片评价人数
                people = re.findall(peoplepattern, item)[0]
                data.append(people)
                # 影片概况
                think = re.findall(thinkpattern, item)
                if len(think) != 0:
                    think = think[0].replace("。","")
                    data.append(think)
                else:
                    data.append("  ")
                # 影片内容
                content = re.findall(contentpattern, item)[0]
                content = re.sub('<br(\s+)?/>(\s+)?'," ",content)#替换内容中多余的符号和内容
                content = re.sub('/'," ",content)
                data.append(content.strip())#去除列表中的空格
                datalist.append(data)
        return datalist
    #3、保存数据到excel
    # def savedata(datalist1,savepath):
    #     workplace = xlwt.Workbook(encoding="utf-8",style_compression=0)#style_compression=0·压缩样式
    #     worksheet = workplace.add_sheet("豆瓣电影top250",cell_overwrite_ok="true")#cell_overwrite_ok=true 是否可以覆盖
    #     col = ('电影详情链接','电影图片链接','影片中文名','影片外文名','评分','评价人数','概况','影片内容')
    #     for i in range(0,8):
    #         worksheet.write(0,i,col[i])
    #     for i in range(0,250):
    #         print("打印了%d条" %(i+1))
    #         databuffer = datalist1[i]
    #         for j in range(0,8):
    #             worksheet.write(i+1,j,databuffer[j])
    #     workplace.save(savepath) #保存
    #3、保存数据到数据库
    def savedatasql(datalist1,dbpath):#dbpath 数据库的路径位置
        init_db(dbpath)
        conn = sqlite3.connect(dbpath)
        cur = conn.cursor()#获取一个游标,存放sql语句的执行结果
        #cur 获得了游标可存放执行结果的对象
        #将datalist1中的数据依次遍历写入数据库
        for data in datalist1:
            for index in range(len(data)):
    
                if index == 4 or index == 5:
                    continue
                # data[index] = "'" + data[index].replace(u'\xa0','') + "'"
                data[index] = data[index].replace("'", "")
                data[index] = "'"+data[index]+"'"
    
            sql = '''
                    insert into move250(
                    move_link,img_link,move_chinaname,move_foriername,grade,numbers,introduction,content)
                    values (%s)'''%",".join(data)
            #print(sql)
            cur.execute(sql)
            conn.commit()
        cur.close()
        conn.close()
        print("write successful")
    
    #创建数据库
    def init_db(dbpath):
    
        sql = '''
            create table move250
            (
            id integer primary key autoincrement,
            move_link text,
            img_link text,
            move_chinaname varchar,
            move_foriername varchar,
            grade numeric,
            numbers numeric,
            introduction text,
            content text
            )
        '''
        c = sqlite3.connect(dbpath)
        buffer = c.cursor()  # 获取游标
        buffer.execute(sql)  # 内置的方法执行sql语句
        c.commit()   #         数据提交,写入数据库
        c.close()   #          数据库关闭
        print("database create successful")
    if __name__ == "__main__":
        #调用函数
        main()
        print("爬取完毕!")
    
    
    

    数据库数据

    在这里插入图片描述

    excel数据

    在这里插入图片描述

    可视化制作

    在这里插入图片描述

    路由分配,网页渲染

    import sqlite3
    
    from flask import Flask,render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def first():  # put application's code here
        return render_template("index-1.html")
    # 每一个函数对应一个路由解析
    @app.route('/index')
    def first1():
        return render_template('index-1.html')
    
    @app.route('/movie')
    def mv():
        datalist =  []
        con = sqlite3.Connection('move.db')
        cursor = con.cursor()
        sql = "select * from move250"
        data = cursor.execute(sql)
        for items in data:
            datalist.append(items)
        cursor.close()
        con.close()
    
        return render_template('about.html',mmm = datalist)
    
    @app.route('/score')
    def sc():
        x = []
        y = []
        con = sqlite3.Connection('move.db')
        cursor = con.cursor()
        sql = "select grade,count(grade) from move250 group by grade"
        data1 = cursor.execute(sql)
        for ite in data1:
           x.append(ite[0])
           y.append(ite[1])
        cursor.close()
        con.close()
        return render_template('services.html',score = x,number = y)
    
    @app.route('/word')
    def wd():
        return render_template('projects-details.html')
    
    @app.route('/team')
    def te():
        return render_template('team.html')
    
    if __name__ == '__main__':
        app.run()
    

    网页源码,由于网页源码过多,只放一页

    网页效果

    在这里插入图片描述

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <style>
            #container{
                border: 2px solid red;
                height: 1000px;
                width: 1200px;
                top: 50px;
                left: 100px;
            }
        </style>
        
        <!-- ========== Meta Tags ========== -->
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="description" content="Buskey - Corporate Business Template">
    
        <!-- ========== Page Title ========== -->
        <title>Buskey - Corporate Business Template</title>
    
        <!-- ========== Start Stylesheet ========== -->
        <link href="../static/css/plugins.min.css" rel="stylesheet">
        <link href="../static/css/flaticon-business-set.css" rel="stylesheet">
        <link href="../static/css/style.css" rel="stylesheet">
        <link href="../static/css/responsive.css" rel="stylesheet">
        <!-- ========== End Stylesheet ========== -->
    
        <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
        <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
        <!--[if lt IE 9]>
    
    
     <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
        <![endif]-->
    
        <!-- ========== Google Fonts ========== -->
        <link href="../static/css/css.css" rel="stylesheet">
        <link href="../static/css/css1.css" rel="stylesheet">
    
    </head>
    
    <body>
    
        <!-- Preloader Start -->
        <div class="se-pre-con"></div>
        <!-- Preloader Ends -->
    
        <!-- Start Header Top 
        ============================================= -->
        <div class="top-bar-area bg-theme text-light">
            <div class="container">
                <div class="row">
                    <div class="col-md-9">
                        <div class="info box">
                            <ul>
                                <li>
                                    <div class="icon">
                                        <i class="fas fa-map-marker-alt"></i>
                                    </div>
                                    <div class="info">
                                        <p>
                                            china
                                        </p>
                                    </div>
                                </li>
                                <li>
                                    <div class="icon">
                                        <i class="fas fa-envelope-open"></i>
                                    </div>
                                    <div class="info">
                                        <p>
                                            1751108164@qq.com
                                        </p>
                                    </div>
                                </li>
                                <li>
                                    <div class="icon">
                                        <i class="fas fa-mobile-alt"></i>
                                    </div>
                                    <div class="info">
                                        <p>
                                            +123 456 7890
                                        </p>
                                    </div>
                                </li>
                            </ul>
                        </div>
                    </div>
                    <div class="topbar-social col-md-3">
    
                    </div>
                </div>
            </div>
        </div>
        <!-- End Header Top -->
    
        <!-- Header 
        ============================================= -->
        <header>
    
            <!-- Start Navigation -->
            <nav class="navbar navbar-default navbar-sticky bootsnav">
    
                <div class="container">
    
                    <!-- Start Header Navigation -->
                    <div class="navbar-header">
                        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-menu">
                            <i class="fa fa-bars"></i>
                        </button>
                        <a class="navbar-brand" href="index.html">
                            <img src="../static/picture/logo-light.png" class="logo logo-display" alt="Logo">
                        </a>
                    </div>
                    <!-- End Header Navigation -->
    
                    <!-- Collect the nav links, forms, and other content for toggling -->
                    <div class="collapse navbar-collapse" id="navbar-menu">
                        <ul class="nav navbar-nav navbar-right" data-in="#" data-out="#">
                            <li class="dropdown">
                                <a href="index-1.html" class="dropdown-toggle active" data-toggle="dropdown">首页</a>
    
                            </li>
                            <li>
                                <a href="about.html">电影列表</a>
                            </li>
                            <li>
                                <a href="">评分</a>
                            </li>
                            <li class="dropdown">
                                <a href="projects-details.html" class="dropdown-toggle" data-toggle="dropdown">词云</a>
    
                            </li>
                            <li class="dropdown">
                                <a href="team.html" class="dropdown-toggle" data-toggle="dropdown">团队</a>
    
                            </li>
                        </ul>
                    </div><!-- /.navbar-collapse -->
                </div>
    
            </nav>
            <!-- End Navigation -->
    
        </header>
        <!-- End Header -->
    
        <!-- Start Breadcrumb
        ============================================= -->
        <div class="breadcrumb-area shadow dark bg-fixed text-center padding-xl text-light" style="background-image: url(../static/image/21.jpg);">
            <div class="container">
                <div class="row">
                    <div class="col-md-6 col-sm-6 text-left">
                        <h1>影线评分</h1>
                    </div>
                    <div class="col-md-6 col-sm-6 text-right">
    
                    </div>
                </div>
            </div>
        </div>
        <!-- End Breadcrumb -->
    
        <!-- Start Fun Factor -->
    
        <!-- Start Fun Factor -->
    <div class="fun-factor-area default-padding text-center bg-fixed shadow theme-hard parallax parralax-shadow" data-parallax="scroll" style="background-image: url(../static/image/12.jpg);">
            <div class="container">
                <div class="row">
                    <div class="col-md-12">
                        <a href="about.html">
                        <div class="col-md-3 col-sm-6 item">
                            <div class="fun-fact">
                                <i class="flaticon-world-map"></i>
                                <div class="timer" data-to="250" data-speed="5000"></div>
                                <span class="medium">经典电影</span>
                            </div>
                        </div>
                            </a>
                        <a href="services.html">
                        <div class="col-md-3 col-sm-6 item">
                            <div class="fun-fact">
                                <i class="flaticon-gears"></i>
                                <div class="timer" data-to="1" data-speed="5000"></div>
                                <span class="medium">评分统计</span>
                            </div>
                        </div>
                            </a>
                        <a href="projects-details.html">
                        <div class="col-md-3 col-sm-6 item">
                            <div class="fun-fact">
                                <i class="flaticon-id-card"></i>
                                <div class="timer" data-to="5693" data-speed="5000"></div>
                                <span class="medium">高频词汇</span>
                            </div>
                        </div>
                            </a>
                        <a href="team.html ">
                        <div class="col-md-3 col-sm-6 item">
                            <div class="fun-fact">
                                <i class="flaticon-id"></i>
                                <div class="timer" data-to="5" data-speed="5000"></div>
                                <span class="medium">专业团队</span>
                            </div>
                        </div>
                            </a>
                    </div>
                </div>
            </div>
        </div>
        <!-- End Fun Factor -->
        <!-- Start Services
        ============================================= -->
        <div class="carousel-services-area bg-gray">
            <div class="container-box oh">
                <div class="carousel-service-items owl-carousel owl-theme">
                    <div id="container" ></div>
                </div>
            </div>
        </div>
        <!-- End Services -->
    
        <!-- jQuery Frameworks
        ============================================= -->
    
         <!-- echarts 图表
        ============================================= -->
        <script src="../static/js/plugins.min.js"></script>
        <script src="../static/js/main.js"></script>
            <script type="text/javascript" src="echarts.min.js"></script>
            <!-- Uncomment this line if you want to dataTool extension
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/extension/dataTool.min.js"></script>
            -->
            <!-- Uncomment this line if you want to use gl extension
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js"></script>
            -->
            <!-- Uncomment this line if you want to echarts-stat extension
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js"></script>
            -->
            <!-- Uncomment this line if you want to use map
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/map/js/china.js"></script>
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/map/js/world.js"></script>
            -->
            <!-- Uncomment these two lines if you want to use bmap extension
            <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=<Your Key Here>"></script>
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@{{version}}/dist/extension/bmap.min.js"></script>
            -->
    
            <script type="text/javascript">
    var dom = document.getElementById("container");
    var myChart = echarts.init(dom);
    var app = {};
    
    var option;
    
    option = {
      xAxis: {
        type: 'category',
        data: [8.3,8.4,8.5,8.6,8.7,8.8,8.9,9,9.1,9.2,9.3,9.4,9.5,9.6,9.7]
      },
      yAxis: {
        type: 'value'
      },
      series: [
        {
          data: [1,3,9,23,40,40,39,15,28,17,20,7,4,3,1,],
          type: 'bar',
          showBackground: true,
          backgroundStyle: {
            color: 'rgba(180, 180, 180, 0.2)'
          }
        }
      ]
    };
    
    option && myChart.setOption(option);
            </script>
    
    </body>
    </html>
    

    网页的免费模板很多,可以挑选自己喜欢的进行修改,并插入图表等。

    词云图片制作,本项目采用电影的简介制作

    # -*- codeing = utf-8 -*-
    # @Time : 2022/2/2 12:53
    # @Author : lj
    # @File : testcloud.PY
    # @Software: 4{PRODUCT_NAME}
    import jieba
    from matplotlib import pyplot as plt
    from wordcloud import WordCloud
    from PIL import Image
    import numpy as np
    import sqlite3
    # 主要的流程,1.jieba提取文字,2.生成词云
    #准备好数据
    con = sqlite3.connect('move.db')
    cur = con.cursor()
    sql = 'select introduction from move250'
    data = cur.execute(sql)
    text = ""
    for item in data:
        text = text + item[0]
    # print(text)
    cur.close()
    con.close()
    #文本分词分句
    cut = jieba.cut(text)
    r = ' '.join(cut)
    
    print(len(r))
    
    # 处理图片的
    img = Image.open(r'.\templates\TEST\img\img/ll.jpg')
    img_arrays = np.array(img)  #将图片转换为数组
    
    
    #词云库封装一个对象
    wc =WordCloud(
        background_color='white',  #输出图片的颜色
         mask=img_arrays,    #导入处理好的图片
        font_path = 'STXINWEI.TTF' #字体的文件
    )
    #词云对象处理已经分好的词
    wc.generate(r)
    
    
    #绘制图片,plt matplotlib的库别名
    fig = plt.figure(1)  #matplotlib库figure方法可绘图
    plt.imshow(wc)   #按照wc的规则显示图片
    plt.axis('off')  #不显示x轴
    
    # plt.show() #生成的词云图片
    
    #输出词云图片到文件中,设置清晰度
    plt.savefig(r'.\templates\TEST\img\img/wordcloud2.jpg',dpi=800)
    

    词云图展示:

    在这里插入图片描述

    将制作好的图片放在网页的合适网页展示即可


    在这里插入图片描述

    至此此项完成

    问题:1、爬取之后在数据库中的数据无法在网页上显示。

    2、先查看网页后在网页中跳转没有问题,但是通过端口路径访问页面之后跳转到其他网页就无法跳转。欢迎大佬指正。

    展开全文
  • 代码:天气数据爬虫代码,图表绘制代码 代码地址:https://github.com/goodloving/pyecharts.git(py文件) 一、公共属性 1、标题栏的属性:一般在实例化(初始化)类型时给与,如bar = Bar(“大标题”,“副标题”...
  • 前言 嗨喽!大家好呀,这里是魔王~ 雪球,聪明的投资者都在这里 - 4300万投资者都在用的投资社区, 沪深港美全球市场实时行情,...Python 3.8 解释器 Pycharm 2021.2 版本 代码实现步骤 发送请求 访问网站 获取数据 解

    前言

    嗨喽!大家好呀,这里是魔王~

    雪球,聪明的投资者都在这里 - 4300万投资者都在用的投资社区,

    沪深港美全球市场实时行情,股票基金债券免费资讯,与投资高手实战交流。

    模块使用

    • requests >>> pip install requests (数据请求 第三方模块)
    • re # 正则表达式 去匹配提取数据
    • json
    • pandas
    • pyecharts

    开发环境

    • Python 3.8 解释器
    • Pycharm 2021.2 版本

    代码实现步骤

    1. 发送请求 访问网站
    2. 获取数据
    3. 解析数据(提取数据)
    4. 保存数据
    5. 做柱状图 简单的可视化

    代码

    # 1. 发送请求 访问网站
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
    }
    
    url = 'https://xueqiu.com/service/v5/stock/screener/quote/list?page=1&size=30&order=desc&order_by=amount&exchange=CN&market=CN&type=sha&_=1641730868838'
    
    response = requests.get(url=url, headers=headers)
    
    # 2. 获取数据
    json_data = response.json() 
    
    # 3. 数据解析(筛选数据)
    data_list = json_data['data']['list']
    for data in data_list:
        data1 = data['symbol']
        data2 = data['name']
        data3 = data['current']
        data4 = data['chg']
        data5 = data['percent']
        data6 = data['current_year_percent']
        data7 = data['volume']
        data8 = data['amount']
        data9 = data['turnover_rate']
        data10 = data['pe_ttm']
        data11 = data['dividend_yield']
        data12 = data['market_capital']
        print(data1, data2, data3, data4, data5, data6, data7, data8, data9, data10, data11, data12)
        data_dict = {
            '股票代码': data1,
            '股票名称': data2,
            '当前价': data3,
            '涨跌额': data4,
            '涨跌幅': data5,
            '年初至今': data6,
            '成交量': data7,
            '成交额': data8,
            '换手率': data9,
            '市盈率(TTM)': data10,
            '股息率': data11,
            '市值': data12,
        }
        csv_write.writerow(data_dict)
    
    4. 保存地址
    file = open('data2.csv', mode='a', encoding='utf-8', newline='')
    csv_write = csv.DictWriter(file, fieldnames=['股票代码','股票名称','当前价','涨跌额','涨跌幅','年初至今','成交量','成交额','换手率','市盈率(TTM)','股息率','市值'])
    csv_write.writeheader()
    

    运行效果

    在这里插入图片描述
    在这里插入图片描述

    数据可视化

    data_df = pd.read_csv('data2.csv')
    df = data_df.dropna()
    df1 = df[['股票名称', '成交量']]
    df2 = df1.iloc[:20]
    print(df2['股票名称'].values)
    print(df2['成交量'].values)
    
    
    c = (
        Bar()
            .add_xaxis(df2['股票名称'].values.tolist())
            .add_yaxis("股票成交量情况", df2['成交量'].values.tolist())
            .set_global_opts(
            title_opts=opts.TitleOpts(title="成交量图表 - Volume chart"),
            datazoom_opts=opts.DataZoomOpts(),
        )
        .render("data.html")
    )
    
    print('数据可视化结果完成,请在当前目录下查找打开 data.html 文件!')
    

    在这里插入图片描述

    在这里插入图片描述

    尾语

    好了,我的这篇文章写到这里就结束啦!

    有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง

    喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

    展开全文
  • Python爬虫数据如何写入Execl文件并生成图表?需求:为了做测试或者对爬虫程序爬取数据进行分析汇总,我们时常会将数据生成报表,但是如果我们想将报表生成在Excel中,这时候就可以借助xlsxwriter第三方包来生成图表...
  • Python爬虫之GUI图表

    千次阅读 2020-05-02 01:09:12
    关于Python爬虫系列的这篇文章我很早就想写了,但由于我前两周一直在研究vscode插件开发方面,就没去写文章。所幸目前vscode插件开发的知识了解的差不多了,是时候写了,哈哈。需要说明的是,我并非专业Python开发...
  • 利用Python实现豆瓣电影TOP250数据可视化。让我们愉快地开始吧~
  • Python爬虫实战-数据可视化

    千次阅读 2020-03-14 09:28:12
    scrapy爬虫的设置 requests(一个用来发送HTTP请求的简单库) BeautifulSoup(一个从HTML和XML中解析数据的库) MongoDB的用法 MongoBooster可视化工具 注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮...
  • Python爬虫和数据可视化总结

    千次阅读 2021-09-15 19:43:41
    工具: Python,Flask,JS,CSS,HTML,WordCloud 爬取数据并存入数据库 一.导入需要的包 from bs4 import BeautifulSoup # 网页解析,获取数据 import re # 正则表达式,进行文字匹配 import xlwt # 进行excel操作 import ...
  • 移动端Python爬虫实战-2020版

    千次阅读 2020-12-17 00:03:28
    第1章 2020版 第一章 移动端Python爬虫进阶实战课程导学介绍课程目标、通过课程能学习到的内容、学会这些技能能做什么,对公司业务有哪些帮助,对个人有哪些帮助。介绍目前app数据抓取有哪些困难,面临的挑战,本...
  • 本文只供学习,不做他用! import re import threading import requests import os import time import openpyxl # 爬取全部首页图并存储 ...headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0;...
  • Python爬虫以及数据可视化分析

    万次阅读 多人点赞 2020-12-25 17:43:30
    Python爬虫以及数据可视化分析之B站动漫排行榜信息爬取分析 简书地址:https://www.jianshu.com/u/40ac87350697 简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析 源码文件可以参考Github上传的...
  • 上一期我们利用Python+百度地图POI抓取了一些高校之间的距离数据,传送门:不知道上一期的爬取数据的内容大家都品尝的怎么样了呢。今天给大家带来的是python中对数据进行可视化处理的内容。可能大家并不是很懂这个...
  • 环境:pyecharts库,echarts-countries-pypkg,echarts-china-provinces-pypkg,echarts-china-cities-pypkg数据:2018年4月16号的全国各地最高最低和天气...图表绘制代码 代码地址:https://github.com/goodloving/...
  • 原标题:Python数据分析,学习路径拆解及资源推荐 关于Python数据分析,其实网上能够找到的学习资源很多,主要分为两类:一类是提供各种资源的推荐,比如书单、教程、以及学习的先后顺序;另一类是提供具体的学习...
  • 基于python爬虫项目

    2020-11-25 10:44:35
    一、项目简介1.1项目博客地址1.2项目完成的...使用python中的第三方库requests,pandas,pyecharts,snapshot_phantomjsEcharts是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发...
  • Python+selenium爬取淘宝商品,1.驱动浏览器访问淘宝网页,2.进行搜索,扫码登录,3.页面滚动,获取数据
  •        中国男女比例的失衡,再加上广大男同胞们都想着努力为自己的事业而奋斗很少能够接触到女人,使得乎广大男同胞大都选择相亲网站来找到属于自己的另一半,,作为...3、爬虫代.
  • 2021-09-01 学习笔记:Python爬虫、数据可视化 结于2021-09-07; 内容来自 成都工业大学 数字媒体专业实训; 主要内容: PyCharm开发Python脚本的基础配置; Python爬虫基础:正则匹配(re)、网页获取(urllib)...
  • 前言第1章 Python编程基础11.1 搭建Python开发环境11.1.1 安装Python解释器11.1.2 安装Python第三方开发包21.1.3 在PyCharm里新建项目和文件31.1.4 在PyCharm里更换Python解释器51.2 实践Python基本语法51.2.1 针对...
  • 零基础学Python爬虫、数据分析与可视化从入门到精通作者:孟兵,李杰臣出版日期:2020年11月文件大小:49.45M支持设备:¥60.00在线试读适用客户端:言商书局iPad/iPhone客户端:下载 Android客户端:下载PC客户端:...
  • python爬虫技术实例详解及数据可视化库

    千次阅读 多人点赞 2020-02-24 11:58:56
    由此,网络爬虫技术应运而生。 网络爬虫简介 网络爬虫(web crawler,又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种用来自动浏览万维网的程序或者脚本。爬虫可以验证...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,217
精华内容 1,286
关键字:

python爬虫绘制图表