20192307CWL

20192307 2019-2020-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 1923班
姓名: 常万里
学号: 20192307
实验教师:王志强
实验日期:2020年6月10日
必修/选修: 公选课

1.实验内容

  1. Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等;
  2. 经过选择,我选择了编写爬虫程序,可视化展示和生成HTML文件,来进行程序编写。

2. 实验过程及结果

2.1 爬虫程序的确定与编写

本次数据通过爬虫技术爬取丁香园获得
首先导入需要运用到的库

"""
文件名:Python语言基础实践10
描  述:实验四
作  者:20192307
日  期:2020/06/01
"""
import json
import matplotlib.pyplot as plt
import requests
from matplotlib import ticker
from re import search, S
from json import loads, dump
from requests import get
import datetime
from pyecharts.charts import Map
from pyecharts import options as opts

先爬取 丁香园实时统计数据 ,保存到data目录下,以当前日期作为文件名,存JSON文件

url = \'https://view.inews.qq.com/g2/getOnsInfo?name=disease_other\'
html = requests.get(url)
message = json.loads(html.text)
mes = json.loads(message[\'data\'])
mes_dict = mes["dailyNewAddHistory"]
date = []
country = []
hubei = []
nothubei = []
n = 0
for d in mes_dict:
    date.append(d[\'date\'])
    country.append(d[\'country\'])
    hubei.append(d[\'hubei\'])
    nothubei.append(d[\'notHubei\'])
    n = n + 1
    if n > 40:
        break
x = date
y1 = country
y2 = hubei
y3 = nothubei
plt.figure(figsize=(20, 10))
plt.title(
    "Chart of the number of newly confirmed cases per day in February 2020")
plt.xlabel(\'Date\')
plt.ylabel(\'Number of newly confirmed cases\')
plt.bar(x, y2, facecolor=\'pink\', edgecolor=\'white\', label=\'Hubei\')
plt.bar(x, y3, facecolor=\'#ff9999\', edgecolor=\'white\', label=\'notHubei\')
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(10))
plt.annotate(r"$add\ clinically\ diagnosed\ cases$",
             xy=(\'02.12\', 15153),
             xycoords=\'data\',
             xytext=(+30, -100),
             textcoords=\'offset points\',
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
for x, y in zip(x, y1):
    plt.text(x, y + 1, y, ha=\'left\')
plt.legend()
plt.show()

today = datetime.date.today().strftime(\'%Y%m%d\')


def crawl_dxy_data():
    response = get(\'https://ncov.dxy.cn/ncovh5/view/pneumonia\')
    # request.get()用于请求目标网站
    print(response.status_code)
    # 打印状态码
    try:
        url_text = response.content.decode()
        url_content = search(r\'window.getAreaStat = (.*?)}]}catch\', url_text,
                             S)
        texts = url_content.group()  # 获取匹配正则表达式的整体结果
        content = texts.replace(\'window.getAreaStat = \',
                                \'\').replace(\'}catch\', \'\')  # 去除多余的字符
        json_data = loads(content)
        with open(today + \'.json\', \'w\', encoding=\'UTF-8\') as f:
             dump(json_data, f, ensure_ascii=False)
    except (Exception):
        print(\'<Response [%s]>\' % response.status_code)


def crawl_statistics_data():

    with open(today + \'.json\', \'r\', encoding=\'UTF-8\') as file:
        json_array = loads(file.read())

    statistics_data = {}
    for province in json_array:
        response = get(province[\'statisticsData\'])
        try:
            statistics_data[province[\'provinceShortName\']] = loads(
                response.content.decode())[\'data\']
        except (Exception):
            print(\'<Response [%s]> for url: [%s]\' %
                  (response.status_code, province[\'statisticsData\']))
    with open("statistics_data.json", "w", encoding=\'UTF-8\') as f:
        dump(statistics_data, f, ensure_ascii=False)

然后是主程序

if __name__ == \'__main__\':
    crawl_dxy_data()
    crawl_statistics_data()
today = datetime.date.today().strftime(\'%Y%m%d\')
datafile = today + \'.json\'
with open(datafile, \'r\', encoding=\'UTF-8\') as file:
    json_array = loads(file.read())
china_data = []
for province in json_array:
    china_data.append(
        (province[\'provinceShortName\'], province[\'confirmedCount\']))
china_data = sorted(china_data, key=lambda x: x[1], reverse=True)
# reverse=True,表示降序,反之升序
print(china_data)
pieces = [
    {
        \'min\': 10000,
        \'color\': \'#540d0d\'
    },
    {
        \'max\': 9999,
        \'min\': 1000,
        \'color\': \'#9c1414\'
    },
    {
        \'max\': 999,
        \'min\': 500,
        \'color\': \'#d92727\'
    },
    {
        \'max\': 499,
        \'min\': 100,
        \'color\': \'#ed3232\'
    },
    {
        \'max\': 99,
        \'min\': 10,
        \'color\': \'#f27777\'
    },
    {
        \'max\': 9,
        \'min\': 1,
        \'color\': \'#f7adad\'
    },
    {
        \'max\': 0,
        \'color\': \'#f7e4e4\'
    },
]
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]

Echarts 是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。

m = Map()
m.add("累计确诊", [list(z) for z in zip(labels, counts)], \'china\')
# 系列配置项,可配置图元样式、文字样式、标签样式、点线样式等
m.set_series_opts(label_opts=opts.LabelOpts(font_size=12), is_show=False)
# 全局配置项,可配置标题、动画、坐标轴、图例等
m.set_global_opts(
    title_opts=opts.TitleOpts(title=\'全国实时确诊数据\', subtitle=\'数据来源:丁香园\'),
    legend_opts=opts.LegendOpts(is_show=False),
    visualmap_opts=opts.VisualMapOpts(
        pieces=pieces,
        is_piecewise=True,  # 是否为分段型
        is_show=True))  # 是否显示视觉映射配置
 # render()会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件,也可以传入路径参数,如 m.render("mycharts.html")
 m.render(path=\'全国实时确诊数据.html\')

2.2 运行结果的展示

运行结果截图为:

生成网站的展示:

提交代码,推送到码云仓库。
码云仓库地址为"https://gitee.com/python_programming/chang_wanli"

3. 实验过程中遇到的问题和解决过程

  • 问题1:在第一次下载requests、pyecharts库的时候一直失败;
  • 问题1解决方案:利用清华的镜像网站进行下载,下载速度会有极大提升,下载成功率也会有极大提高。
  • 问题2:格式化代码时遇到问题;
  • 问题2解决方案:在《Python编程:从入门到实践》一书中找到了相关课程,重新学习后,对于格式化代码以及数组,元组,序列,集合进行了重新编写。
  • 问题3:正则表达式运用不成功;
  • 问题3解决方案:在菜鸟教程上找到了正确的正则表达式运用格式。熟悉正则表达式格式后重新编写代码。
  • 问题4:进行网站爬虫的时候不成功;
  • 问题4解决方案:在菜鸟教程上找到了正确的网站爬虫运用格式。熟悉爬虫格式后重新编写代码。

4. 感悟与思考

在这次实验过程中,我遇到了许多问题,其中既有知识上的漏洞,也有不细心导致的马虎,这一切都补充,完善,丰富,扩展了我的python语言知识体系。在不断修复问题的过程中,我使用了很多方式去查询资料,例如:《Python编程:从入门到实践》,《[笨办法]学Python3(第三版)》,博客园平台,CDSN平台,码云平台,知乎app,等。在这个爬虫程序的编写中,我还进一步熟悉了vscode这个IDE平台的使用与运行方式,提高了自己自主学习的能力,为我接下来学习python语言程序设计打下了坚实的基础,并在不断探索的过程中逐步提升了自己。

参考资料

  • 《Python编程:从入门到实践》
  • 《[笨办法]学Python3(第三版)》
  • 《Python基础教程(第3版)》
  • 《Python核心编程(第3版)》

分类:

技术点:

相关文章: