我是怎样爬下6万共享单车数据并进行分析的(附代码)

本文讲述了作者如何通过抓取摩拜单车的API数据,分析共享单车的使用情况。作者发现摩拜单车GPS数据存在异常跳动,后通过微信小程序找到稳定数据源。分析数据显示,约三成单车未移动,多数行程在3公里以下,骑行5次以下的单车占比较高,揭示了共享单车的使用特点和潜在问题。
摘要由CSDN通过智能技术生成

共享经济的浪潮席卷着各行各业,而出行行业是这股大潮中的主要分支。如今,在城市中随处可见共享单车的身影,给人们的生活出行带来了便利。相信大家总会遇到这样的窘境,在APP中能看到很多单车,但走到那里的时候,才发现车并不在那里。有些车不知道藏到了哪里;有些车或许是在高楼的后面,由于有GPS的误差而找不到了;有些车被放到了小区里面,一墙之隔让骑车人无法获得到车。


那么有没有一个办法通过获得这些单车的数据,来分析这些车是否变成了僵尸车?是否有人故意放到小区里面让人无法获取呢?带着这些问题,笔者开始了研究如何获取这些数据。



01 从哪里获得数据


如果你能够看到数据,那么我们总有办法自动化的获取到这些数据。只不过获取数据的方式方法决定了获取数据的效率。


对于摩拜单车的数据分析这个任务而言,这个爬虫要能够在短时间内(通常是10分钟左右)获取到更多的数据,对于数据分析才有用处。那么数据来源于哪里?


最直接的来源是摩拜单车的APP。现代的软件设计都讲究前后端分离,而且服务端会同时服务于APP、网页等。在这种趋势下我们只需要搞清楚软件的HTTP请求就好了。一般而言有以下一些工具可以帮忙:


直接抓包:

  • Wireshark (在路由器或者电脑)

  • Shark for Root (Android)


用代理进行HTTP请求抓包及调试:

  • Fiddler 4

  • Charles

  • Packet Capture (Android)


由于我的手机没有root,在路由器上抓包又太多的干扰,对于https也不好弄。所以只能首先采用Fiddler或者Charles的方式试试。


挂上Fiddler的代理,然后在手机端不停的移动位置,看有没有新的请求。但遗憾的是似乎请求都是去拿高德地图的,并没有和摩拜车相关的数据。


那怎么一回事?试试手机端的。换成Packet Capture后果然就有流量了,在请求中找到了我最关心的那个:


这个API请求一看就很显然了,在postman中试了一下能够正确的返回信息,看来就是你了!


高兴得太早。


连续爬了几天的数据,将数据进行一分析,发现摩拜单车的GPS似乎一直在跳动,有时候跳动会超过几公里的距离,显然不是一个正常的值。


难道是他们的接口做了手脚返回的是假数据?我观察到即便在APP中,单车返回的数据也有跳动。有某一天凌晨到第二天早上,我隔段时间刷新一下我家附近的车,看看是否真的如此。


图片我找不到了,但是观察后得出的结论是,APP中返回的位置确实有问题。有一台车放在一个很偏僻的位置,一会儿就不见了,待会儿又回来了,和我抓下来的数据吻合。


而且这个跳动和手机、手机号、甚至移动运营商没有关系,说明这个跳动是摩拜接口的问题,也可以从另一方面解释为什么有时候看到车但其实那里没有车。


这是之前发的一个朋友圈的视频截图,可以看到在营门口附近有一个尖,在那里其实车是停住的,但是GPS轨迹显示短时间内在附近攒动,甚至攒动到很远,又回到那个位置。


这样的数据对于数据分析来讲根本没法用,我差点就放弃了。


随着微信小程序的火爆,摩拜单车也在第一时间出了小程序。我一看就笑了,不错,又给我来了一个数据源,试试。


用Packet Capture抓了一次数据后很容易确定API。抓取后爬取了两三天的数据,发现出现了转机,数据符合正常的单车的轨迹。


剩下事情,就是提高爬虫的效率了。



02 其他尝试


有时候直接分析APP的源代码会很方便的找到API入口,将摩拜的Android端的APP进行反编译,但发现里面除了一些资源文件有用外,其他的文件都是用奇虎360的混淆器加壳的。网上有文章分析如何进行脱壳,但我没有太多时间去钻研,也就算了。


摩拜单车的API之所以很容易抓取和分析,很大程度上来讲是由于API设计的太简陋:


  • 仅使用http请求,使得很容易进行抓包分析

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
当然可以!下面是一个简单的Python共享单车数据分析及预测的代码示例,我们可以使用Pandas和Scikit-Learn库来实现。 首先,我们需要导入必要的库: ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score ``` 然后,我们加载我们要分析共享单车数据集。在这个示例中,我们使用的是UCI机器学习库中的Bike Sharing Dataset。 ```python url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00275/Bike-Sharing-Dataset.zip' zipfile = 'Bike-Sharing-Dataset.zip' csvfile = 'hour.csv' # 下载并解压数据集 import urllib.request import zipfile urllib.request.urlretrieve(url, zipfile) with zipfile.ZipFile(zipfile, 'r') as zip_ref: zip_ref.extractall() # 加载数据集 data = pd.read_csv(csvfile) ``` 接下来,我们对数据进行一些预处理。在这个示例中,我们选择了一些特征进行分析,并将它们转换为数值类型。 ```python # 选择特征 features = ['season', 'holiday', 'workingday', 'weathersit', 'temp', 'atemp', 'hum', 'windspeed'] # 将特征转换为数值类型 for feature in features: data[feature] = pd.to_numeric(data[feature], errors='coerce') ``` 然后,我们将数据集划分为训练集和测试集。 ```python # 划分数据集 X = data[features] y = data['cnt'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) ``` 接下来,我们使用线性回归模型进行预测。 ```python # 训练模型 model = LinearRegression() model.fit(X_train, y_train) # 预测数据 y_pred = model.predict(X_test) # 计算误差 mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print('Mean squared error: %.2f' % mse) print('Coefficient of determination: %.2f' % r2) ``` 最后,我们可以输出模型的预测结果,并可视化预测结果与测试集数据的比较。 ```python # 输出预测结果 predictions = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred}) print(predictions) # 可视化预测结果 import matplotlib.pyplot as plt plt.scatter(y_test, y_pred) plt.xlabel('Actual') plt.ylabel('Predicted') plt.show() ``` 以上就是一个简单的Python共享单车数据分析及预测的代码示例。当然,这只是一个基础的模板,你可以根据实际需求进行修改和优化。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值