Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【数说】用python爬下6万共享单车数据,谈谈单车热潮中的城市

【数说】用python爬下6万共享单车数据,谈谈单车热潮中的城市

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

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

从哪里获得数据

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

对于摩拜单车的数据分析这个任务而言,这个爬虫要能够在短时间内(通常是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。抓取后爬取了两三天的数据,发现出现了转机,数据符合正常的单车的轨迹。

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

其他尝试

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

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

  • 仅使用http请求,使得很容易进行抓包分析
  • 在这些API中都没有对request进行一些加密,使得自己的服务很容易被人利用。
  • 另外微信小程序也是泄露API的一个重要来源,毕竟在APP中request请求可以通过native代码进行加密然后在发出,但在小程序中似乎还没有这样的功能。

如果大家有兴趣,可以试着看一下小蓝单车APP的request,他们使用https请求,对数据的request进行了加密,要抓取到他们的数据难度会增加非常多。

当然了,如果摩拜单车官方并不care数据的事情的话,这样的API设计也是ok的。

声明:

此爬虫仅用于学习、研究用途,请不要用于非法用途。任何由此引发的法律纠纷自行负责。 没耐心看文章的请直接:公众号菜单栏回复“摩拜”获取完整源码

目录结构

\analysis - jupyter做数据分析 \influx-importer - 导入到influxdb,但之前没怎么弄好 \modules - 代理模块 \web - 实时图形化显示模块,当时只是为了学一下react而已,效果请见这里 crawler.py - 爬虫核心代码 importToDb.py - 导入到postgres数据库中进行分析 sql.sql - 创建表的sql start.sh - 持续运行的脚本

思路

核心代码放在crawler.py中,数据首先存储在sqlite3数据库中,然后去重复后导出到csv文件中以节约空间。 摩拜单车的API返回的是一个正方形区域中的单车,我只要按照一块一块的区域移动就能抓取到整个大区域的数据。 left,top,right,bottom定义了抓取的范围,目前是成都市绕城高速之内以及南至南湖的正方形区域。offset定义了抓取的间隔,现在以0.002为基准,在DigitalOcean 5$的服务器上能够15分钟内抓取一次。 def start(self): left = 30.7828453209 top = 103.9213455517 right = 30.4781772402 bottom = 104.2178123382 offset = 0.002 if os.path.isfile(self.db_name): os.remove(self.db_name) try: with sqlite3.connect(self.db_name) as c: c.execute('''CREATE TABLE mobike (Time DATETIME, bikeIds VARCHAR(12), bikeType TINYINT,distId INTEGER,distNum TINYINT, type TINYINT, x DOUBLE, y DOUBLE)''') except Exception as ex: pass 然后就启动了250个线程,至于你要问我为什么没有用协程,哼哼~~我当时没学~~~其实是可以的,说不定效率更高。 由于抓取后需要对数据进行去重,以便消除小正方形区域之间重复的部分,最后的group_data正是做这个事情。 executor = ThreadPoolExecutor(max_workers=250) print("Start") self.total = 0 lat_range = np.arange(left, right, -offset) for lat in lat_range: lon_range = np.arange(top, bottom, offset) for lon in lon_range: self.total += 1 executor.submit(self.get_nearby_bikes, (lat, lon)) executor.shutdown() self.group_data() 最核心的API代码在这里。小程序的API接口,搞几个变量就可以了,十分简单。 def get_nearby_bikes(self, args): try: url = "https://mwx.mobike.com/mobike-api/rent/nearbyBikesInfo.do" payload = "latitude=%s&longitude=%s&errMsg=getMapCenterLocation" % (args[0], args[1]) headers = { 'charset': "utf-8", 'platform': "4", "referer":"https://servicewechat.com/wx40f112341ae33edb/1/", 'content-type': "application/x-www-form-urlencoded", 'user-agent': "MicroMessenger/6.5.4.1000 NetType/WIFI Language/zh_CN", 'host': "mwx.mobike.com", 'connection': "Keep-Alive", 'accept-encoding': "gzip", 'cache-control': "no-cache" } self.request(headers, payload, args, url) except Exception as ex: print(ex) 最后你可能要问频繁的抓取IP没有被封么?其实摩拜单车是有IP的访问速度限制的,只不过破解之道非常简单,就是用大量的代理。 我是有一个代理池,每天基本上有8000以上的代理。在ProxyProvider中直接获取到这个代理池然后提供一个pick函数用于随机选取得分前50的代理。

请注意,我的代理池是每小时更新的,但是代码中提供的jsonblob的代理列表仅仅是一个样例,过段时间后应该大部分都作废了。 在这里用到一个代理得分的机制。我并不是直接随机选择代理,而是将代理按照得分高低进行排序。每一次成功的请求将加分,而出错的请求将减分。

这样一会儿就能选出速度、质量最佳的代理。如果有需要还可以存下来下次继续用。 class ProxyProvider: def __init__(self, min_proxies=200): self._bad_proxies = {} self._minProxies = min_proxies self.lock = threading.RLock() self.get_list() def get_list(self): logger.debug("Getting proxy list") r = requests.get("https://jsonblob.com/31bf2dc8-00e6-11e7-a0ba-e39b7fdbe78b", timeout=10) proxies = ujson.decode(r.text) logger.debug("Got %s proxies", len(proxies)) self._proxies = list(map(lambda p: Proxy(p), proxies)) def pick(self): with self.lock: self._proxies.sort(key = lambda p: p.score, reverse=True) proxy_len = len(self._proxies) max_range = 50 if proxy_len > 50 else proxy_len proxy = self._proxies[random.randrange(1, max_range)] proxy.used() return proxy 在实际使用中,通过proxyProvider.pick()选择代理,然后使用。如果代理出现任何问题,则直接用proxy.fatal_error()降低评分,这样后续就不会选择到这个代理了。 def request(self, headers, payload, args, url): while True: proxy = self.proxyProvider.pick() try: response = requests.request( "POST", url, data=payload, headers=headers, proxies={"https": proxy.url}, timeout=5,verify=False ) with self.lock: with sqlite3.connect(self.db_name) as c: try: print(response.text) decoded = ujson.decode(response.text)['object'] self.done += 1 for x in decoded: c.execute("INSERT INTO mobike VALUES (%d,'%s',%d,%d,%s,%s,%f,%f)" % ( int(time.time()) * 1000, x['bikeIds'], int(x['biketype']), int(x['distId']), x['distNum'], x['type'], x['distX'], x['distY'])) timespend = datetime.datetime.now() - self.start_time percent = self.done / self.total total = timespend / percent print(args, self.done, percent * 100, self.done / timespend.total_seconds() * 60, total, total - timespend) except Exception as ex: print(ex) break except Exception as ex: proxy.fatal_error()

抓取了摩拜单车的数据并进行了大数据分析。以下数据分析自1月19日整日的数据,范围成都绕城区域以及至华阳附近(天府新区)内。成都的摩拜单车的整体情况如下:

标准、Lite车型数量相当

摩拜单车在成都大约已经有6万多辆车,两种类型的车分别占有率为55%和44%,可见更为好骑的Lite版本的占有率在提高。(1为标准车,2为Lite车型)

三成左右的车没有移动过

数据分析显示,有三成的单车并没有任何移动,这说明这些单车有可能被放在不可获取或者偏僻地方。市民的素质还有待提高啊。

出行距离以3公里以下为主

数据分析显示3公里以下的出行距离占据了87.2%,这也十分符合共享单车的定位。100米以下的距离也占据了大量的数据,但认为100米以下的数据为GPS的波动,所以予以排除。

出行距离分布

骑行次数以5次以下居多

单车的使用频率越高共享的效果越好。从摩拜单车的数据看,在流动的单车中,5次以下占据了60%左右的出行。但1次、2次的也占据了30%左右的份额,说明摩拜单车的利用率也不是很高。

单车骑行次数

单车骑行次数

从单车看城市发展

从摩拜单车的热图分布来看,成都已经逐步呈现“双核”发展的态势,城市的新中心天府新区正在聚集更多的人和机会。

双核发展

原来的老城区占有大量的单车,在老城区,热图显示在东城区占有更多的单车,可能和这里的商业(春熙路、太古里、万达)及人口密集的小区有直接的联系。

老城区

而在成都的南部天府新区越来越多也茁壮的发展起来,商业区域和住宅区域区分明显。在晚上,大量的单车聚集在华阳、世纪城、中和,而在上班时间,则大量聚集在软件园附近。

软件园夜间

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 钱塘大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
摩拜单车爬虫源码及解析
前两篇文章分析了我为什么抓取摩拜单车的接口以及数据分析的结果,这篇文章中讲直接提供可运行的源代码供学习。
贺思聪
2020/04/30
7590
共享单车爬虫演示代码
运行前请联系微信bcdata获取token,内置的token为演示用,单车位置是真实的,ID是随机的。
贺思聪
2020/04/30
9350
摩拜单车非官方大数据分析
趁着过年的清闲时光,我抓取了摩拜单车的数据并进行了大数据分析。以下数据分析自1月19日整日的数据,范围成都绕城区域以及至华阳附近(天府新区)内。成都的摩拜单车的整体情况如下:
贺思聪
2020/04/30
9690
摩拜单车非官方大数据分析
摩拜单车爬虫源码及解析
專 欄 ❈我是思聪,Python中文社区专栏作者 博客: http://www.jianshu.com/u/b1e713e56ea6❈ 为什么爬摩拜的数据 摩拜是最早进入成都的共享单车,每天我从地铁站下来的时候,在APP中能看到很多单车,但走到那里的时候,才发现车并不在那里。有些车不知道藏到了哪里;有些车或许是在高楼的后面,由于有GPS的误差而找不到了;有些车被放到了小区里面,一墙之隔让骑车人无法获得到车。 那么有没有一个办法通过获得这些单车的数据,来分析这些车是否变成了僵尸车?是否有人故意放到小区里面
Python中文社区
2018/01/31
1.3K0
摩拜单车爬虫源码及解析
摩拜单车爬虫解析——找到API
在上一篇文章《摩拜单车非官方大数据分析》中提到了我在春节期间对摩拜单车的数据分析,在后面的系列文章中我将进一步的阐述我的爬虫是如何高效的爬到这些数据的。
贺思聪
2020/04/30
6570
摩拜单车爬虫解析——找到API
摩拜单车数据爬虫
之前摩拜单车服务器对请求频率作出限制,必须使用代理服务器,躲避IP限制。不过似乎近期服务器在切换为OpenResty后不再限制请求频率。我搜集了几w个开放代理,存放在proxies.txt中,开放代理并不能保证一直有效,需要使用check_proxy.py筛选出可用的代理。服务器已经全面切换为HTTPS,能支持HTTPS的代理不多。
机器学习AI算法工程
2019/10/28
9080
摩拜单车数据爬虫
抓取手机app的数据(摩拜单车)
前几天有人私信我,问能不能帮忙抓取摩拜单车的数据。。。 我想着授人以鱼不如授人以渔,所以本次我们就讲讲如何抓取手机app的内容吧  Fiddle的安装及配置 抓手机包我用的是fiddle。 安装 先在
爬虫
2018/04/08
1.9K0
抓取手机app的数据(摩拜单车)
深圳市共享单车数据分析、热力图展示【文末附共享单车数据集清单】
目前最新的共享单车公开数据可能只有深圳市政府数据开放平台[1]发布的共享单车企业每日订单表了,数据量包含2017-04-03到2021-08-30的 2.4 亿条数据,总计约 24G 大小:
renhai
2023/11/24
1.5K0
深圳市共享单车数据分析、热力图展示【文末附共享单车数据集清单】
抓取摩拜单车分布数据做区域价值分析
由于接的营销项目已经接近尾声, 终于有时间继续写点东西了。 之前写了几篇关于数据分析的文章,就有不少朋友问我怎么突然从营销改玩数据了?这其实是误解吧,营销和数据从来就不应该分家,营销需要数据来做研究、分析,也需要数据来考核、修正。关于两者合作产生的巨大化学反应,可以看看数据冰山大神的文章: 吉普自由之光:销量提升之道 就在刚刚,我在看亚洲微软研究院的关于用共享单车数据做城市规划的文章,很受启发。仅就单区域而言,已经分布着膜拜、ofo、永安行旗下的5-7种单车,共享单车的数据样本确实足够巨大,反应的是人口
沉默的白面书生
2018/05/07
1.4K0
抓取摩拜单车分布数据做区域价值分析
用 Charles 玩转微信小程序:抓取摩拜、OFO以及车来了数据
企鹅号小编
2017/12/26
6.2K1
用 Charles 玩转微信小程序:抓取摩拜、OFO以及车来了数据
人口、共享单车与地铁数据下载网站整理
  本次我们继续GIS数据获取的整理,今日主题为人口、共享单车与地铁数据。人口是很多GIS应用领域都会用到的数据之一,无论是人口密度、人口数量还是人口流动,都具有着很大的应用前景;而共享单车、地铁数据同样也是城市研究中的重要数据。
疯狂学习GIS
2021/07/22
1.8K0
爬取北京摩拜单车信息(附分析过程和详细代码)
去年11月份可以在微信中抓取摩拜的小程序,但是现在不行了。当时微信小程序的API很简陋,利用代理可以直接抓取。但是现在试下挂上代理小程序都打不开了。
Yano_nankai
2018/10/08
2.5K4
爬取北京摩拜单车信息(附分析过程和详细代码)
小心!我正在偷窥你的运营
首先,问一个很简单的问题考考你——在上海,摩拜单车出行的高峰时段是什么?这个问题相对比较容易回答,根据普通人上下班的时段应该是早上七八点左右,下午六七点左右。恭喜,你答对了。
贺思聪
2020/04/30
6330
小心!我正在偷窥你的运营
TiDB 在摩拜单车在线数据业务的应用和实践
PingCAP
2017/12/26
1.3K0
心路历程:爬虫实战——从数据到产品
经过近一年的辛苦创作、编辑、等待,本书终于出版了。这种感觉有点像是十月怀胎,但没有生育时候的痛苦,只有最后得到的欣喜。现在回忆起去年接到写书的邀请,然后到纠结,再到刚开始痛苦的写作,以及最后成稿后的释然,一切都觉得是一场人生的经历。我倒是认为写书的目的不是为了赚钱,写一本书给自己,总结自己的过往,将经验传播给他人,就可以了。
贺思聪
2020/05/08
6440
心路历程:爬虫实战——从数据到产品
再融资6亿美元后,摩拜为什么越来越不像共享单车企业了?
核心观点:摩拜单车融资6亿美元打破行业记录,然而却无意与友商缠斗,而是谋划移动物联网。 共享单车掀起的街头大战还在被源源不断地补充弹药,今天,摩拜单车宣布完成6亿美元E轮融资,这一数字创下共享单车行业诞生以来的单笔融资最高纪录,融资记录不断被打破,街头火药味也越来越浓,然而摩拜本轮融资或许与竞争没有太大关系。 相对于可被不断刷新的融资金额而言,腾讯连续三轮重仓押宝摩拜单车是这轮融资的最大看点。摩拜单车E轮融资领投方为腾讯,新引入交银国际、工银国际、Farallon Capital等新的战略投资人;TPG、红
罗超频道
2018/04/16
6720
再融资6亿美元后,摩拜为什么越来越不像共享单车企业了?
python爬取百度新闻:分析共享单车火爆背后有哪些规则?
从12月份起,“共享单车”作为新生事物开始大量进入人们的视野,并且越来越多的上班族愿意接受、尝试。 本文将教与大家利用python爬虫抓取新闻页面,从媒体反映角度去了解,“共享单车”为何有井喷式发展,
机器学习AI算法工程
2018/03/14
1.7K0
python爬取百度新闻:分析共享单车火爆背后有哪些规则?
教你用300万共享单车出行数据,预测骑行目的地 !(附源码)
来源:大数据挖掘DT数据分析 本文长度为1647字,建议阅读3分钟 本文为你介绍使用出行记录数据和源码预测摩拜出行目的地的方法。 摩拜单车在北京的单车投放量已经超过40万。用户可以直接在人行道上找到停放的单车,用手机解锁,然后骑到目的地后再把单车停好并锁上。因此,为了更好地调配和管理这40万辆单车,需要准确地预测每个用户的骑行目的地。 标注数据中包含300万条出行记录数据,覆盖超过30万用户和40万摩拜单车。数据包括骑行起始时间和地点、车辆ID、车辆类型和用户ID等信息。参赛选手需要预测骑行目的地的区块
数据派THU
2018/01/30
1.7K0
教你用300万共享单车出行数据,预测骑行目的地 !(附源码)
共享单车技术含量,一篇文章全说透了!
企鹅号小编
2018/01/08
1.9K0
共享单车技术含量,一篇文章全说透了!
深圳共享单车出行研究报告
深圳作为中国经济发展的前沿城市,其共享单车市场的发展历程引人注目。自2016年初共享单车首次在深圳亮相以来,迅速成为城市交通的一个重要组成部分。2017年是共享单车在深圳爆发式增长的高峰期,当时日均使用量达到了517.3万人次,全市共享单车总量接近90万辆 (读特)。
renhai
2024/06/06
8210
深圳共享单车出行研究报告
推荐阅读
相关推荐
摩拜单车爬虫源码及解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档