1500元让我写一个api接口!没问题

一、简介

前几天接了一个小活,对彩票娱乐网站数据进行采集,最后做成api接口, 便于对方获取数据(接口返回json数据)。由于比较简单,很适合小白学习,半天时间(商谈需求到最后完成交接)。这里记录一下这个过程。

采集内容

比如这个“xx快3”,需要1.获取倒计时,最新和历史的:2.开奖期号、3.开奖号

这个彩票娱乐网站的彩种有八大类,每一个大类有不同的小类,比如下图中的“快3”大类,其中的小类有18个。

应对方的要求,对这八大类的(1分、3分、5分、10分这四小类)全部获取数据,并制做成接口,通过参数的不同可以获取不同大类的不同小类的数据。

八大类的小类

第一类:快3

第二类:时时彩

第三类:PK10

第四类:六合彩

第五类:11选5

第六类:快乐8

第七类:3D

第八类:排列3

以上就是这些红框中的就是需要采集的类别(表面上看着很多,我以为工作量很大,但是写好了第一个大类之后,发现后面的7个类都是一样,所以我把链接替换就可以了,解析的代码全部可以通用)

二、分析与编程

起初我以为可以通过获取网页,解析网页去定位标签获取数据,结果更新这个网站的数据是ajax异步交互,所以F12一按,查看数据包。

请求代码

这个是快3的xx(1分钟一期),url对应的代码是1407(下面通过改变这个代码就可以获取其他的类别数据)

  1.  
    url="https://www.xxx.com/v1/lottery/openResult?lotteryCode=1407&dataNum=10"
     
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
     
                  }
     
    res = requests.get(url, headers=headers)
     
    res.encoding = 'utf-8'
     
    s = json.loads(res.text)
     
    s = s['data']

     

  2.  

通过requests直接请求url链接获取数据

提取内容

issue是期号

openNumber是开奖号码

openTime是开奖日期

获取到这些json数据后,要获取上面所需要的内容,不需要的着忽略

  1.  
    openhis=[]
     
    for i in s:
     
    #print("openNumber="+i['openNumber'])
     
    #print("openTime="+i['openTime'])
     
    r = {}
     
    r['issue'] = i['issue']
     
     
     
    r['openTime']=i['openTime']
     
    nums = str(i['openNumber']).split(",")
     
    openNumber=[]
     
    for i in nums:
     
    if "+" in i:
     
    i = i.split("+")
     
    for j in i:
     
    openNumber.append(int(j))
     
    else:
     
    openNumber.append(int(i))
     
    r['openNums'] = openNumber
     
     
     
     
     
    openhis.append(r)

     

获取倒计时

在网页里面我们可以直接看到倒计时,但是在json里面没有看到,只有最新的开奖日期,这里我们通过最新的开奖日期去倒推倒计时

思路:

  1. 比如最新的开奖日期d1:2021-01-18 14:15:06

  2. 假设这个是1分钟一期的,下一期的开奖时间就是d2:2021-01-18 14:16:06

  3. 系统的当前时间是d3:2021-01-18 14:15:36,那倒计时就是30秒

  4. 所以可以根据d1+几分钟一期=d2,根据d3-d2=倒计时,这样就可以获取到“倒计时”

  1.  
    ###时间倒计时
     
    def djs(types,date_t):
     
    #s = "2021-01-18 14:15:06"
     
    new_t = datetime.strptime(date_t, '%Y-%m-%d %H:%M:%S') # strptime()内参数必须为string格式
     
    now_t = datetime.now() # 获得当前时间
     
    durn = (now_t - new_t).seconds # 两个时间差,并以秒显示出来
     
    durn = int(types) * 60 - durn
     
    m_t = int(durn / 60)
     
    s_t = durn % 60
     
    if m_t < 10:
     
    m_t = "0" + str(m_t)
     
    if s_t < 10:
     
    s_t = "0" + str(s_t)
     
    return "00:" + str(m_t) + ":" + str(s_t)

     

最后为了转成分:秒的格式,需要进行处理

  1.  
    durn = int(types) * 60 - durn
     
    m_t = int(durn / 60)
     
    s_t = durn % 60
     
    if m_t < 10:
     
    m_t = "0" + str(m_t)
     
    if s_t < 10:
     
    s_t = "0" + str(s_t)
     
    return "00:" + str(m_t) + ":" + str(s_t)

     

替换编号,获取全部

通过替换code表示大类,t表示小类,这样就可以获取对方所需要的全部数据。

三、封装Api接口

还是老样子,借助Flask,把访问的函数封装成Api接口

  1.  
    from flask import Flask, request
     
    app = Flask(__name__)
     
    @app.route('/getdata', methods=['POST', 'GET']) # 添加路由
     
    def upload(dataNum=10):
     
    t = request.args.get('type')
     
    dataNum = request.args.get('num')
     
    code = request.args.get('code')
     
        """
     
        网页解析的代码
     
        """  
     
        return json.dumps(results,ensure_ascii=False), 200, {"Content-Type":"application/json"}
     
     
     
     
     
    if __name__ == '__main__':
     
        # app.debug = True
     
    app.run(host='127.0.0.1', port=8080)

     

这是对于的Flask对应的代码,由于只需要编写一个接口,所以代码量不大。

接口参数

  1.  
    t = request.args.get('type')
     
    dataNum = request.args.get('num')
     
    code = request.args.get('code')

     

t是对应的大类名称

num是访问接口返回的数据量(多少条数据)

code是小类的编号

访问链接

http://127.0.0.1:8080/getdata?code=快3&type=1&num=30
 
http://127.0.0.1:8080/getdata?code=快3&type=3&num=30
 
http://127.0.0.1:8080/getdata?code=快3&type=5&num=30
 
http://127.0.0.1:8080/getdata?code=快3&type=10&num=30
 
 
 
 
 
http://127.0.0.1:8080/getdata?code=时时彩&type=1&num=30
 
http://127.0.0.1:8080/getdata?code=时时彩&type=3&num=30
 
http://127.0.0.1:8080/getdata?code=时时彩&type=5&num=30
 
http://127.0.0.1:8080/getdata?code=时时彩&type=10&num=30
 
 
 
 
 
http://127.0.0.1:8080/getdata?code=PK10&type=1&num=30
 
...
 
http://127.0.0.1:8080/getdata?code=六合彩&type=1&num=30
 
...
 
http://127.0.0.1:8080/getdata?code=11选5&type=1&num=30
 
...
 
http://127.0.0.1:8080/getdata?code=快乐彩&type=1&num=30
 
...
 
http://127.0.0.1:8080/getdata?code=3D&type=1&num=30
 
...
 
http://127.0.0.1:8080/getdata?code=排列3&type=1&num=30
 

 

通过改变参数的值,可以访问全部的数据

http://127.0.0.1:8080/getdata?code=%E5%BF%AB3&type=1&num=30

 

http://127.0.0.1:8080/getdata?code=%E5%85%AD%E5%90%88%E5%BD%A9&type=1&num=30

 

四、总结

ok,这次记录就到这里了,这次的小活,内容看着很多,但是工作量不大,小白也可以入手,所以就分享出来,方便给大家学习思路。

【各种爬虫源码获取方式】

识别文末二维码,回复:爬虫源码

------------- 精彩文章 -------------

python实现四种出行路线规划(公交、步行、驾车、骑行)

35行代码下载任意网页的图片

python窃取摄像头照片(摄像头拍照+邮箱发送+打包exe)

posted @ 2021-01-25 17:46  Python研究者  阅读(1178)  评论(0编辑  收藏  举报