日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

pythonurllib新浪微博_python爬虫之新浪微博登录

發(fā)布時(shí)間:2023/12/29 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pythonurllib新浪微博_python爬虫之新浪微博登录 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

fiddler 之前了解了一些常見(jiàn)到的反爬措施,JS加密算是比較困難,而微博的登錄中正是用JS加密來(lái)反爬,今天來(lái)了解一下。

分析過(guò)程

首先我們?nèi)プグ?#xff0c;從登錄到微博首頁(yè)加載出來(lái)的過(guò)程。我們重點(diǎn)關(guān)注一下登錄操作,其次是首頁(yè)的請(qǐng)求,登錄一般是POST請(qǐng)求。我們搜索一下:

得知登錄的url為https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19),然后點(diǎn)擊WebForms菜單查看參數(shù):

里面有很多參數(shù)要提交,一般的參數(shù)的值有3種情況:

參數(shù)值固定。一般我們多次抓包發(fā)現(xiàn)某個(gè)參數(shù)值不變,就認(rèn)為是固定的;

參數(shù)值來(lái)自于之前服務(wù)器的響應(yīng)。多次抓包發(fā)現(xiàn)參數(shù)值變化,此時(shí)我們可以把參數(shù)的值在fiddler中查找一下,看看能否在之前的響應(yīng)中找到。例如這里的nonce、rsakv、servertime

參數(shù)值來(lái)自于js生成。如果多次抓包參數(shù)的值既不是固定,也不能在之前的響應(yīng)中找到,那么最可能的結(jié)果是這個(gè)參數(shù)的值是由js代碼生成。

我們?cè)趂iddler中查找nonce:

發(fā)現(xiàn)有一個(gè)前面的請(qǐng)求高亮了,說(shuō)明這個(gè)參數(shù)之前就出現(xiàn)過(guò)。點(diǎn)擊這個(gè)請(qǐng)求,在響應(yīng)里查找這個(gè)值:

可以找到這個(gè)參數(shù),所以我們要想登錄,就得獲取nonce的值,而要獲取nonce的值,就要先請(qǐng)求這個(gè)找到的請(qǐng)求,這個(gè)請(qǐng)求的url為https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=MTgzMTI0OTMxMDc%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=1533119627438,url中的su在后面會(huì)講到,最后那個(gè)參數(shù)看起來(lái)像時(shí)間戳,我們可以先用時(shí)間戳模擬一下。而servertime、rsakv等必須的參數(shù)也都可以在這個(gè)響應(yīng)中找到。

現(xiàn)在我們解決了大部分參數(shù)的問(wèn)題,但是有兩個(gè)難啃的骨頭:sp和su,這兩個(gè)值在之前的響應(yīng)中找不到。而且我們會(huì)發(fā)現(xiàn),我們登錄輸入的賬號(hào)和密碼沒(méi)有出現(xiàn)在這些參數(shù)中,我們大膽猜測(cè):su和sp就是賬號(hào)和密碼!那么我們?cè)趺凑业剿鼈兊闹的亍4鸢甘钦业较鄳?yīng)的JS代碼,并用python重寫它。

現(xiàn)在我們的難題到了怎么定位這倆個(gè)值的JS代碼,我們之前學(xué)習(xí)Chrome調(diào)試的時(shí)候,學(xué)會(huì)了打斷點(diǎn),這個(gè)地方正是用斷點(diǎn)的方式來(lái)找。我們每次登錄都要點(diǎn)擊頁(yè)面的“登錄”按鈕,我們?cè)谔顚懲曩~號(hào)密碼后,設(shè)置一個(gè)點(diǎn)擊事件的斷點(diǎn),然后點(diǎn)擊登錄。這樣請(qǐng)求在進(jìn)行登錄的時(shí)候會(huì)暫停,而su和sp參數(shù)也是這個(gè)時(shí)候被加密!

然后,我們用調(diào)試界面右上角的

這些功能鍵進(jìn)行逐步分析。

注意:一般只是賦值的操作,我們可以跳過(guò),如果是函數(shù)的執(zhí)行,我們要到函數(shù)里面去看,特別是函數(shù)的參數(shù)是攜帶重要參數(shù),要重點(diǎn)關(guān)注。在控制臺(tái)界面,我們還可以查看某些參數(shù)的值。

另外,如果退出某個(gè)函數(shù)后,光標(biāo)仍在這一行,說(shuō)明這一行還有個(gè)函數(shù),切不可直接下一步,很多關(guān)鍵信息就在這個(gè)函數(shù)里。

微博登錄的JS定位過(guò)程就不細(xì)說(shuō)了,我們最后定位到su和sp加密代碼如下:

即su是用base64進(jìn)行了編碼,而sp是用rsa加密,我們把js代碼用python代碼實(shí)現(xiàn)即可。

目前,登錄的問(wèn)題解決了。現(xiàn)在看看請(qǐng)求首頁(yè)的問(wèn)題。我們逐個(gè)查看,可以知道首頁(yè)的請(qǐng)求如下:

url為https://weibo.com/u/6505689778/home?wvr=5&lf=reg,而這個(gè)url里有個(gè)6505689778,這個(gè)值我們?cè)趂iddler中查找,在請(qǐng)求https://passport.weibo.com/wbsso/login?ticket=ST-NjUwNTY4OTc3OA%3D%3D-1533119623-gz-0DEAF5775E6F1D983147B0B96EE915B9-1&ssosavestate=1564655623&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript0&client=ssologin.js(v1.4.19)&_=1533119634900的響應(yīng)里能找到它的。

而請(qǐng)求這個(gè)頁(yè)面,又要獲取參數(shù)ticket、ssosavestate的值,我們?cè)俅尾檎?#xff0c;可以知道這兩個(gè)值在另一個(gè)請(qǐng)求https://login.sina.com.cn/crossdomain2.php?action=login&entry=weibo&r=https%3A%2F%2Fpassport.weibo.com%2Fwbsso%2Flogin%3Fssosavestate%3D1564655623%26url%3Dhttps%253A%252F%252Fweibo.com%252Fajaxlogin.php%253Fframelogin%253D1%2526callback%253Dparent.sinaSSOController.feedBackUrlCallBack%2526sudaref%253Dweibo.com%26display%3D0%26ticket%3DST-NjUwNTY4OTc3OA%3D%3D-1533119623-gz-39B6B6D3D3979D6DA2860B54E4E61A01-1%26retcode%3D0&login_time=1533119622&sign=0db5e9f42ceb691c&sr=1536%2A864的響應(yīng)里。

那么這個(gè)很長(zhǎng)的url怎么來(lái)的呢,我們?cè)俅尾檎?#xff0c;可以得知它就在登錄之后響應(yīng)里。

到了這里,步驟已經(jīng)走通了!

我們理一下步驟:

1、先把賬號(hào)、密碼加密后的密文得到

2、請(qǐng)求https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=MTgzMTI0OTMxMDc%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=1533119627438得到nonce、rsakv等參數(shù)

3、構(gòu)造參數(shù)并請(qǐng)求登錄的url:https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19),在響應(yīng)里得到跳轉(zhuǎn)的url

4、請(qǐng)求跳轉(zhuǎn)的url:https://login.sina.com.cn/crossdomain2.php?action=login&entry=weibo&r=https%3A%2F%2Fpassport.weibo.com%2Fwbsso%2Flogin%3Fssosavestate%3D1564655623%26url%3Dhttps%253A%252F%252Fweibo.com%252Fajaxlogin.php%253Fframelogin%253D1%2526callback%253Dparent.sinaSSOController.feedBackUrlCallBack%2526sudaref%253Dweibo.com%26display%3D0%26ticket%3DST-NjUwNTY4OTc3OA%3D%3D-1533119623-gz-39B6B6D3D3979D6DA2860B54E4E61A01-1%26retcode%3D0&login_time=1533119622&sign=0db5e9f42ceb691c&sr=1536%2A864,得到ticket、ssosavestate參數(shù)的值

5、請(qǐng)求https://passport.weibo.com/wbsso/login?ticket=ST-NjUwNTY4OTc3OA%3D%3D-1533119623-gz-0DEAF5775E6F1D983147B0B96EE915B9-1&ssosavestate=1564655623&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript0&client=ssologin.js(v1.4.19)&_=1533119634900得到uniqueid參數(shù)

6、請(qǐng)求首頁(yè):https://weibo.com/u/6505689778/home?wvr=5&lf=reg

OK,至此,我們已成功登錄了微博,后面你要獲取微博上的數(shù)據(jù),可以自行請(qǐng)求。

實(shí)現(xiàn)代碼

importrequestsimportrsaimporttimeimportreimportrandomimporturllib3importbase64from urllib.parse importquotefrom binascii importb2a_hex

urllib3.disable_warnings()#取消警告

defget_timestamp():return int(time.time()*1000) #獲取13位時(shí)間戳

classWeiBo():def __init__(self,username,password):

self.username=username

self.password=password

self.session= requests.session() #登錄用session

self.session.headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}

self.session.verify= False #取消證書驗(yàn)證

defprelogin(self):'''預(yù)登錄,獲取一些必須的參數(shù)'''self.su= base64.b64encode(self.username.encode()) #閱讀js得知用戶名進(jìn)行base64轉(zhuǎn)碼

url = 'https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su={}&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_={}'.format(quote(self.su),get_timestamp()) #注意su要進(jìn)行quote轉(zhuǎn)碼

response =self.session.get(url).content.decode()#print(response)

self.nonce = re.findall(r'"nonce":"(.*?)"',response)[0]

self.pubkey= re.findall(r'"pubkey":"(.*?)"',response)[0]

self.rsakv= re.findall(r'"rsakv":"(.*?)"',response)[0]

self.servertime= re.findall(r'"servertime":(.*?),',response)[0]returnself.nonce,self.pubkey,self.rsakv,self.servertimedefget_sp(self):'''用rsa對(duì)明文密碼進(jìn)行加密,加密規(guī)則通過(guò)閱讀js代碼得知'''publickey= rsa.PublicKey(int(self.pubkey,16),int('10001',16))

message= str(self.servertime) + '\t' + str(self.nonce) + '\n' +str(self.password)

self.sp=rsa.encrypt(message.encode(),publickey)returnb2a_hex(self.sp)deflogin(self):

url= 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'data={'entry': 'weibo','gateway': '1','from':'','savestate': '7','qrcode_flag': 'false','useticket': '1','pagerefer': 'https://login.sina.com.cn/crossdomain2.php?action=logout&r=https%3A%2F%2Fweibo.com%2Flogout.php%3Fbackurl%3D%252F','vsnf': '1','su': self.su,'service': 'miniblog','servertime': str(int(self.servertime)+random.randint(1,20)),'nonce': self.nonce,'pwencode': 'rsa2','rsakv': self.rsakv,'sp': self.get_sp(),'sr': '1536 * 864','encoding': 'UTF - 8','prelt': '35','url': 'https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack','returntype': 'META',

}

response= self.session.post(url,data=data,allow_redirects=False).text #提交賬號(hào)密碼等參數(shù)

redirect_url = re.findall(r'location.replace\("(.*?)"\);',response)[0] #微博在提交數(shù)據(jù)后會(huì)跳轉(zhuǎn),此處獲取跳轉(zhuǎn)的url

result = self.session.get(redirect_url,allow_redirects=False).text #請(qǐng)求跳轉(zhuǎn)頁(yè)面

ticket,ssosavestate = re.findall(r'ticket=(.*?)&ssosavestate=(.*?)"',result)[0] #獲取ticket和ssosavestate參數(shù)

uid_url = 'https://passport.weibo.com/wbsso/login?ticket={}&ssosavestate={}&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript0&client=ssologin.js(v1.4.19)&_={}'.format(ticket,ssosavestate,get_timestamp())

data= self.session.get(uid_url).text #請(qǐng)求獲取uid

uid = re.findall(r'"uniqueid":"(.*?)"',data)[0]print(uid)

home_url= 'https://weibo.com/u/{}/home?wvr=5&lf=reg'.format(uid) #請(qǐng)求首頁(yè)

html =self.session.get(home_url)

html.encoding= 'utf-8'

print(html.text)defmain(self):

self.prelogin()

self.get_sp()

self.login()if __name__ == '__main__':

username= 'xxxxxxxxx' #微博賬號(hào)

password = 'xxxxxxxxx' #微博密碼

weibo =WeiBo(username,password)

weibo.main()

結(jié)果:

總結(jié)

以上是生活随笔為你收集整理的pythonurllib新浪微博_python爬虫之新浪微博登录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。