之前在网上看到了分析北京地铁客流数据的开源项目,就想试着分析一下南京地铁的客流数据,可是找了很久没有找到可以获得南京地铁客流数据的接口,就去南京地铁微博看了一下,果然跟北京地铁一样,基本上每天都会更新客流数据。所以开始动手~
神仙编程,Python爬取南京地铁微博发布客流数据并进行分析! 神仙编程,Python爬取南京地铁微博发布客流数据并进行分析!爬南京地铁微博,获取有用的数据并保存成txt文件
首先,百度搜一下Python爬新浪微博内容的框架,有很多很多,我们选择一个,随便改改,发现可以用啦:
<pre class="ql-align-justify" style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">南京地铁微博ID:2638276292
</pre>
根据下面的条件进行初步的筛选,基本上可以找到对应的微博。
<pre class="ql-align-justify" style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">weibocontentindex=str(text).find("南京地铁")
weibocontentindex2=str(text).find("客运")
if weibocontentindex > -1 and weibocontentindex2 > -1:
fh.write(text[weibocontentindex-1:]+'
')
</pre>
然后我们就初步保存了南京地铁微博中发布的客流数据。
神仙编程,Python爬取南京地铁微博发布客流数据并进行分析!读取txt文件,整理好数据后存入sqlite3数据库
因为微博是工作人员发布的,存在一些文本格式上的问题,还有表述上的区别,所以首先处理这些异常。这里面有很多坑,慢慢踩~
然后根据日期换算为实际的日期,以日期为唯一索引,将当日的所有客流数据存入sqlite3中。
<pre class="ql-align-justify" style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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
</pre>
<pre class="ql-align-justify" style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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
)
)'''
</pre>
然后就得到较为完整的数据了:
神仙编程,Python爬取南京地铁微博发布客流数据并进行分析!读取数据库,绘图
使用SQL语句,从数据库中读入我们的数据,将数据转换成为List,使用pyechart进行绘图,然后取最近30天的数据,绘制饼图。
结果分析
神仙编程,Python爬取南京地铁微博发布客流数据并进行分析! 神仙编程,Python爬取南京地铁微博发布客流数据并进行分析! 神仙编程,Python爬取南京地铁微博发布客流数据并进行分析!我们可以发现一个有趣的现象:周一到周五的客流要比周六周日多。
此外,2018年十一假期,选择9月30日出行的最多。
神仙编程,Python爬取南京地铁微博发布客流数据并进行分析!
一年的极小值出现在过年的时候,整体客流都比较少。
神仙编程,Python爬取南京地铁微博发布客流数据并进行分析!
上图为各线路占比(取数据中最近30天客流)。结合上面的数据,其实还发现一点,就是平时二号线人数略微多于三号线人数,但是节假日三号线人数会反超,这时因为三号线上有南京站、南京南站两个车站。
神仙编程,Python爬取南京地铁微博发布客流数据并进行分析!整体的客流趋势是在上升的。
整体项目代码与数据请移步github,麻烦给我点一个Star~,谢谢:
<pre class="ql-align-justify" style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">https://github.com/zhushuo1992/NanjingMetro</pre>
网友评论