12306官網(wǎng)模擬登陸之驗(yàn)證碼生成與驗(yàn)證初探
發(fā)布時(shí)間:2020-11-04 點(diǎn)擊數(shù):3370
來源:CSDN
前言
每一個(gè)學(xué)習(xí)過爬蟲的人對12306肯定都是有點(diǎn)想法,但在每年春節(jié)或一些假期經(jīng)歷過12306官網(wǎng)搶票后,這些念頭便逐漸不剩下多少了。有時(shí)候真的是活生生的人都瞅不出來
一直沒有勇氣去分析一下12306官網(wǎng)
請求分析
- 我們簡單抓包就可以找到生成驗(yàn)證碼的接口
去除一些暫時(shí)無關(guān)的參數(shù)(僅分析驗(yàn)證碼)
https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand
- 驗(yàn)證驗(yàn)證碼是否正確的接口
其中answer
表示驗(yàn)證碼的坐標(biāo)位置
answer: 34,34,38,105
代碼思路
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36'
}
login_url = 'https://kyfw.12306.cn/otn/resources/login.html'
session = requests.Session()
session.get(login_url)
image_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand'
req = session.get(image_url, headers=headers).content
with open('code.png', 'wb') as f:
f.write(req)
check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'
point_dict = {
'1': '37,40',
'2': '112,40',
'3': '187,40',
'4': '262,40',
'5': '37,120',
'6': '112,120',
'7': '187,120',
'8': '262,120',
}
def get_point(indexs):
indexs = indexs.split(',')
temp = []
for index in indexs:
temp.append(point_dict[index])
return ','.join(temp)
params = {
'answer': get_point(input('請輸入驗(yàn)證碼位置')),
'rand':'sjrand',
'login_site':'E',
}
response = session.get(check_url, params=params, headers=headers).text
print(response)
分析
12036 驗(yàn)證碼 問題就在如何確認(rèn)應(yīng)該點(diǎn)擊的坐標(biāo)位置,目前還沒有發(fā)現(xiàn)合適的做法,不知道有哪位大佬可以指點(diǎn)一下,有了解的大碼平臺(tái)也可以推薦一下。