Python爬虫获取地铁客流量数据并进行数据清洗与可视化展示

文章目录

任务

学院的C语言课程设计选题为地铁模拟系统,除了实现购票和充值,题目还要求实现车辆调度功能,原本没有想到好的实现形式一直搁置,验收关头发现必要性。
经学长点拨,将其所做的公交车的调度方式进行移植。只需绘制发车时间与抵达终点站时间的线性图即可体现调度功能,并加入真实数据处理更具逼真性。

已有

  • 学长传给的公交车运行数据(excel表格)
  • 微博官方账号每日公布昨日流量

过程

分别

1. 用c语言读入数据

C语言读入数据
C语言读入数据(优化版)

  • 计划任务

2. 用爬虫爬取微博数据

在多次尝试调用API均失败后,怀一线希望在网上搜寻,一个脚本可以成功运行。
可运行脚本

可通过此文章了解爬取新浪微博网站相关知识。

基础设置
# -*- coding: utf-8 -*-
import  random
import urllib.request
import json
import re

import requests
import time

#定义要爬取的微博ID为武汉地铁运营
id= str(3186945861)#(input("请输入要抓的微博uid:"))

na='a'
#设置代理IP

iplist=['112.228.161.57:8118','125.126.164.21:34592','122.72.18.35:80','163.125.151.124:9999','114.250.25.19:80']

proxy_addr="125.126.164.21:34592"

#定义页面打开函数
def use_proxy(url,proxy_addr):
    req=urllib.request.Request(url)
    req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")
    proxy=urllib.request.ProxyHandler({'http':random.choice(iplist)})
    opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
    urllib.request.install_opener(opener)
    data=urllib.request.urlopen(req).read().decode('utf-8','ignore')
    return data
#获取微博主页的containerid,爬取微博内容时需要此id
def get_containerid():
    url='https://m.weibo.cn/api/container/getIndex?type=uid&value='+id
    data=use_proxy(url,random.choice(iplist))
    content=json.loads(data).get('data')
    for data in content.get('tabsInfo').get('tabs'):
        if(data.get('tab_type')=='weibo'):
            containerid=data.get('containerid')
    return containerid

在验证可获取微博内容后,下一步就是将自己所需的数据剔出。

观察数据
###观察每一页的卡片数目,卡片即对应单个微博
for i in range(20):
    weibo_url='https://m.weibo.cn/api/container/getIndex?type=uid&value='+id+'&containerid='+get_containerid()+'&page='+str(i)
    data=use_proxy(weibo_url,random.choice(iplist))
    content=json.loads(data).get('data')
    cards=content.get('cards')
    print(len(cards))

运行结果
可推知,卡片为一个页面上显示的微博条目。

数据清洗

通过网上资料可知card_type为9则代表为微博内容,否则可能为广告等等。

#打印包含客流统计微博
for card in cards:
    card_type=card.get('card_type')
    #print(card_type)
    if(card_type==9):
		mblog=card.get('mblog')
		#print(mblog)
		#if(str(mblog).find("客流")>0)  : 
		text=mblog.get('text')
		print(text)

连接上部分运行结果
运行结果

将含有【昨日客流】标签的正文提取出来。
在这里插入图片描述

利用正则表达式的知识,将所需信息提取出来

###匹配相应信息
#示例格式:
#【昨日客流】4月27日(周六),武汉城市轨道交通线网客运量(含换乘)为332.54万乘次,其中客流前五名依次为: 2号线汉口火车站、2号线江汉路站、2号线街道口站、4号线楚河汉街站、2号线中山公园站。 
print(text)
#日期:x月x日
date=re.findall('\d+月\d+日',text)[0]
#星期:周x
day=re.findall('周\S',text)[0]
#客流量
flow=re.findall('为(.*?)万乘次',text)[0]
#排名前五
ranks=re.findall('依次为:(.*?)。',text)[0]
ranks=ranks.split('、')

print(date)
print(day)
print(flow)
print(ranks)
for rank in ranks:
    print(rank)

运行结果

数据展示

通过可视化将数据展示出来,参考文章解决横坐标过长无法显示完全问题。

绘制高峰站点图像
###绘制高峰站点图像
import matplotlib.pyplot as plt
import math
font = {'family' : 'SimHei',
    'weight' : 'bold',
    'size'  : '16'}

fig3 = plt.figure(figsize=(10,6))
#plt.subplots_adjust(hspace=0.3)
# 创建子图及间隔设置

ax = fig3.add_subplot(2,1,1)
plt.rc('font', **font) # pass in the font dict as kwargs
plt.rc('axes',unicode_minus=False)

plt.xticks(fontsize = 17)#对坐标的值数值,大小限制
#plt.yticks(fontsize = 37)

plt.xlabel('站点', fontproperties="SimHei")
plt.ylabel('提名次数')
#网格
plt.grid()
plt.bar(list(statisStop.keys()),list(statisStop.values()))
#plt.legend()

ax.set_xticks(range(len(list(statisStop.keys()))))

ax.set_xticklabels(list(statisStop.keys()), rotation=90)
plt.savefig('./stop.jpg')

运行结果

绘制高峰流量图
##绘制高峰流量图
import matplotlib.pyplot as plt
import math
#设置字体
font = {'family' : 'SimHei',
    'weight' : 'bold',
    'size'  : '16'}

fig3 = plt.figure(figsize=(10,6))
#plt.subplots_adjust(hspace=0.3)

# 创建子图及间隔设置
ax = fig3.add_subplot(2,1,1)
plt.rc('font', **font) # pass in the font dict as kwargs
plt.rc('axes',unicode_minus=False)

#对坐标字体大小限制
plt.xticks(fontsize = 10)
#plt.yticks(fontsize = 37)

#设置坐标标签
plt.xlabel('日期')
plt.ylabel('流量(万乘次)')

#网格
plt.grid()

#将横坐标反转,符合时间逻辑
plt.plot(list(statisFlow.keys())[::-1],list(statisFlow.values())[::-1])

#设置间距
ax.set_xticks(range(0,len(list(statisFlow.keys())),7))
ax.set_xticklabels(list(statisFlow.keys())[::-7], rotation=70)

#保存图片
plt.savefig('./flow.jpg')

运行结果

写在后面

在2020年,终于将这篇早已列为草稿的计划完成。但在今天,武汉的地铁已经停止运行3天,家中电视正在不停播报关于祸起武汉的肺炎的最新进展,或者是鼓舞民众的有力声音。
在这个大时代中,自己曾经处于事发的漩涡到底还是让人感觉魔幻,开学好像也随事态的愈发严重显得遥不可及。
希望这场风波快点平歇,一切好起来!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安居客是一个房地产信息网站,为了获取其中的数据,可以使用Python编写爬虫程序进行网页内容的抓取。通过分析网页的结构和规律,可以从安居客网站上获取所需的数据爬虫程序可以通过请求网页的URL,获取网页的HTML源码,然后使用Python的相关库(如BeautifulSoup)对HTML进行解析,提取出需要的数据。 在获取数据之后,需要进行数据清洗数据清洗是指对采集到的原始数据进行清理、处理,使其符合数据分析的要求。例如,去除重复数据、处理缺失值、剔除异常值等。通过使用Python数据处理库(如pandas)可以方便地进行数据清洗的操作。 数据清洗完成后,可以进行数据分析。数据分析是指对清洗后的数据进行统计、计算、挖掘等操作,以获取其中的有价值的信息和规律。Python中有很多用于数据分析的库,如numpy、scipy、matplotlib等。可以使用这些库进行数据的统计分析、机器学习算法的实施、模型的构建等。 最后,为了更好地展示分析结果,可以进行数据可视化数据可视化是指使用图表、图像等形式将数据进行直观、易懂的展示Python中的matplotlib、seaborn等库提供了丰富的图表绘制功能,可以将数据转换为直观的图表,以便更好地帮助用户理解和分析数据。 综上所述,通过安居客数据的爬取、数据清洗数据分析可视化,可以获取并理解网站上房地产相关的有价值信息,为用户提供更好的数据分析与决策支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值