日志

爬取ofo共享单车信息

 来源    2017-10-20    139  

  前段时间看到很多微信公众号在转发一篇爬取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共享单车(Swift版) – OFO
日志OFO介绍 该项目仿写网上OFO和完善部分功能 目前Pod管理的第三方插件 # Uncomment the next line to define a global platform for your ...
1
React Native 仿ofo共享单车App – react-native-ofo
日志一.前言 并没有实现 ofo 所有功能,只完成了主要的界面和逻辑,感觉其中也就[ 地图 ]和[ 扫码 ]两个比较核心的功能还需要花点时间以外,其他的就都比较简单了,而且由于没有API,模拟数据也没啥意 ...
2
xpath案例 爬取58出租房源信息&解析下载图片数据&乱码问题
日志58二手房解析房源名称 from lxml import etree import requests url = 'https://haikou.58.com/chuzu/j2/' headers = ...
3
python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化
日志实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...
2
爬取分析拉勾网招聘信息
日志爱写bug(ID:icodebugs) 作者:爱写bug 前言: ​ 看了很多网站,只发现获取拉勾网招聘信息是只用post方式就可以得到,应当是非常简单了.推荐刚接触数据分析和爬虫的朋友试一下. 在p ...
2
[python爬虫] Selenium定向爬取PubMed生物医学摘要信息
日志        本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎 ...
2
爬取微博用户公开信息,分析为周杰伦打榜的夕阳红老年团,告诉你他们真实年龄!
日志前段时间为“周杰伦打榜”话题迅速登上微博热搜榜因为cxk的粉丝们质疑周杰伦微博没有数据(周杰伦没有开通微博)于是,无数隐匿江湖多年看不下去的周杰伦老年粉开始被迫营业于是一场周杰伦中老年粉VS蔡徐坤铁军 ...
1
21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)
日志6.1.爬取第一页的职位信息 第一页职位信息 from selenium import webdriver from lxml import etree import re import time c ...
1
python爬虫爬取ip记录网站信息并存入数据库
日志import requests import re import pymysql #10页 仔细观察路由 db = pymysql.connect("localhost",&quo ...
3
Scrapy实战篇(五)爬取京东商城文胸信息
日志创建scrapy项目 scrapy startproject jingdong 填充 item.py文件 在这里定义想要存储的字段信息 import scrapy class JingdongItem ...
1
Python3爬取豆瓣网电影信息
日志# -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前250的电影的名称 Language: Python3.6 & ...
1
Scrapy爬取知乎用户信息
日志创建项目scrapy startproject zhihuuser scrapy genspider zhihu zhihu.com items.py from scrapy import Item, ...
2
CrawlSpider爬取腾讯招聘信息
日志CrawlSpider不在手动处理url,它会自动匹配到响应文件里的所有符合匹配规则的链接. 创建项目scrapy startproject TencentSpider items.py import ...
1
scrapy爬取腾讯招聘信息
日志创建项目scrapy startproject tencent 编写items.py写class TencentItem import scrapy class TencentItem(scrapy. ...
1
PyCharm+Scrapy爬取安居客楼盘信息
日志一.说明 1.1 开发环境说明 开发环境--PyCharm 爬虫框架--Scrapy 开发语言--Python 3.6 安装第三方库--Scrapy.pymysql.matplotlib 数据库--M ...
1
利用 Scrapy 爬取知乎用户信息
日志思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. 一 ...
1
使用scrapy框架爬取全书网书籍信息。
日志爬取的内容:书籍名称,作者名称,书籍简介,全书网5041页,写入mysql数据库和.txt文件 1,创建scrapy项目 scrapy startproject numberone 2,创建爬虫主程序 ...
2
利用Selenium爬取淘宝商品信息
日志一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一 ...
1
使用requests、BeautifulSoup、线程池爬取艺龙酒店信息并保存到Excel中
日志import requests import time, random, csv from fake_useragent import UserAgent from bs4 import Beauti ...
3