使用python爬虫模拟12306登陆

使用python爬虫模拟12306登陆

需要用到requests库函数,下载requests库函数地方法:直接在命令行输入以下代码就可以了就可以了。

pip install requests

模拟登陆的一般步骤:伪装爬虫–>实例化一个session–>访问登陆的网络求情–>获取验证码(一般登陆都会有验证码验证)–>验证账号密码–>获取token验证–>登陆成功(访问的网络请求需要我们在12306官网自己找到)
验证验证码:12306的验证码是点击验证的,是通过获取点击的坐标来验证是否点击正确,可以设置好每张图片的编号,一个编号对应一个坐标。

代码如下

"""
    模拟登陆1206
"""


import base64
import requests
import re
import config

def get_point(index):

    index = index.split(',')
    loc = {
        '1': '43,45',
        '2': '106,45',
        '3': '167,45',
        '4': '259,45',
        '5': '42,120',
        '6': '106,120',
        '7': '167,120',
        '8': '259,120',
    }
    answer = []
    for t in index:
        answer.append(loc[t])
    return ','.join(answer)
# 首先做好伪装,伪装成浏览器
# 实例化一个session
session = requests.Session()  # 自动的处理cookie
headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Mobile Safari/537.36'
}
# 伪装成浏览器
session.headers.update(headers)
# 访问登陆界面
cookie_url = 'https://kyfw.12306.cn/otn/login.html/conf'
session.get(cookie_url)
# 下载验证码
response = session.get('https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1541760606034&callback=jQuery19106311375523623572_1541759333476&_=1541759333479')
img_base64 = re.findall(r'"image":"(.*?)"', response.text)[0]
img_byte = base64.b64decode(img_base64)
with open('test.jpg', 'wb') as f:
    f.write(img_byte)

check_captcha = 'https://kyfw.12306.cn/passport/captcha/captcha-check?callback=jQuery19106311375523623572_1541759333476&rand=sjrand&login_site=E&_=1541759333484'
answer = get_point(input('请输入正确的序号:'))
response = session.get(check_captcha, params={'answer': answer})
code = re.findall(r'"result_code":"(.*?)"', response.text)[0]
if code == '4':
    print("验证码验证成功")
    # 验证用户名与密码
    login_url = 'https://kyfw.12306.cn/passport/web/login'
    Form_Data = {
        'username': config.username,
        'password': config.password,
        'appid': 'otn',
        'answer': answer
    }
    response = session.post(login_url, data=Form_Data)
    res = response.json()
    if res['result_code'] == 0:
        print('用户名密码验证正确')
        uamtk_url = 'https://kyfw.12306.cn/passport/web/auth/uamtk'
        response = session.post(uamtk_url, data={'appid': 'otn'})
        res = response.json()
        if res['result_code'] == 0:
            print('获取token成功')
            check_token_url = 'https://kyfw.12306.cn/otn/uamauthclient'
            response = session.post(check_token_url, data={'tk': res['newapptk']})
            res = response.json()
            if res['result_code'] == 0:
                print('验证token通过')
                print('登陆成功')
    else:
        print('用户名或密码错误')
else:
    print('验证码错误')

更新一下,这个模拟登录的代码已经不能使用了,在使用userame与password访问login接口的时候会出现网络错误。
其实是因为缺少了两个cookie字段[RAIL_DEVICEID, RAIL_EXPIRATION],这两个字段是12306根据浏览器的信息,然后通js代码设置的cookie,恕我太菜,不能破解出这段js代码,只能通过打开一个浏览器来复制这两个字段,不过问题不大,都能解决问题。嘿嘿。。。

你可能感兴趣的:(python实践)