Python3 模擬登錄百度(requests略就、cookies登錄方法)

昨天實(shí)現(xiàn)了模擬登錄知乎捎迫,今天我實(shí)現(xiàn)了模擬登錄百度,獲取登錄后百度首頁天氣信息
代碼的注釋講解的很清楚表牢,大家直接看代碼就能看懂窄绒,不懂的歡迎提問,整理如下崔兴,希望對大家有幫助彰导,有幫助的請點(diǎn)個(gè)贊

Paste_Image.png

github代碼地址

import requests, time, random, rsa, base64, re
from bs4 import BeautifulSoup as BS
import http.cookiejar as HC
from subprocess import Popen  # 打開圖片

home_url = "https://www.baidu.com/"
login_url = "https://passport.baidu.com/v2/api/?login"

headers = {
    "Host": "passport.baidu.com",
    "Referer": "https://www.baidu.com/",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36"
}

# 獲取當(dāng)前時(shí)間戳
def get_tt():
    return str(int(time.time() * 1000))

# 隨機(jī)生成callback
def get_callback():
    prefix = "bd__cbs__"  # callback 前綴
    char = "0123456789abcdefghijklmnopqrstuvwxyz"
    n = random.randint(0, 2147483648)
    suffix = []
    while n != 0:
        suffix.append(char[n % 36])
        n = n // 36
    suffix.reverse()
    print("callback: " + (prefix + ''.join(suffix)))
    return prefix + ''.join(suffix)

# 隨機(jī)生成gid
def get_gid():
    gid = list("xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")
    for x in range(len(gid)):
        r = int(random.random() * 16)
        if gid[x] == "x":  # 如果當(dāng)前值為x
            gid[x] = hex(r).replace("0x", "").upper()
    print("gid: " + "".join(gid))
    return "".join(gid)

def get_token():
    global token_time
    token_time = get_tt()
    call_back = get_callback()
    token_url = "https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt={}&class=login&gid={}&logintype=dialogLogin&callback={}".format(
        token_time, gid, call_back)
    response = session.get(token_url, headers=headers)
    token_all = response.text.replace(call_back, "")
    token_all = eval(token_all)
    print(token_all)
    return token_all["data"]["token"]

def get_pubkey():
    pubkey_callback = get_callback()
    pubkey_url = "https://passport.baidu.com/v2/getpublickey?token={}&tpl=mn&apiver=v3&tt={}&gid={}&callback={}".format(
        token, get_tt(), gid, pubkey_callback)
    response = session.get(pubkey_url, headers=headers)
    pubkey_all = eval(response.text.replace(pubkey_callback, ""))
    print(pubkey_all["pubkey"], pubkey_all["key"])
    return pubkey_all["pubkey"], pubkey_all["key"]

# 密碼rsa加密
def get_rsa_password(psw, pk):
    pub = rsa.PublicKey.load_pkcs1_openssl_pem(pk.encode("utf-8"))
    psw = psw.encode("utf-8")
    passwd = rsa.encrypt(psw, pub)
    passwd = base64.b64encode(passwd)
    print(passwd.decode("utf-8"))
    return passwd.decode("utf-8")

session = requests.session()
session.cookies = HC.LWPCookieJar(filename="BaiDuCookies")
try:
    session.cookies.load(ignore_discard=True)  # 加d載cookies文件
except:
    print("cookie未保存或cookie已過期")
    gid = get_gid()
    session.get("https://passport.baidu.com/v2/?login", headers=headers)
    token = get_token()
    pubkey, key = get_pubkey()
    account = input("請輸入您的賬號:")
    password = input("請輸入您的密碼:")

    postData = {
        'staticpage': 'https://www.baidu.com/cache/user/html/v3Jump.html',
        'charset': 'UTF-8',
        'tpl': 'mn',
        'subpro': '',
        'apiver': 'v3',
        'safeflg': '0',
        'u': 'https://www.baidu.com/',
        'isPhone': 'false',
        'detect': '1',
        'quick_user': '0',
        'logintype': 'dialogLogin',
        'logLoginType': 'pc_loginDialog',
        'idc': '',
        'loginmerge': 'true',
        'splogin': 'rate',
        'mem_pass': 'on',
        'crypttype': '12',
        'countrycode': '',
        'codestring': '',
        'verifycode': '',
        'token': token,
        'tt': get_tt(),
        'gid': gid,
        'username': account,
        'password': get_rsa_password(password, pubkey),  # 經(jīng)過加密
        'rsakey': key,
        'ppui_logintime': str(int(get_tt()) - int(token_time)),
        'callback': get_callback()
    }

    response = session.post(login_url, postData, headers=headers)
    # 如果存在codeString則獲取驗(yàn)證碼圖片蛔翅,再次請求
    codeString = re.findall(r'codeString=(.*?)&userName', response.text)[0]
    while codeString:
        # 獲取圖片,保存圖片位谋,輸入圖片驗(yàn)證碼
        gif_url = "https://passport.baidu.com/cgi-bin/genimage?{}".format(codeString)
        gif = session.get(gif_url, headers=headers)
        with open("baidu.gif", "wb") as f:
            f.write(gif.content)
        Popen("baidu.gif", shell=True)
        verifycode = input("驗(yàn)證碼:")
        postData["verifycode"] = verifycode
        postData["codestring"] = codeString

        # 再次登錄
        relogin = session.post(login_url, postData, headers=headers)
        codeString = re.findall(r'codeString=(.*?)&userName', relogin.text)[0]

headers["Host"] = "www.baidu.com"
re = session.get(home_url, headers=headers)
# 保存cookies信息山析,以備下次直接訪問首頁
session.cookies.save()
# 獲取首頁天氣信息
print("城市: " + BS(re.text, 'lxml').find("em", {"class": "show-city-name"})["data-key"])
print("氣溫: " + BS(re.text, 'lxml').find("em", {"class": "show-icon-temp"}).string)

運(yùn)行結(jié)果如下:

獲取天氣信息
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掏父,隨后出現(xiàn)的幾起案子笋轨,更是在濱河造成了極大的恐慌,老刑警劉巖赊淑,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翩腐,死亡現(xiàn)場離奇詭異,居然都是意外死亡膏燃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門何什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來组哩,“玉大人,你說我怎么就攤上這事处渣×娣。” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵罐栈,是天一觀的道長黍衙。 經(jīng)常有香客問我,道長荠诬,這世上最難降的妖魔是什么琅翻? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮柑贞,結(jié)果婚禮上方椎,老公的妹妹穿的比我還像新娘。我一直安慰自己钧嘶,他們只是感情好棠众,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著有决,像睡著了一般闸拿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上书幕,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天新荤,我揣著相機(jī)與錄音,去河邊找鬼按咒。 笑死迟隅,一個(gè)胖子當(dāng)著我的面吹牛但骨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播智袭,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奔缠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吼野?” 一聲冷哼從身側(cè)響起校哎,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞳步,沒想到半個(gè)月后闷哆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡单起,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年抱怔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘀倒。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屈留,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出测蘑,到底是詐尸還是另有隱情灌危,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布碳胳,位于F島的核電站勇蝙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挨约。R本人自食惡果不足惜味混,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烫罩。 院中可真熱鬧惜傲,春花似錦、人聲如沸贝攒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隘弊。三九已至哈踱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梨熙,已是汗流浹背开镣。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咽扇,地道東北人邪财。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓陕壹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親树埠。 傳聞我的和親對象是個(gè)殘疾皇子糠馆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,126評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件怎憋、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 文章轉(zhuǎn)自http://www.cnblogs.com/technology/archive/2011/05/26/...
    MrPurussaurus閱讀 1,201評論 0 3
  • 感恩生命的美好又碌,謝謝 感恩大自然的恩賜,謝謝 感恩導(dǎo)師的教悔绊袋,謝謝 感恩父母的健康毕匀,謝謝 感恩錢寶寶如氧氣般來到身...
    莫水娥閱讀 131評論 0 0
  • 減肥瘦身+養(yǎng)生是終身事業(yè),島國的那些好東西咱們要認(rèn)真開發(fā)用起來~ 說真的癌别,新陳代謝率這事兒真的是抵抗不了皂岔,以前大吃...
    MaskQueen英國微博閱讀 684評論 0 0