微博登陸python學習

2022-06-21 17:00:12 字數 4379 閱讀 9816

python3版本的** 

從前的cookielib

import

base64

import

json

import

urllib

import

urllib.parse

import

binascii

class

userlogin:

## url解碼

def__init__

(self,username,userpassword):

self.username =username

self.password =userpassword

defget_encrypted_name(self):

username_urllike =urllib.request.quote(self.username)

username_encrypted = base64.b64encode(bytes(username_urllike,encoding='

utf-8'))

return username_encrypted.decode('

utf-8')

defget_prelogin_args(self):

'''該函式用於模擬預登入過程,並獲取伺服器返回的 nonce , servertime , pub_key 等資訊

'''json_pattern = re.compile('

\((.*)\)')

url = '

' + self.get_encrypted_name() + '

&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)

'try

: request =urllib.request.request(url)

response =urllib.request.urlopen(request)

raw_data = response.read().decode('

utf-8')

json_data = json_pattern.search(raw_data).group(1)

data =json.loads(json_data)

return

data

except

urllib.error as e:

print("

%d"%e.code)

return

none

defget_encrypted_pw(self,data):

rsa_e = 65537 #

0x10001

pw_string = str(data['

servertime

']) + '

\t' + str(data['

nonce

']) + '

\n' +str(self.password)

key = rsa.publickey(int(data['

pubkey

'],16),rsa_e)

pw_encypted = rsa.encrypt(pw_string.encode('

utf-8

'), key)

self.password = ''

#清空password

passwd =binascii.b2a_hex(pw_encypted)

print

(passwd)

return

passwd

defenablecookies(self):

#建立乙個cookies 容器

#將乙個cookies容器和乙個http的cookie的處理器繫結

#建立乙個opener,設定乙個handler用於處理http的url開啟

#安裝opener,此後呼叫urlopen()時會使用安裝過的opener物件

urllib.request.install_opener(opener)

defbuild_post_data(self,raw):

post_data =

data = urllib.parse.urlencode(post_data).encode('

utf-8')

print

(data)

return

data

deflogin(self):

url = '

'self.enablecookies()

data =self.get_prelogin_args()

post_data =self.build_post_data(data)

headers =

try:

request = urllib.request.request(url=url,data=post_data,headers=headers)

response =urllib.request.urlopen(request)

html = response.read().decode('

gbk'

)

print

(html)

except

urllib.error as e:

print

(e.code)

p = re.compile('

location\.replace\(\'(.*?)\'\)')

p2 = re.compile(r'

"userdomain":"(.*?)"')

try:

login_url = p.search(html).group(1)

print

(login_url)

request =urllib.request.request(login_url)

response =urllib.request.urlopen(request)

page = response.read().decode('

utf-8')

print

(page)

login_url = '

' + p2.search(page).group(1)

request =urllib.request.request(login_url)

response =urllib.request.urlopen(request)

final = response.read().decode('

utf-8')

print

(final)

print("

login success!")

except

:

print('

login error!')

return

0userlogin = userlogin('

13031325732

','zn123456')

userlogin.login()

view code

出現的一些問題:

1獲取登陸名的b64encode編碼和url的quote轉化,得出的結果一定要和瀏覽器中的network比較是否正確

2請求路徑的版本問題/學習鏈結中的是ssologin.js(v1.4.18),/而我現在(2018-04-15)卻是ssologin.js(v1.4.19)/

但現在請求ssologin.js(v1.4.18)依然可以/存在一些猜測

學習心得:

首先登陸一般都會有加密處理,微博在輸入使用者名稱後請求得到一些驗證所需的東西比如用於密碼加密的公鑰等等,

其次檢視登陸按鈕後的請求,確定請求的路徑和引數,一般都會密碼加密處理,設定handers和data和url後請求即可。最後是網頁請求的重新定向問題,用正規表示式擷取再請求即可。

說的好簡單( ̄▽ ̄)"我搞了兩三天,基礎太薄弱,還有一些問題比如cookie的設施/

微博模擬登陸

因公司需求,需要爬取微博相關大v的賬號以及相關資訊,一開始是直接爬取,發現只可以爬取10條資料 沒有登陸的情況下 所以就涉及到模擬登陸。import requests import json import base64 from lxml import etree from bs4 import b...

Python 模擬微博登陸,親測有效!

今天想做乙個微博爬個人頁面的工具,滿足一些不可告人的秘密。那麼首先就要做那件必做之事!模擬登陸 是參考了 https www.45 我對 進行了優化,重構成了python 3.6 版本,並且加入了大量注釋方便大家學習。在提交post請求之前,需要get 獲取兩個引數。位址是 http login.s...

Python 新浪微博爬蟲之模擬登陸

目前,親測能用的步驟是 通過預登入,使用get方法,獲得登入所需的servertime,nonce,pubkey,rsakv 使用encode64加密使用者名稱,使用rsa演算法加密密碼 登入。步驟一 response格式為 換行是我自己加上去的 sinassocontroller.prelogin...