python教程网络爬虫及数据可视化原理解析

目录
  • 1 项目背景
    • 1.1Python的优势
    • 1.2网络爬虫
    • 1.3数据可视化
    • 1.4Python环境介绍
      • 1.4.1简介
      • 1.4.2特点
    • 1.5扩展库介绍
      • 1.5.1安装模块
      • 1.5.2主要模块介绍
  • 2需求分析
    • 2.1 网络爬虫需求
    • 2.2 数据可视化需求
  • 3总体设计
    • 3.1 网页分析
    • 3.2 数据可视化设计
  • 4方案实施
    • 4.1网络爬虫代码
    • 4.2 数据可视化代码
  • 5 效果展示
    • 5.1 网络爬虫
      • 5.1.1 爬取近五年主要城市数据
      • 5.1.2 爬取2019年各省GDP
      • 5.1.3 爬取豆瓣电影Top250
    • 5.2 数据可视化
      • 5.2.1条形图
      • 5.2.2 散点图
      • 5.2.3 饼图
      • 5.2.4 箱线图
      • 5.2.5 树地图
      • 5.2.6 玫瑰图
      • 5.2.7 词云
  • 6 总结
  • 7参考文献

1 项目背景

1.1Python的优势

Python有成熟的程序包资源库和活跃的社区 Python以PYPI为技术支撑,资源丰富,可被灵活调用。还有一些其他优势,比如跨平台且开源、成本小;可方便快捷实现数据可视化,像2D图表和一些基本的3D 图表可以借matplotlib和 seaborn等等一些专属库,只需要编写简单的Python代码就可输出可视化结果,方便快捷[1]。

1.2网络爬虫

网络爬虫(Web Crawler)是依照一定规则主动抓取网页的程序,是搜索引擎获得信息的渠道之一。通常根据给定 URL 种子爬取网页,得到新的 URL 存放至待爬行 URL中,当满足一定条件时停止爬行。网络爬虫一般分为通用网络爬虫、深度网络爬虫和主题网络爬虫 3 类。 主题网络爬虫通常给定 URL 种子集,依照预先规定的主题,由特定的分析算法算出爬行网页的主题相关度,并过滤与主题无关的网页,优先抓取相关度高的网页,当满足一定条件时停止。主题网络爬虫根据主题对 Web 进行分块采集并整合采集结果,从而提高 Web 页面利用率[2]。

1.3数据可视化

在计算机学科的分类中,利用人眼的感知能力对数据进行交互的可视化表达以增强认知的技术,称为可视化。16 世纪,天体和地理的测量技术得到发展, 通过三角测量等技术可精确绘制地图,数据可视化开始萌芽。20 世纪 60 年代计算机的发展使得数据可视化加速发展,通过计算机图像处理等技术,新的可视化方法和技术迎来爆炸性增长。数据可视化将相对复杂、冗杂的大数据经过挖掘、转化,提炼出结构化数据内容,并通过可视的方式以用户更易理解的形式 展示出来,清晰表达数据内在的信息和规律[3]。

1.4Python环境介绍

1.4.1简介

PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。
此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。同时支持Google App Engine,PyCharm支持IronPython。这些功能在先进代码分析程序的支持下,使 PyCharm 成为 Python 专业开发人员和刚起步人员使用的有力工具。

1.4.2特点

首先,PyCharm拥有一般IDE具备的功能,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制
另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm支持IronPython主要功能

1.5扩展库介绍

1.5.1安装模块

1.5.2主要模块介绍

pandas模块

pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。它纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具,提供了大量能使我们快速便捷地处理数据的函数和方法[4]。
pandas中常见的数据结构有两种:
Series DateFrame
类似一维数组的对象, 类似多维数组/表格数组;每列数据可以是不同的类型;索引包括列索引和行索引。

requests模块

requests是一常用的http请求库,它使用python语言编写,可以方便地发送http请求,以及方便地处理响应结果。

bs4模块

BS4 (beautiful soup 4)是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

selenium模块

selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。

matplotlib模块

matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。它可与Numpy一起使用,提供一种有效的MATLAB开源替代方案;它也可以和图形工具包一起使用,让用户很轻松地将数据图形化;同时它还提供多样的输出格式。

seaborn模块

seaborn是一个在Python中制作有吸引力和丰富信息的统计图形的库。它构建在MatPultLB的顶部,与PyDATA栈紧密集成,包括对SIMPY和BANDA数据结构的支持以及SISPY和STATSMODEL的统计例程。
seaborn 其实是在matplotlib的基础上进行了更高级的 API 封装,从而使得作图更加容易 在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充。Seabn是基于MatPultLB的Python可视化库。它为绘制有吸引力的统计图形提供了一个高级接口。

pyecharts模块

pyecharts 是一个用于生成 Echarts 图表的类库。echarts 是百度开源的一个数据可视化 JS 库,主要用于数据可视化。pyecharts 是一个用于生成 Echarts 图表的类库。实际上就是 Echarts 与 Python 的对接。使用 pyecharts 可以生成独立的网页,也可以在 flask , Django 中集成使用。

2需求分析

2.1 网络爬虫需求

通过对爬取网页的html分析,爬取网页的数据,将爬取的数据保存到文件,用于对数据进行可视化。

2.2 数据可视化需求

使爬取网站的数据用更直观的效果展示,当数据获取完成,我们使用相关模块对数据进行清洗处理,并对数据做可视化分析,并理解每一个图标所代表意义;

3总体设计

3.1 网页分析

在爬取国家统计局网站上的数据,需要用到WebDriver,先安装chromdriver。安装的Chromedriver要与自己电脑上的谷歌版本号对应,将下载的chromedriver.exe放到如图 1图 2所示路径下,放到安装谷歌和安装python路径下,用来调用这个可执行文件。还将这两个路径添加环境变量。

驱动浏览器,用webdriver的对象对网页进行点击等操作,找到想要爬取的网站。
通过对网页html分析,通过路径一层层找到自己想要获取的数据。如图 3所示,将数据追加到列表中,保存到文件。

爬取豆瓣电影Top250,翻页查看url变化规律:

第一页:https://movie.douban.com/top250?start=0&filter=
第二页:https://movie.douban.com/top250?start=25&filter=
第三页:https://movie.douban.com/top250?start=50&filter=
第十页:https://movie.douban.com/top250?start=225&filter=

分析可得页面url的规律:

url_list = [“https://movie.douban.com/top250?start={}&filter=”.format(x * 25) for x in range(10)]

对网页进行分析,如图 4所示,每个li标签里都包含每个电影的基本信息,例如:“排名”, “电影名”, "导演和主演"等等。将这些信息追加到列表中,保存到movie.xlsx文件中。

3.2 数据可视化设计

将爬取的数据用多种图表的显示。例如:条形图,饼图,散点图,箱线图,玫瑰图,词云等形式。利用python的pandas模块将数据文件读入。导入matplotlib, pyecharts等模块,调用模块画图的相应函数。进行数据可视化,并将可视化结果保存为图片。

4方案实施

4.1网络爬虫代码

import pandas as pd
import requests
from bs4 import BeautifulSoup
import time
import re
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import lxml
import openpyxl
import codecs
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"
}
url1 = "https://data.stats.gov.cn/easyquery.htm?cn=E0105"
url2 = "http://data.stats.gov.cn"
'''爬取近五年主要城市数据'''
def driver1(url1):
    driver = webdriver.Chrome()
    driver.get(url1)
    time.sleep(3)
    xRdata = '//*[@id="details-button"]'  # 点击高级
    ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
    xRdata = '//*[@id="proceed-link"]'  # 点击
    ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
    time.sleep(3)
    time.sleep(4)  # 加载页面,停留时间长一些
    xTable = '//*[@class="table-container"]/div/div[3]/table/tbody'  # 主要城市年度数据表
    table = driver.find_element_by_xpath(xTable).get_attribute('innerHTML')
    soup = BeautifulSoup(table, 'html.parser')  # 解析表单
    tb = soup.find_all('tr')  # 查找表内tr标签
    tb_p = []  # 各城市名字
    tb_ = []
    tb_1 = [[], [], [], [], []]
    for row in tb:
        row_text = row.text
        # 查找第一个数字的索引
        ret1 = re.search('\d', row_text).start()
        # 将各个城市写入列表中
        tb_p.append(row_text[:ret1])
        # 截断至第一个数字
        row_text = row_text[ret1:]
        for i in range(5):
            try:
                # 顺序查找点
                ret = row_text.find('.')
                # 将第一年年数据保存到列表中
                tb_.append(row_text[:ret + 3])
                # 删去第一年的数据
                row_text = row_text[ret + 3:]
            except:
                break
    for i in range(5):
        for j in range(i, len(tb_), 5):
            try:
                tb_1[i].append(tb_[j])
            except:
                break
    data = {'地区': tb_p,
            '2019年': tb_1[0],
            '2018年': tb_1[1],
            '2017年': tb_1[2],
            '2016年': tb_1[3],
            '2015年': tb_1[4],
            }
    dataframe = pd.DataFrame(data)
    dataframe.to_csv('City_data.csv', index=False, sep=',', encoding='utf-8-sig')
    driver.close()
'''爬取2019年各省GDP'''
def driver2(url2):
    driver = webdriver.Chrome()
    driver.get(url2)
    time.sleep(3)
    xRdata = '//*[@id="details-button"]'  # 点击高级
    ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
    xRdata = '//*[@id="proceed-link"]'  # 点击
    ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
    time.sleep(3)
    xRdata = '//*[@id="nav"]/ul/li[6]/a'  # 地区数据
    ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
    time.sleep(3)
    xPdata = '//*[@id="menuE01"]/li[3]/a'  # 分省年度数据
    ActionChains(driver).click(driver.find_element_by_xpath(xPdata)).perform()
    time.sleep(4)  # 加载页面,停留时间长一些
    xTable = '//*[@class="table-container"]/div/div[3]/table/tbody'  # 数据表
    table = driver.find_element_by_xpath(xTable).get_attribute('innerHTML')
    soup = BeautifulSoup(table, 'html.parser')  # 解析表单
    tb = soup.find_all('tr')  # 查找表内tr标签
    tb_p = []  # 各省市名字
    tb_ = []
    tb_1 = [[], [], [], [], [], [], [], [], [], []]
    for row in tb:
        row_text = row.text
        # 查找第一个数字的索引
        ret1 = re.search('\d', row_text).start()
        # 将各个省份写入列表中
        tb_p.append(row_text[:ret1])
        # 截断至第一个数字
        row_text = row_text[ret1:]
        for i in range(1):
            try:
                # 顺序查找点
                ret = row_text.find('.')
                # 将第一年年数据保存到列表中
                tb_.append(row_text[:ret + 3])
                # 删去第一年的数据
                row_text = row_text[ret + 3:]
            except:
                break
    for i in range(1):
        for j in range(i, len(tb_), 1):
            try:
                tb_1[i].append(tb_[j])
            except:
                break
    data = {'Province': tb_p,
            'GDP': tb_1[0],
            }
    dataframe = pd.DataFrame(data)
    dataframe.to_csv('2019_Province_GDP.csv', index=False, sep=',', encoding='utf-8-sig')
    driver.close()
'''爬取豆瓣电影Top250'''
wb = openpyxl.Workbook()    # 创建工作簿对象
sheet = wb.active           # 获取工作簿的活动表
sheet.title = "movie"       # 工作簿重命名
sheet.append(["排名", "电影名", "导演和主演", "上映时间", "上映地区", "电影类型", "评分", "评价人数", "引言"])
def get_movie(urls):
    rank = 1
    for url in urls:
        res = requests.get(url, headers=headers).text
        html = lxml.etree.HTML(res)
        # 先xpath定位提取到每个页面的所有li标签
        lis = html.xpath('//*[@id="content"]/div/div[1]/ol/li')
        # 每个li标签里有每部电影的基本信息
        for li in lis:
            name = li.xpath('.//div[@class="hd"]/a/span[1]/text()')[0]
            director_actor = li.xpath('.//div[@class="bd"]/p/text()')[0].strip()
            info = li.xpath('.//div[@class="bd"]/p/text()')[1].strip()
            # 按"/"切割成列表
            _info = info.split("/")
            # 得到 上映时间  上映地区  电影类型信息   去除两端多余空格
            time, area, genres = _info[0].strip(), _info[1].strip(), _info[2].strip()
            # print(time, area, genres)
            rating_score = li.xpath('.//div[@class="star"]/span[2]/text()')[0]
            rating_num = li.xpath('.//div[@class="star"]/span[4]/text()')[0]
            quote = li.xpath('.//p[@class="quote"]/span/text()')
            # 最后一页有部电影  九品芝麻官  没有一句话引言  加条件判断  防止报错
            if len(quote) == 0:
                quote = None
            else:
                quote = quote[0]
            sheet.append([rank, name, director_actor, time, area, genres, rating_score, rating_num, quote])
            rank += 1
    # 保存到文件
    wb.save("movie.xlsx")
'''豆瓣电影Top250'''
index_url = 'https://movie.douban.com/top250'
def get_html(url):
    html = requests.get(url, headers=headers).text
    return html
def create_list(html):
    soup = BeautifulSoup(html, 'lxml')
    movie_names = []
    movie_info = []
    for t in soup.find_all('div', 'hd'):
        name = t.find('span', 'title').get_text()
        movie_names.append(name)
    for t in soup.find_all('div', 'info'):
        info = t.find('p').get_text().replace(' ','')
        movie_info.append(info)
        next_page = soup.find('span', 'next').find('a')
    if next_page:
         return movie_names, movie_info, index_url + next_page['href']
    else:
         return movie_names, movie_info, None
def main():
    order = 1
    url = index_url
    with codecs.open('top250.txt', 'wb', encoding='utf-8') as f:
        while url:
            html = get_html(url)
            names, info, url = create_list(html)
            for n in range(25):
                f.write('Top ' + str(order) + ' ' + names[n] + '\r\n')
                f.write(info[n] + '\r\n')
                order = order+1
if __name__ == "__main__":
    # 列表推导式得到url列表  10页的电影信息  Top250
    url_list = ["https://movie.douban.com/top250?start={}&filter=".format(i * 25) for i in range(10)]
    driver1(url1)
    driver2(url2)
    get_movie(url_list)
    main()

4.2 数据可视化代码

import pandas as pd
import re
import matplotlib.pyplot as plt
import collections
import seaborn as sns
from stylecloud import gen_stylecloud
import jieba
import squarify
from pyecharts import Pie
sns.set() #恢复seaborn的默认主题
# 中文乱码和坐标轴负号的处理
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
'''条形图'''
GDP = pd.read_csv('2019_Province_GDP.csv')
# 设置绘图风格
plt.style.use('ggplot')
# 绘制条形图
plt.bar(x= range(GDP.shape[0]), # 指定条形图x轴的刻度值
        height = GDP.GDP, # 指定条形图y轴的数值
        tick_label = GDP.Province, # 指定条形图x轴的刻度标签
        color = 'steelblue', # 指定条形图的填充色
       )
# 添加y轴的标签
plt.ylabel('GDP(万亿)')
# 添加条形图的标题
plt.title('2019年各省份GDP分布')
# 为每个条形图添加数值标签
for x,y in enumerate(GDP.GDP):
    plt.text(x,y+0.1,'%s' %round(y,1),ha='center')
# 显示图形
plt.savefig('test1.png')
plt.show()
'''饼图'''
# 构造数据
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中专','大专','本科','硕士','其他']
explode = [0,0.1,0,0,0]  # 生成数据,用于突出显示大专学历人群
colors=['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555']  # 自定义颜色
# 将横、纵坐标轴标准化处理,确保饼图是一个正圆,否则为椭圆
plt.axes(aspect='equal')
# 绘制饼图
plt.pie(x = edu, # 绘图数据
        explode=explode, # 突出显示大专人群
        labels=labels, # 添加教育水平标签
        colors=colors, # 设置饼图的自定义填充色
        autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
        pctdistance=0.8,  # 设置百分比标签与圆心的距离
        labeldistance = 1.1, # 设置教育水平标签与圆心的距离
        startangle = 180, # 设置饼图的初始角度
        radius = 1.2, # 设置饼图的半径
        counterclock = False, # 是否逆时针,这里设置为顺时针方向
        wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值
        textprops = {'fontsize':10, 'color':'black'}, # 设置文本标签的属性值
        )
# 添加图标题
plt.title('失信用户的受教育水平分布')
# 显示图形
plt.savefig('test2.png')
plt.show()
'''箱线图'''
data=pd.read_csv('City_data.csv')
#箱线图
data.boxplot()
plt.savefig('test3.png')
plt.show()
'''树地图'''
# 创建数据
name = ['国内增值税', '国内消费税', '企业所得税', '个人所得税',
        '进口增值税、消费税', '出口退税', '城市维护建设税',
        '车辆购置税', '印花税', '资源税', '土地和房税', '车船税烟叶税等']
income = [3908, 856, 801, 868, 1361, 1042, 320, 291, 175, 111, 414, 63]
# 绘图
colors = ['steelblue', '#9999ff', 'red', 'indianred',
          'green', 'yellow', 'orange']
plot = squarify.plot(sizes=income,  # 指定绘图数据
                     label=name,  # 指定标签
                     color=colors,  # 指定自定义颜色
                     alpha=0.6,  # 指定透明度
                     value=income,  # 添加数值标签
                     edgecolor='white',  # 设置边界框为白色
                     linewidth=3  # 设置边框宽度为3
                     )
# 设置标签大小
plt.rc('font', size=8)
# 设置标题大小
plot.set_title('2020年12月中央财政收支情况', fontdict={'fontsize': 15})
# 去除坐标轴
plt.axis('off')
# 去除上边框和右边框刻度
plt.tick_params(top='off', right='off')
# 显示图形
plt.savefig('test4.png')
plt.show()
'''玫瑰图'''
attr =["碳酸饮料", "其他", "绿茶", "矿泉水", "果汁"]
v1 =[6, 2, 7, 6,1]
v2 =[9, 6, 4, 4,5]
pie =Pie("玫瑰图", title_pos='center', width=800)
pie.add("男", attr, v1, center=[25, 50], is_random=True, radius=[20, 50], rosetype='radius')
pie.add("女", attr, v2, center=[75, 50], is_random=True, radius=[20, 50], rosetype='area',
        is_legend_show=False, is_label_show=True)
pie.show_config()
pie.render('玫瑰图.html')
# 读取数据
df = pd.read_excel("movie.xlsx",engine='openpyxl')
# print(type(df))    # <class 'pandas.core.frame.DataFrame'>
'''上映高分电影数量最多的年份Top10'''
show_time = list(df["上映时间"])
# 有上映时间数据是1961(中国大陆)这样的  处理一下  字符串切片
show_time = [s[:4] for s in show_time]
show_time_count = collections.Counter(show_time)
# 取数量最多的前10  得到一个列表  里面每个元素是元组
# (年份, 数量)
show_time_count = show_time_count.most_common(10)
# 字典推导式
show_time_dic = {k: v for k, v in show_time_count}
# 按年份排序
show_time = sorted(show_time_dic)
# 年份对应高分电影数量
counts = [show_time_dic[k] for k in show_time]
plt.figure(figsize=(9, 6), dpi=100)
# 绘制条形图
plt.bar(show_time, counts, width=0.5, color="cyan")
# y轴刻度重新设置一下
plt.yticks(range(0, 16, 2))
# 添加描述信息
plt.xlabel("年份")
plt.ylabel("高分电影数量")
plt.title("上映高分电影数量最多的年份Top10", fontsize=15)
# 添加网格  网格的透明度  线条样式
plt.grid(alpha=0.2, linestyle=":")
plt.savefig('test5.png')
plt.show()
'''国家或地区上榜电影数量最多的Top10'''
area = list(df['上映地区'])
sum_area = []
for x in area:
    x = x.split(" ")
    for i in x:
        sum_area.append(i)
area_count = collections.Counter(sum_area)
area_dic = dict(area_count)
area_count = [(k, v) for k, v in list(area_dic.items())]
# 按国家或地区上榜电影数量排序
area_count.sort(key=lambda k: k[1])
# 取国家或地区上榜电影数量最多的前十
area = [m[0] for m in area_count[-10:]]
nums = [m[1] for m in area_count[-10:]]
plt.figure(figsize=(9, 6), dpi=100)
# 绘制横着的条形图
plt.barh(area, nums, color='red')
# 添加描述信息
plt.xlabel('电影数量')
plt.title('国家或地区上榜电影数量最多的Top10')
plt.savefig('test6.png')
plt.show()
'''豆瓣电影Top250-评价人数Top10'''
name = list(df['电影名'])
ranting_num = list(df['评价人数'])
# (电影名, 评价人数)
info = [(m, int(n.split('人')[0])) for m, n in list(zip(name, ranting_num))]
# 按评价人数排序
info.sort(key=lambda x: x[1])
# print(info)
name = [x[0] for x in info[-10:]]
ranting_num = [x[1] for x in info[-10:]]
plt.figure(figsize=(12, 6), dpi=100)
# 绘制横着的条形图
plt.barh(name, ranting_num, color='cyan', height=0.4)
# 添加描述信息
plt.xlabel('评价人数')
plt.title('豆瓣电影Top250-评价人数Top10')
plt.savefig('test7.png')
plt.show()
'''豆瓣电影Top250评分-排名的散点分布'''
# 豆瓣电影Top250  排名  评分  散点图   描述关系
rating = list(df["排名"])
rating_score = list(df["评分"])
plt.figure(figsize=(9, 6), dpi=100)
# 绘制散点图  设置点的颜色
plt.scatter(rating_score, rating, c='r')
# 添加描述信息  设置字体大小
plt.xlabel("评分", fontsize=12)
plt.ylabel("排名", fontsize=12)
plt.title("豆瓣电影Top250评分-排名的散点分布", fontsize=15)
# 添加网格  网格的透明度  线条样式
plt.grid(alpha=0.5, linestyle=":")
plt.savefig('test8.png')
plt.show()
'''豆瓣电影Top250词云'''
# 读取数据
with open('top250.txt', encoding='utf-8') as f:
    data = f.read()
# 文本预处理  去除一些无用的字符   只提取出中文出来
new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)
new_data = " ".join(new_data)
# 文本分词
seg_list_exact = jieba.cut(new_data, cut_all=False)
result_list = []
with open('top250.txt', encoding='utf-8') as f:
    con = f.readlines()
    stop_words = set()
    for i in con:
        i = i.replace("\n", "")   # 去掉读取每一行数据的\n
        stop_words.add(i)
for word in seg_list_exact:
    # 设置停用词并去除单个词
    if word not in stop_words and len(word) > 1:
        result_list.append(word)
print(result_list)
gen_stylecloud(
    text=' '.join(result_list),
    size=500,
    collocations=False,
    font_path=r'C:\Windows\Fonts\msyh.ttc',
    output_name='test9.png',
    icon_name='fas fa-video',
    palette='colorbrewer.qualitative.Dark2_7'
)

5 效果展示

5.1 网络爬虫

5.1.1 爬取近五年主要城市数据

5.1.2 爬取2019年各省GDP

Province GDP
北京市 35371.28
天津市 14104.28
河北省 35104.52
山西省 17026.68
内蒙古自治区 17212.53
辽宁省 24909.45
吉林省 11726.82
黑龙江省 13612.68
上海市 38155.32
表 4 2019_Province_GDP.csv部分数据

5.1.3 爬取豆瓣电影Top250

5.2 数据可视化

5.2.1条形图

2019年各省GDP,这个条形图效果不是很好,可以对数据处理一下,可以一个图里面少点省份。

通过减少图中数据,下面这几个条形图效果较好。

5.2.2 散点图

豆瓣电影Top250散点分别,可以更直观的看到不同评分所处的排名。

5.2.3 饼图

5.2.4 箱线图

5.2.5 树地图

5.2.6 玫瑰图

5.2.7 词云

6 总结

通过对Python爬虫以及数据可视化的学习,在这过程中查阅了许多的资料。主要实现了爬取2019年各省数据和主要城市近五年,还有豆瓣电影top250,用图表等可视化方式更直观的看数据。对Python常用模块和函数的使用方法有了进一步的了解。
由于时间有限,项目还有许多不足,对于爬取的同一个网站不同页面。爬取的代码部分有重复,代码就有点长。代码质量不高。有的对数据没有处理,直接拿过来用。第一个条形图看起来效果很差,不能很好的展现数据信息。仍需继续改进。

7参考文献

[1]杨露,葛文谦. 基于Python的制造业数据分析可视化平台设计[J]. 《信息化研究》,2018年10月第44卷第5期.
[2]左薇,张熹,董红娟. 主题网络爬虫研究综述[J]. 《软件导刊》,2020年2月第19卷第2期.
[3]孙远波,闻芷艺,徐瑞格. 新型冠状病毒肺炎疫情数据可视化设计综述 [J]. 《包装工程》,2020年4月第41卷第8期.
[4]董付国,Python程序设计基础(第2版).清华大学出版社,2018.

以上就是python教程网络爬虫及数据可视化原理解析的详细内容,更多关于python网络爬虫及数据可视化的资料请关注我们其它相关文章!

(0)

相关推荐

  • python如何爬取网站数据并进行数据可视化

    前言 爬取拉勾网关于python职位相关的数据信息,并将爬取的数据已csv各式存入文件,然后对csv文件相关字段的数据进行清洗,并对数据可视化展示,包括柱状图展示.直方图展示.词云展示等并根据可视化的数据做进一步的分析,其余分析和展示读者可自行发挥和扩展包括各种分析和不同的存储方式等..... 一.爬取和分析相关依赖包 Python版本: Python3.6 requests: 下载网页 math: 向上取整 time: 暂停进程 pandas:数据分析并保存为csv文件 matplotlib:

  • Python实现数据可视化看如何监控你的爬虫状态【推荐】

    今天主要是来说一下怎么可视化来监控你的爬虫的状态. 相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样.今天我来讲一种可视化的方法. 关于爬虫数据在mongodb里的版本我写了一个可以热更新配置的版本,即添加了新的爬虫配置以后,不用重启程序,即可获取刚刚添加的爬虫的状态数据. 1.成品图 这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为M.爬虫的原理都是一样的,只不过将数据存到InfluxDB的方式不一样而已, 如下图. 可以

  • Python爬虫实战之爬取京东商品数据并实实现数据可视化

    一.开发工具 Python版本:3.6.4 相关模块: DecryptLogin模块: argparse模块: 以及一些python自带的模块. 二.环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 三.原理简介 原理其实挺简单的,首先,我们利用之前开源的DecryptLogin库来实现一下微博的模拟登录操作: '''模拟登录京东''' @staticmethod def login(): lg = login.Login() infos_return, session

  • Python爬取股票信息,并可视化数据的示例

    前言 截止2019年年底我国股票投资者数量为15975.24万户, 如此多的股民热衷于炒股,首先抛开炒股技术不说, 那么多股票数据是不是非常难找, 找到之后是不是看着密密麻麻的数据是不是头都大了? 今天带大家爬取雪球平台的股票数据, 并且实现数据可视化 先看下效果图 基本环境配置 python 3.6 pycharm requests csv time 目标地址 https://xueqiu.com/hq 爬虫代码 请求网页 import requests url = 'https://xueq

  • python教程网络爬虫及数据可视化原理解析

    目录 1 项目背景 1.1Python的优势 1.2网络爬虫 1.3数据可视化 1.4Python环境介绍 1.4.1简介 1.4.2特点 1.5扩展库介绍 1.5.1安装模块 1.5.2主要模块介绍 2需求分析 2.1 网络爬虫需求 2.2 数据可视化需求 3总体设计 3.1 网页分析 3.2 数据可视化设计 4方案实施 4.1网络爬虫代码 4.2 数据可视化代码 5 效果展示 5.1 网络爬虫 5.1.1 爬取近五年主要城市数据 5.1.2 爬取2019年各省GDP 5.1.3 爬取豆瓣电影

  • python代码实现TSNE降维数据可视化教程

    TSNE降维 降维就是用2维或3维表示多维数据(彼此具有相关性的多个特征数据)的技术,利用降维算法,可以显式地表现数据.(t-SNE)t分布随机邻域嵌入 是一种用于探索高维数据的非线性降维算法.它将多维数据映射到适合于人类观察的两个或多个维度. python代码 km.py #k_mean算法 import pandas as pd import csv import pandas as pd import numpy as np #参数初始化 inputfile = 'x.xlsx' #销量及

  • Python即时网络爬虫项目启动说明详解

    作为酷爱编程的老程序员,实在按耐不下这个冲动,Python真的是太火了,不断撩拨我的心. 我是对Python存有戒备之心的,想当年我基于Drupal做的系统,使用php语言,当语言升级了,推翻了老版本很多东西,不得不花费很多时间和精力去移植和升级,至今还有一些隐藏在某处的代码埋着雷.我估计Python也避免不了这个问题(其实这种声音已经不少,比如Python 3 正在毁灭 Python). 但是,我还是启动了这个Python即时网络爬虫项目.我用C++.Java和Javascript编写爬虫相关

  • 选择Python写网络爬虫的优势和理由

    什么是网络爬虫? 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件 爬虫有什么用? 做为通用搜索引擎网页收集器.(google,baidu) 做垂直搜索引擎. 科学研究:在线人类行为,在线社群演化,人类动力学研究,计量社会学,复杂网络,数据挖掘,等领域的实证研究都需要大量数据,网络爬虫是收集相关数据的利器.

  • python用pyecharts实现地图数据可视化

    有的时候,我们需要对不同国家或地区的某项指标进行比较,可简单通过直方图加以比较.但直方图在视觉上并不能很好突出地区间的差异,因此考虑地理可视化,通过地图上位置(地理位置)和颜色(颜色深浅代表数值差异)两个元素加以体现.在本文案例中,基于第三方库pyecharts,对中国各省2010-2019年的GDP进行绘制. 我们先来看看最终效果: 关于绘图数据 基于时间和截面两个维度,可把数据分为截面数据.时间序列及面板数据.在本文案例中,某一年各省的GDP属于截面数据,多年各省的GDP属于面板数据.因此,

  • pytorch教程网络和损失函数的可视化代码示例

    目录 1.效果 2.环境 3.用到的代码 1.效果 2.环境 1.pytorch 2.visdom 3.python3.5 3.用到的代码 # coding:utf8 import torch from torch import nn, optim # nn 神经网络模块 optim优化函数模块 from torch.utils.data import DataLoader from torch.autograd import Variable from torchvision import t

  • 详解用python写网络爬虫-爬取新浪微博评论

    新浪微博需要登录才能爬取,这里使用m.weibo.cn这个移动端网站即可实现简化操作,用这个访问可以直接得到的微博id. 分析新浪微博的评论获取方式得知,其采用动态加载.所以使用json模块解析json代码 单独编写了字符优化函数,解决微博评论中的嘈杂干扰字符 本函数是用python写网络爬虫的终极目的,所以采用函数化方式编写,方便后期优化和添加各种功能 # -*- coding:gbk -*- import re import requests import json from lxml im

  • Python数据分析应用之Matplotlib数据可视化详情

    目录 简述 掌握绘图基础语法与基本参数 掌握pyplot基础语法 pyplot中的基础绘图语法 包含子图的基础语法 调节线条的rc参数 调节字体的rc参数 分析特征间的关系 绘制散点图 绘制2000-2017年个季度过敏生产总值散点图 绘制2000-2017年各季度国民生产总值散点图 绘制折线图 绘制2000-2017年各季度过敏生产总值折线图 2000~ 2017年各季度国民生产总值点线图 2000~ 2017年各季度国民生产总值折线散点图 任务实现 任务1 任务2 分析特征内部数据分布与分散

  • python模拟投掷色子并数据可视化统计图

    目录 前言 1.模拟掷色子 2.我们来模拟投掷两个色子 前言 这里讲解模拟掷色子,并实现数据可视化的操作.数据可视化可以帮助我们更好地分析相关的统计结果,获得更为直观的统计图,帮组我们更好的处理一些事情. 可视化的终极目标是洞悉蕴含在数据中的现象和规律,这里面有多重含义:发现.决策.解释.分析.探索和学习.通过数据可视化,可以更好的分析相关的统计结果,以提高我们的工作效率.Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件.它能让使用者很轻松地将数据图形化,并且提供多样化

  • Python中不同图表的数据可视化的实现

    目录 1.直方图 2. 柱形图 3. 箱线图 4.饼图 5.散点图 数据可视化是以图形格式呈现数据.它通过以简单易懂的格式汇总和呈现大量数据,帮助人们理解数据的重要性,并有助于清晰有效地传达信息. 考虑这个给定的数据集,我们将为其绘制不同的图表: 用于分析和呈现数据的不同类型的图表 1.直方图 直方图表示特定现象发生的频率,这些现象位于特定的数值范围内,并以连续和固定的间隔排列. 在下面的代码中绘制直方图Age, Income, Sales.因此,输出中的这些图显示了每个属性的每个唯一值的频率.

随机推荐