发布时间:2022-08-19 12:43
公司接了一个外包项目,需要爬取彩票网站的实时数据,只要最新一条的数据,我爬取的网站是
https://pub.icaile.com/jsk3/
首先,我先分析了这个网站,需要登录之后才能查看最新的开奖信息,于是我就先用selenium模拟登录之后,获取到登录之后的cookie,代码如下:
import time
from selenium import webdriver
from urllib import request
from random import choice
from selenium.webdriver.chrome.options import Options
import requests
from lxml import etree
def get_cookie():
# 模拟登录,获取登录之后的cookie
# 我用的是谷歌浏览器的无头模式
opt = Options()
opt.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=opt)
# driver = webdriver.Chrome()
driver.get('https://reg.icaile.com/UserWeb/login/?refurl=https%3A%2F%2Fpub.icaile.com%2Fjsk3%2F')
time.sleep(2)
driver.find_element_by_name("mobile").click()
driver.find_element_by_name("mobile").send_keys('帐号')
time.sleep(1)
driver.find_element_by_name("password").click()
driver.find_element_by_name("password").send_keys('密码')
driver.find_element_by_id("submit").click()
time.sleep(1)
cookies = driver.get_cookies()
cookies_list = []
for cookies_dict in cookies:
cookie = cookies_dict['name']+'='+cookies_dict['value']
cookies_list.append(cookie)
# 将拿到的数据以;拼接成一个字符串(cookie)
header_cookies = ';'.join(cookies_list)
return header_cookies
好了,我试过了可以登录上去。需要注意的是这个网站登录的时候没有验证码,但是登录差不多20次左右之后,会弹出来一个验证框,给手机发信息,这个时候我们就不得不再重新注册一个帐号了,这里比较好的方法是自己搭建一个cookie池,每次登录的时候随机从cookie池里取出来一个。
登录上去之后,带上获取到的cookie,开始获取源代码,代码如下:
def get_html():
# 获取网页源代码,为解析数据做准备
headers = {
'cookie': get_cookie(),
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
# 1.创建request对象,设置随机请求头
req = request.Request(url='https://pub.icaile.com/jsk3/', headers=headers)
# 2.发起请求
response = request.urlopen(req)
# 3.接收数据
html = response.read().decode('utf8')
return html
接下来就是解析我们所需要的数据了。
需要注意的是分为三个部分,每一部分的id都不一样,不过xpath解析时,语法都是一样的,每一列都有14条数据,最后一列有13条数据,代码如下:
def parse_left():
# 解析需要的数据
html = get_html()
res = etree.HTML(html)
# 和值
lottery_add = res.xpath('//tbody[@id="firstTbody"]/tr/td[3]/text()')
finally_add = res.xpath('//tbody[@id="firstTbody"]/tr/td[3]/text()')[-1]
# 打印出来每一期和值的索引
index = lottery_add.index(finally_add)
# 开奖期号
lottery_periods = res.xpath('//tbody[@id="firstTbody"]/tr/td[1]/text()')[index].split('\r\n')
lottery_periods = ''.join(lottery_periods).replace(' ', '')
# 开奖号码
lottery_num = res.xpath('//tbody[@id="firstTbody"]/tr/td[2]/em/text()')[-3:]
lottery_num = '-'.join(lottery_num)
# 开奖时间
lottery_time = res.xpath('//tbody[@id="firstTbody"]/tr/td[4]/span/text()')[index]
# 判断索引是否等于13
if index == 13:
print('左边最新一期的开奖期号为:%s,\n开奖号码为:%s,\n和值为:%s,\n最新开奖时间为:%s' % (lottery_periods, lottery_num, finally_add, lottery_time))
print('左边所有彩票信息已抓取完毕!!!')
print ('*'*70)
parse_middle()
def parse_middle():
# 解析需要的数据
html = get_html()
res = etree.HTML(html)
# 和值
lottery_add = res.xpath('//tbody[@id="secondTbody"]/tr/td[3]/text()')
finally_add = res.xpath('//tbody[@id="secondTbody"]/tr/td[3]/text()')[-1]
index = lottery_add.index(finally_add)
# 开奖期号
lottery_periods = res.xpath('//tbody[@id="secondTbody"]/tr/td[1]/text()')[index].split('\r\n')
lottery_periods = ''.join(lottery_periods).replace(' ', '')
# 开奖号码
lottery_num = res.xpath('//tbody[@id="secondTbody"]/tr/td[2]/em/text()')[-3:]
lottery_num = '-'.join(lottery_num)
# 开奖时间
lottery_time = res.xpath('//tbody[@id="secondTbody"]/tr/td[4]/span/text()')[index]
if index == 13:
print('中间最新一期的开奖期号为:%s,\n开奖号码为:%s,\n和值为:%s,\n最新开奖时间为:%s' % (lottery_periods, lottery_num, finally_add, lottery_time))
print ('*' * 70)
parse_right()
def parse_right():
# 解析需要的数据
html = get_html()
res = etree.HTML(html)
# 和值
lottery_add = res.xpath('//tbody[@id="thirdTbody"]/tr/td[3]/text()')
finally_add = res.xpath('//tbody[@id="thirdTbody"]/tr/td[3]/text()')[-1]
index = lottery_add.index(finally_add)
# 开奖期号
lottery_periods = res.xpath('//tbody[@id="thirdTbody"]/tr/td[1]/text()')[index].split('\r\n')
lottery_periods = ''.join(lottery_periods).replace(' ', '')
# 开奖号码
lottery_num = res.xpath('//tbody[@id="thirdTbody"]/tr/td[2]/em/text()')[-3:]
lottery_num = '-'.join(lottery_num)
# 开奖时间
lottery_time = res.xpath('//tbody[@id="thirdTbody"]/tr/td[4]/span/text()')[index]
if index == 12:
print('最新开奖期号为:%s,\n开奖号码为:%s,\n和值为:%s,\n最新开奖时间为:%s' % (lottery_periods, lottery_num, finally_add, lottery_time))
print('今天所有的彩票信息已抓取完毕!!!')
数据已经解析完毕,接下来就是获取实时数据,让程序20分钟运行一次,代码如下:
flag = 0
# 获取当前时间戳
now = datetime.datetime.now()
sched_time = datetime.datetime(now.year, now.month, now.day, now.hour, now.minute) + datetime.timedelta(minutes=5)
while True:
now = datetime.datetime.now()
if sched_time < now < sched_time + datetime.timedelta(seconds=3):
time.sleep(3)
parse_left()
flag = 1
else:
if flag == 1:
sched_time = sched_time + datetime.timedelta(minutes=20)
flag = 0
好了,以上就是所有代码,谢谢!
CVPR2022 最新损失函数SIOU--适配YOLOv5 6.0版本 代码实现,经试验确实可以涨点
微信小程序使用Echarts真机调试报错,Echarts占内存过大解决方法
清华教授沈向洋:创新就要做到极致,用开源的方式培养未来的工程师
STM32F1+BC20+MQTT+FreeRTOS系统连接云平台传输温湿度,控制LED灯③——华为云
Pytorch 导入tersorboard 的 SummaryWriter时报错
Python类的__new__,__init__,__getitem__,__setitem__,__setattr__,__getattr__等魔术方法