前段时间看到很多微信公众号在转发一篇爬取mobike单车的信息,也不知道什么原因,在网上搜索了下很少有人在爬取ofo共享单车的数据,所以决定看看可以爬取ofo共享单车的那些数据。

  抓取数据开始的时候,分析了下可以通过几个渠道看到ofo共享单车的数据,主要是通过ofo公众号,ofo APP、ofo微信小程序 三个渠道可以获取数据,一般情况下手机配置代理以后,APP会出现无法联网的情况,导致无法获取数据;由于之前微信公众号可以在浏览器打开,抓取过程比较的容易,所以我比较倾向通过微信公众号进入获取共享单车数据;

 在整个爬取的过程中使用到比较关键的工具fiddler,辅助我们来抓取一些接口地址,这里我共享下ofo网页登陆的入口地址,大家可以通过这个地址登陆ofo来抓取附近单车信息,登陆地址:https://common.ofo.so/newdist/?Login&~next=%22%22。从登陆到开始到获取附近的单车,分析了一下对我们比较有用的几个接口:

  1.登陆接口,获取token信息

    https://san.ofo.so/ofo/Api/login

  2.获取图片验证码接口

    https://base.api.ofo.com/ofo/Api/v4/getCaptchaCode

  3.获取短信验证码接口

    https://base.api.ofo.com/ofo/Api/v4/getVerifyCode

  4.获取附近单车的接口

    https://san.ofo.so/ofo/Api/nearbyofoCar

一、探索单车接口,获取单车数据

  1.首先我们来模拟下实际的操作过程,主要三大步:获取图片验证码,获取短信验证码,获取附近单车。

  

  2.根据上诉步骤我们逆向的来看下获取附近单车数据需要那些那些请求数据,主要的请求参数主要需要token、经度、纬度

  3.经度和纬度属于位子信息,token 属于认证信息,所以我们需要看看如何获取token;

  4.登录成功以后需要返回token,但是登录需要手机号、图片验证码、手机短信验证码来登录获取token,整个过程分析清楚,分析的时候我们是逆向分析,但是我们实现的时候需要正向一步一步,我们下面来写一下代码实现整个过程。

  

# -*- coding: utf-8 -*-
# @Time : 2017/10/20 16:33
# @Author : Hunk
# @Email : qiang.liu@ikooo.cn
# @File : getToken.py.py
# @Software:
import json
import requests def get_captcha_code():
"""
获取图片验证码base64位加密数据
:return : captcha,verifyId
"""
url = 'http://base.api.ofo.com/ofo/Api/v4/getCaptchaCode' # 图片验证码获取地址
headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, '
'like Gecko) Mobile/14E304 MicroMessenger/6.5.7 NetType/WIFI Language/zh_CN'}
CaptchaCode = requests.post(url, headers=headers, verify=False).text
return json.loads(CaptchaCode)['values'] def code_picture_convert_string(appCode, query, base64Picture): # appCode 接口的认证key,query 验证码类型
"""通过第三方结果获取验证码
:param appCode: 认证ID
:param query: 验证码类型
:param base64Picture: base64 加密的地址
"""
header = {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', # 根据API的要求,定义相对应的Content-Type
"Authorization": "APPCODE " + appCode
}
url = 'http://jisuyzmsb.market.alicloudapi.com/captcha/recognize' # 调用地址
bodys = {'type': query, 'pic': base64Picture} # 请求参数
resultCode = json.loads(requests.post(url, headers=header, data=bodys).text)
return resultCode['result']['code'] def get_verify_code(tel, captcha, verifyId):
"""
获取短信验证码
:param tel: 手机号
:param captcha 图片验证码
:param verifyId: 校验ID
:return: 返回短信验证码
""" url = 'http://base.api.ofo.com/ofo/Api/v4/getVerifyCode' # 获取短信验证码获取地址
headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, '
'like Gecko) Mobile/14E304 MicroMessenger/6.5.7 NetType/WIFI Language/zh_CN'}
parameter = {
"tel": tel,
"captcha": captcha,
"verifyId": verifyId }
VerifyCode = requests.post(url, headers=headers, data=parameter, verify=False).text
return json.loads(VerifyCode)['msg'] def get_token(tel, code):
"""
获取登录时返回的token
:param tel: 手机号
:param code: 短信验证码
:return: token
"""
url = 'http://san.ofo.so/ofo/Api/login' # 获取token地址
headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, '
'like Gecko) Mobile/14E304 MicroMessenger/6.5.7 NetType/WIFI Language/zh_CN'}
parameter = {"tel": tel, "code": code}
token = requests.post(url, headers=headers, data=parameter, verify=False).text
return json.loads(token)["values"]["token"]

根据上述的代码获取到了token(da37bc80-02ed-11e7-a5c5-d3660a2fde97),这里获取验证码的时候需要通过手动的读取验证码,下面我们来获取下附近单车

# -*- coding: utf-8 -*-
# @Time : 2017/10/19 16:09
# @Author : Hunk
# @Email : qiang.liu@ikooo.cn
# @File : ofoCrawler.py
# @Software: PyCharm import json
import requests def get_ofo_info(longitude, latitude):
url = 'https://san.ofo.so/ofo/Api/nearbyofoCar'
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, '
'like Gecko) Mobile/14E304 MicroMessenger/6.5.7 NetType/WIFI Language/zh_CN'
}
data = {
'token': 'DA37BC80-02ED-11E7-A5C5-D3660A2FDE97',
'lng': str(longitude), # 经度
'lat': str(latitude) # 纬度
}
result = requests.post(url, data=data, headers=headers, verify=False).text
return json.loads(result)['values']['info']['cars'] if __name__ == '__main__':
data = get_ofo_info(116.4360666275, 39.9310311788)
print(data)

看看我们获取到的数据,拿到的数据我们可以看到每辆单车的编号,目前的位子。

拿到这么多的数据,我们更希望利用数据做一些事情,所以下节介绍下对数据的思考,利用数据我们来分析下单车的运行轨迹。

本教程只提供学习

爬取ofo共享单车信息的更多相关文章

  1. 【nodejs 爬虫】使用 puppeteer 爬取链家房价信息

    使用 puppeteer 爬取链家房价信息 目录 使用 puppeteer 爬取链家房价信息 页面结构 爬虫库 pupeteer 库 实现 打开待爬页面 遍历区级页面 方法一 方法二 遍历街道页面 遍 ...

  2. 关于小黄车(ofo共享单车)使用的问题

    小黄车即ofo共享单车,号称是全球创立最早.成长最快.规模最大的无桩共享单车创业公司,缔造了"共享单车"概念,致力于解决城市出行问题.它的出现给大家带来了方便,作为一个商业运行的公 ...

  3. Node.js爬虫-爬取慕课网课程信息

    第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...

  4. [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...

  5. Selenium+Chrome/phantomJS模拟浏览器爬取淘宝商品信息

    #使用selenium+Carome/phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏 ...

  6. 利用 Scrapy 爬取知乎用户信息

    思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. 一 ...

  7. 利用Selenium爬取淘宝商品信息

    一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一 ...

  8. python3编写网络爬虫16-使用selenium 爬取淘宝商品信息

    一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...

  9. 使用python scrapy爬取知乎提问信息

    前文介绍了python的scrapy爬虫框架和登录知乎的方法. 这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中. 首先,看一下我要爬取哪些内容: 如下图所示,我要爬取一个问题的6个信息: ...

随机推荐

  1. Flask源码阅读-第三篇(flask\_compat.py)

    源码 # -*- coding: utf-8 -*-""" flask._compat ~~~~~~~~~~~~~ Some py2/py3 compatibility ...

  2. Python 区分方法和函数

    def func(): print("我是函数") class Foo: def chi(self): print("我是吃") # print(func) # ...

  3. 2D转换下的zoom和transform:scale的区别

    一.什么是zoom 在我们做项目和查看别人的网页的时候总会在一些元素的样式里,看到有一个家伙孤零零的待在那里,它到底是谁呢? 它的名字叫zoom,zoom的意思是“变焦”,虽然在摄影的领域经常被提到, ...

  4. NEO VM原理及其实现(转载)

    NEO Vm原理及其实现 简介及与evm主要区别 neo vm和evm类似.底层都实现了一套opcode以及对应的执行器,opcode设计差距蛮大的,总体上来说evm的更加简洁,neo vm的功能更加 ...

  5. 20165228 2017-2018-2 《Java程序设计》第7周学习总结

    20165228 2017-2018-2 <Java程序设计>第7周学习总结 教材学习内容总结 MySQL数据库管理系统安装和初始化 使用MySQL建立连接和数据库.表 使用JDBC:(1 ...

  6. 百练6376-二维数组右上左下遍历-2015正式C题

    C:二维数组右上左下遍历 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺 ...

  7. [LeetCode&Python] Problem 860. Lemonade Change

    At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...

  8. Bi-shoe and Phi-shoe

    欧拉函数中的性质 Φ(p)=p-1,p为素数.所以这个题算是贪心+数论吧.每个Φ(p)=p-1:只要从p开始,找素数,那么一定有Φ(k)>=p-1;只有当p=k时,等号成立. #include ...

  9. xdoj 1237 (贪心+逆向思维)

    提示:  当有的元素分裂的同时,其他元素也可以+1 分析: 逆向思维,把当前数列变成一个0: 相应得操作相反: 每个元素减1 相同得两个元素可以合并 设数列中最大的数是max,则一共需要减max次才可 ...

  10. hdoj-4417(做法二 树状数组离线解法,对所有的查询先保存进行排序后有序的查询) 好腻害!

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std;; ; str ...