python爬虫登录12306失败_使用python爬虫模拟12306登录方法
试了好久登录的时候总是显示:系统忙,请刷新,,,太折磨人了,搞了半天才想到是请求头部的问题.....
验证码还是要人工识图..#!/bin/env python
# -*- coding=utf-8 -*-
import ssl
import sys
import urllib2
import random
import httplib
import json
from cookielib import LWPCookieJar
import urllib
import re
import getpass
reload(sys)
sys.setdefaultencoding('UTF8')
cookiejar = LWPCookieJar()
cookiesuppor = urllib2.HTTPCookieProcessor(cookiejar)
opener = urllib2.build_opener(cookiesuppor, urllib2.HTTPHandler)
urllib2.install_opener(opener)
ssl._create_default_https_context = ssl._create_unverified_context
codeimg = 'https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&%s' % random.random()
baner = """
##################################
12306登录脚本,作者Mr RJL
python版本:2.7,适用于linux
验证码输入方式:
输入问题对应的图片序号,1-8;
多个以','分隔.如:1,2,3
##################################
"""
def get(url):
try:
request = urllib2.Request(url=url)
# req.add_header('User-Agent', 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0')
request.add_header("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
request.add_header('X-Requested-With', 'xmlHttpRequest')
request.add_header('User-Agent',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36')
request.add_header('Referer', 'https://kyfw.12306.cn/otn/login/init')
request.add_header('Accept', '*/*')
result = urllib2.urlopen(request).read()
assert isinstance(result, object)
return result
except httplib.error as e:
print e
pass
except urllib2.URLError as e:
print e
pass
except urllib2.HTTPBasicAuthHandler, urllib2.HTTPError:
print 'error'
pass
def Post(url, data):
try:
request = urllib2.Request(url=url, data=urllib.urlencode(data))
# req.add_header('User-Agent', 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0')
# request = urllib2.Request(ajax_url, urllib.urlencode(dc))
request.add_header("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
request.add_header('X-Requested-With', 'xmlHttpRequest')
request.add_header('User-Agent',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36')
request.add_header('Referer', 'https://kyfw.12306.cn/otn/login/init')
request.add_header('Accept', '*/*')
# request.add_header('Accept-Encoding', 'gzip, deflate')
result = urllib2.urlopen(request).read()
return result
except httplib.error as e:
return e
except urllib2.URLError as e:
return e
except urllib2.HTTPBasicAuthHandler, urllib2.HTTPError:
return 'error'
def cookietp():
stoidinput("获取Cookie")
Url = "https://kyfw.12306.cn/otn/login/init"
get(Url)
for index, c in enumerate(cookiejar):
stoidinput(c)
def getImg():
stoidinput("下载验证码...")
result = get(codeimg)
try:
if open('/tmp/tkcode', 'wb').write(result) :
import os
os.system("oeg /tmp/tkcode &")
else:
return False
except OSError as e:
print e
pass
def stoidinput(text):
"""
正常信息输出
:param text:
:return:
"""
print "\033[34m[*]\033[0m %s " % text
def errorinput(text):
"""
错误信息输出
:param text:
:return:
"""
print "\033[32m[!]\033[0m %s " % text
return False
def codexy():
"""
获取验证码
:return: str
"""
Ofset = raw_input("[*] 请输入验证码: ")
select = Ofset.split(',')
global randCode
post = []
offsetsX = 0 # 选择的答案的left值,通过浏览器点击8个小图的中点得到的,这样基本没问题
offsetsY = 0 # 选择的答案的top值
for ofset in select:
if ofset == '1':
offsetsY = 46
offsetsX = 42
elif ofset == '2':
offsetsY = 46
offsetsX = 105
elif ofset == '3':
offsetsY = 45
offsetsX = 184
elif ofset == '4':
offsetsY = 48
offsetsX = 256
elif ofset == '5':
offsetsY = 36
offsetsX = 117
elif ofset == '6':
offsetsY = 112
offsetsX = 115
elif ofset == '7':
offsetsY = 114
offsetsX = 181
elif ofset == '8':
offsetsY = 111
offsetsX = 252
else:
pass
post.append(offsetsX)
post.append(offsetsY)
randCode = str(post).replace(']', '').replace('[', '').replace("'", '').replace(' ', '')
def login(user, passwd):
randurl = 'https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn'
logurl = 'https://kyfw.12306.cn/otn/login/loginAysnSuggest'
surl = 'https://kyfw.12306.cn/otn/login/userLogin'
geturl = 'https://kyfw.12306.cn/otn/index/initMy12306'
randdata = {
"randCode": randCode,
"rand": "sjrand"
}
logdata = {
"loginUserDTO.user_name": user,
"userDTO.password": passwd,
"randCode": randCode
}
ldata = {
"_json_att": None
}
fresult = json.loads(Post(randurl, randdata), encoding='utf8')
checkcode = fresult['data']['msg']
if checkcode == 'FALSE':
errorinput("验证码有误,请重试")
else:
stoidinput("验证码通过,开始登录..")
try:
tresult = json.loads(Post(logurl, logdata), encoding='utf8')
if tresult['data'].__len__() == 0:
errorinput("登录失败: %s" % tresult['messages'][0])
else:
stoidinput("登录成功")
sult = Post(surl, ldata)
getUserinfo()
except ValueError as e:
errorinput(e)
def getUserinfo():
"""
登录成功后,显示用户名
:return:
"""
url = 'https://kyfw.12306.cn/otn/modifyUser/initQueryUserInfo'
data = dict(_json_att=None)
result = Post(url, data)
userinfo = result
name = r''
try:
stoidinput("欢迎 %s 登录" % re.search(name, result).group(1))
except AttributeError:
pass
def main():
user = raw_input("[+] 用户名(用户名/邮箱/手机): ")
passwd = getpass.getpass("[+] 密码: ")
if user == '' or passwd == '':
errorinput("用户名或密码不能为空!")
else:
cookietp()
getImg()
codexy()
login(user, passwd)
def logout():
url = 'https://kyfw.12306.cn/otn/login/loginOut'
result = get(url)
if result:
stoidinput("已退出")
else:
errorinput("退出失败")
if __name__ == "__main__":
print baner
main()
logout()
python爬虫登录12306失败_使用python爬虫模拟12306登录方法相关推荐
- python 拷贝文件创建目录失败_解决python os.mkdir创建目录失败的问题
起因 今天使用 python os.mkdir创建目录时遇到的一个小问题: feature_dir = os.path.join(os.getcwd(), 'system', 'feature') i ...
- python用cmd运行失败_解决python在cmd运行时导入包失败,出现错误信息 ModuleNotFoundError: No module named ***...
1.下图为我的自动化测试工程结构图 我通过运行run.bat批处理文件,调用cmd控制台运行start_run.py来开始我的自动化测试,但是出现如下错误: 大家可能知道我们的工程在IDE(Pycha ...
- python脚本自动运行失败_解决Python中定时任务线程无法自动退出的问题
python的线程有一个类叫Timer可以,用来创建定时任务,但是它的问题是只能运行一次,如果要重复执行,则只能在任务中再调用一次timer,但这样就存在新的问题了,就是在主进程退出后,不能正常退出子 ...
- python replace函数 成功 失败_解决python replace函数替换无效问题
解决python replace函数替换无效问题 python replace函数替换无效问题 str = "hello,china!" str.replace("hel ...
- python爬虫登录微博_为爬虫获取登录cookies: 使用Charles和requests模拟微博登录
上一节,我们讲了如何配置Charles代理,这一节我们通过模拟微博登录这个例子来看看如何使用Charles分析网站加载流程,顺便把微博模拟登录的Python代码也给实现了. 1. 用Charles记录 ...
- python模拟qq登录三方网站_使用Python模拟腾讯第三方认证-篇2
序 上篇分析了模拟登陆的流程,以及HTTP请求和回应,下面我们开始编码实现. 编码 准备 安装requests, pip install requests 使用requests请求比使用urllib方 ...
- python爬虫 requests+lxml爬取前程无忧网之模拟浏览器登录
"前程无忧"(Nasdaq: JOBS) : 是国内一个集多种媒介资源优势的专业人力资源服务机构,创始人为甄荣辉.它集合了传统媒体.网络媒体及先进的信息技术,加上一支经验丰富的专业 ...
- python爬虫设计在哪里_《python 爬虫教程 知乎》 怎样用Python设计一个爬虫模拟登陆知乎...
<python 爬虫教程 知乎> 怎样用Python设计一个爬虫模拟登陆知乎 python 爬虫教程 知乎2020-09-23 01:45:13人已围观 怎样用Python设计一个爬虫模拟 ...
- python登录代码思路_用python登录Dr.com思路以及代码分享
用python登录Dr.com思路以及代码分享 发布于 2014-08-28 22:31:52 | 192 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对 ...
最新文章
- 使用JMX监控Kafka
- python话雷达图-Python简单雷达图绘制
- script 标签中async 属性和defer 属性作用以及区别?
- Vim-安装 YouCompleteMe
- ubuntu: ssh: connect to host ubuntu port 22: No route to host
- 从零开始的Python学习Episode 4——列表
- idea 查看jsp是否被引用_IntelliJ IDEA解析JSP中的Web路径
- 说说我在制造业大厂当了一个月程序员的感受
- VLC音频重采样Audio resample核心流程梳理
- Android-图像识别项目OpenCV(4):开发思路以及问题
- ssh-copy-id非22端口的使用方法
- Excel任务该如何在FineReader 12中设置
- Windows上提升舒适度的好物分享(没恰饭)
- Java为Excel导出增加批注(POI)
- 培养孩子讲故事的心得
- 低学历者生存困难 程序员尤其明显
- 银行管理系统(使用SQL Server)-Python快速编程入门(第2版)-人民邮电出版社-阶段案例
- 苹果手机没有备份怎么恢复照片?
- STM32F103ZET6---【硬件篇】ADC
- 游戏测试中容易被忽视的重点
热门文章
- linux 基础上机练习,Linux上机练习题shell程序设计基础.docx
- 蒙特卡洛原理及实例(附Matlab代码)
- 拼图软件那个好用?好用的拼图软件分享
- JVM知识整理----基础和垃圾处理
- JAVA简单编写幸运抽奖
- java lcs_LCS最长公共子序列java实现
- STM32红外寻迹小车
- 大数据读心术丨这15条数据统计准爆了!
- Parsing error: No Babel config file detected for xxx Either disable config file checking with requir
- 步进电机控制器的设计