python模拟浏览器登陆,12306 火车票

# coding=utf-8

import HTMLParser  
import urlparse  
import urllib  
import urllib2  
import cookielib  
import string  
import re, time, os, Image


username = "xxxx" 
password = "xxxx"

# 登录
login_url = "https://kyfw.12306.cn/otn/login/init"
yzm_login_url = "https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand"
login_form_url = "https://kyfw.12306.cn/otn/login/loginAysnSuggest"

# # 订票
# order_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
# yzm_order_url = "https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp"
# order_form_url = "https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo"
# """
# cancel_flag:2
# bed_level_order_num:000000000000000000000000000000
# passengerTicketStr:1,0,1,姓名,1,身份证号码,手机号码,N
# oldPassengerStr:姓名,1,身份证号码,1_
# tour_flag:dc
# randCode:dvms
# _json_att:
# REPEAT_SUBMIT_TOKEN:be941fd5e93193bdd8097bf03cfeae1f
# """

    
# 设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie  
cj = cookielib.LWPCookieJar()  
cookie_support = urllib2.HTTPCookieProcessor(cj)  
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)  
urllib2.install_opener(opener)  

def getLoginCode():
    """
    @des:获取验证码
    """
    request = urllib2.Request("%s&%s" % (yzm_login_url, time.time()), "")
    response = urllib2.urlopen(request)  
    text = response.read()  
    return text

def writefile_map(name, data):  
    """
    @des:显示验证码
    """
    files = open(name, 'wb')  
    files.write(data)  
    files.close()  
    try:  
        os.startfile(name)  
    except:  
        im = Image.open(name)  
        im.show()  

def login():
    """
    @des: 登录
    """
    # 打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)  
    h = urllib2.urlopen(login_url)  
    # end
    codemap = getLoginCode()
    writefile_map('codein.tif', codemap)  
    randCode = raw_input("请输入验证码: ")
    # 构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。 
    headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1',
               'Referer' : '******'}  
    # 构造Post数据,他也是从抓大的包里分析得出的。  
    postData = {
                'loginUserDTO.user_name':username,
                'userDTO.password':password,
                'randCode':randCode
                }  
    # 需要给Post数据编码  
    postData = urllib.urlencode(postData)  
    
    
    # 通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成登录过程  
    request = urllib2.Request(login_form_url, postData, headers)  
    print request  
    response = urllib2.urlopen(request)  
    text = response.read()  
    print text
    
if __name__ == "__main__":
    login()  

分享到: 微信 更多