selenium登录实时爬取安徽快3彩票最新开奖信息

公司接了一个外包项目,需要爬取彩票网站的实时数据,只要最新一条的数据,我爬取的网站是

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

接下来就是解析我们所需要的数据了。

selenium登录实时爬取安徽快3彩票最新开奖信息_第1张图片

需要注意的是分为三个部分,每一部分的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

好了,以上就是所有代码,谢谢!

你可能感兴趣的:(selenium登录实时爬取安徽快3彩票最新开奖信息)