Python爬取南京地铁微博发布客流数据并进行分析!

之前在网上看到了分析北京地铁客流数据的开源项目,就想试着分析一下南京地铁的客流数据,可是找了很久没有找到可以获得南京地铁客流数据的接口,就去南京地铁微博看了一下,果然跟北京地铁一样,基本上每天都会更新客流数据。所以开始动手~

爬南京地铁微博,获取有用的数据并保存成txt文件

首先,百度搜一下Python爬新浪微博内容的框架,有很多很多,我们选择一个,随便改改,发现可以用啦:

南京地铁微博ID:2638276292

根据下面的条件进行初步的筛选,基本上可以找到对应的微博。

进群:960410445 获取源码!


weibocontentindex=str(text).find("南京地铁")

weibocontentindex2=str(text).find("客运")

if weibocontentindex > -1 and weibocontentindex2 > -1:

fh.write(text[weibocontentindex-1:]+' ')


然后我们就初步保存了南京地铁微博中发布的客流数据。

Python爬取南京地铁微博发布客流数据并进行分析!

读取txt文件,整理好数据后存入sqlite3数据库

因为微博是工作人员发布的,存在一些文本格式上的问题,还有表述上的区别,所以首先处理这些异常。这里面有很多坑,慢慢踩~

然后根据日期换算为实际的日期,以日期为唯一索引,将当日的所有客流数据存入sqlite3中。


def getdate(date1):

global year1

if date1.find('月') != -1:

date1=date1.replace('月',';')

date1=date1.replace('日',';')

list2=date1.split(';')

if '1' == list2[0] and '2' == list2[1]:

year1=year1-1

date2=str(year1)+'-'+list2[0]+'-'+list2[1]

else:

date2=str(year1)+'-'+list2[0]+'-'+list2[1]

date3 = datetime.datetime.strptime(date2,'%Y-%m-%d').date()

return date3



create_table_sql = '''CREATE TABLE `NajingMetro` (

`DATE` varchar(20) NOT NULL,

`LineALL` REAL(20) DEFAULT NULL,

`Line1` REAL(20) DEFAULT NULL,

`Line2` REAL(20) DEFAULT NULL,

`Line3` REAL(20) DEFAULT NULL,

`Line4` REAL(20) DEFAULT NULL,

`Line10` REAL(20) DEFAULT NULL,

`LineS1` REAL(20) DEFAULT NULL,

`LineS3` REAL(20) DEFAULT NULL,

`LineS7` REAL(20) DEFAULT NULL,

`LineS8` REAL(20) DEFAULT NULL,

`LineS9` REAL(20) DEFAULT NULL,

PRIMARY KEY (`DATE`)

)'''


然后就得到较为完整的数据了:

Python爬取南京地铁微博发布客流数据并进行分析!

读取数据库,绘图

使用SQL语句,从数据库中读入我们的数据,将数据转换成为List,使用pyechart进行绘图,然后取最近30天的数据,绘制饼图。

结果分析

Python爬取南京地铁微博发布客流数据并进行分析!

Python爬取南京地铁微博发布客流数据并进行分析!

Python爬取南京地铁微博发布客流数据并进行分析!

我们可以发现一个有趣的现象:周一到周五的客流要比周六周日多。

此外,2018年十一假期,选择9月30日出行的最多。



Python爬取南京地铁微博发布客流数据并进行分析!

一年的极小值出现在过年的时候,整体客流都比较少。


Python爬取南京地铁微博发布客流数据并进行分析!

上图为各线路占比(取数据中最近30天客流)。结合上面的数据,其实还发现一点,就是平时二号线人数略微多于三号线人数,但是节假日三号线人数会反超,这时因为三号线上有南京站、南京南站两个车站。

Python爬取南京地铁微博发布客流数据并进行分析!

整体的客流趋势是在上升的。

猜你喜欢

转载自blog.csdn.net/qq_42156420/article/details/86488646