前段时间看到很多微信公众号在转发一篇爬取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. L248 词汇题 2006

    The audience, hostile at first, were greatly impressed by her excellent performance. He wanted to st ...

  2. Oracle create tablespace 、create user and so on

    1.创建临时表空间 CREATE TEMPORARY TABLESPACE test_tempTEMPFILE 'C:\oracle\product\10.1.0\oradata\orcl\test_ ...

  3. 2019-03-21-day016-正则表达式

    昨日内容回顾 基本数据类型 编码 流程控制 文件操作 函数-内置函数 装饰器 常用模块: 序列化模块 随机数模块 os模块 sys模块 时间模块 hashlib collections re 1天半 ...

  4. SpringMvc使用FastJson做为json的转换器(注解方式)

    在使用XML方式配置项目,使用fastjson做为Json转换器时通常的在XML内添加如下的配置: <mvc:message-converters register-defaults=" ...

  5. VS2017调试代码显示“当前无法命中断点,还没有为该文档加载任何符号”

    VS2017升级之后,代码调试无法进入,显示“当前无法命中断点,还没有为该文档加载任何符号”的问题解决思路: 1.工具-选项-项目和解决方案-生成并运行,取消勾选“在运行时仅生成启动项目和依赖性” 2 ...

  6. [转]linux C/C++服务器后台开发面试题总结

    linux C/C++服务器后台开发面试题总结  https://www.cnblogs.com/nancymake/p/6516933.html 一.编程语言 1.根据熟悉的语言,谈谈两种语言的区别 ...

  7. 大数据-01-安装Hadoop

    环境 服务器:ubuntu-16.04.3-desktop-amd64.iso 创建hadoop用户 sudo useradd -m hadoop -s /bin/bash 本文中会大量使用到sudo ...

  8. vue查缺补漏题

    一.对于MVVM的理解? MVVM 是 Model-View-ViewModel 的缩写.Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑.View 代表UI 组件,它负责将数 ...

  9. tomcat部署成https协议

    1 生成密匙:进入jdk的bin目录后输入: keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keysto ...

  10. Linux Distribution 分支

    https://distrowatch.com/ DistroWatch是一个包含了各种Linux发行版及其他自由/开放源代码的类Unix操作系统的新闻.人气排名.以及其他一般信息等的网站.它包含了数 ...