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(下面通过改变这个代码就可以获取其他的类别数据)
-
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']
-
通过requests直接请求url链接获取数据
提取内容
issue是期号
openNumber是开奖号码
openTime是开奖日期
获取到这些json数据后,要获取上面所需要的内容,不需要的着忽略
-
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里面没有看到,只有最新的开奖日期,这里我们通过最新的开奖日期去倒推倒计时
思路:
-
比如最新的开奖日期d1:2021-01-18 14:15:06
-
假设这个是1分钟一期的,下一期的开奖时间就是d2:2021-01-18 14:16:06
-
系统的当前时间是d3:2021-01-18 14:15:36,那倒计时就是30秒
-
所以可以根据d1+几分钟一期=d2,根据d3-d2=倒计时,这样就可以获取到“倒计时”
-
###时间倒计时 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)
最后为了转成分:秒的格式,需要进行处理
-
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接口
-
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对应的代码,由于只需要编写一个接口,所以代码量不大。
接口参数
-
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,这次记录就到这里了,这次的小活,内容看着很多,但是工作量不大,小白也可以入手,所以就分享出来,方便给大家学习思路。
【各种爬虫源码获取方式】
识别文末二维码,回复:爬虫源码
------------- 精彩文章 -------------