爬蟲登陸微博辛燥,相信是諸多爬蟲愛好者必須跨過得一道坎盈厘。這不,這幾天我也在研究如何能夠快速而簡潔得實現(xiàn)登陸功能盗胀。
當然艘蹋,前期工作一定要做好,我先google + 百度了一把市面上的微博登陸教程票灰,發(fā)現(xiàn)基本上都是PC端的base64加密用戶名女阀,然后RSA加密拼接關(guān)鍵信息咱娶,最后組合成POST的from data 進行登陸。
擺在我面前的有兩條路强品,一條走PC端膘侮,一條走移動端。鑒于PC端已經(jīng)有詳盡教程的榛,此時琼了,我決定走一走移動端的路子》蛏危基于以往經(jīng)驗雕薪,任何網(wǎng)站如果有移動端,那一定是非常容易進行爬取的晓淀。果不其然所袁,移動端的微博登陸比我想象得還要簡單,一個簡單的POST即可搞定凶掰。
與此同時燥爷,在抓包的過程中,我亦發(fā)現(xiàn)懦窘,微博在移動端登陸以后前翎,會先訪問3個cross domain的網(wǎng)址來設(shè)置cookie。此刻畅涂,請大家注意港华,經(jīng)過這三個cross domain的設(shè)置后,我們居然可以直接以登陸狀態(tài)訪問PC端午衰。即在技術(shù)上以移動端作為翹板立宜,完美避開PC端復雜的校驗和加密。
曲線救國臊岸,古之人誠不我欺也!
Talk is cheap. Show me the code橙数。
#-*- coding=utf-8
from requests import Session
import json
def formatUrl(urldict):
for key,value in urldict.items():
urldict[key]=value.replace("\\",'')
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
'Referer':'https://passport.weibo.cn/signin/login?entry=mweibo'}
cookies={'_s_tentry':'news.ifeng.com',
'UOR':'news.ifeng.com,widget.weibo.com,tech.ifeng.com'}
url='https://passport.weibo.cn/sso/login'
username=input('pls input weibo ID: ')
pwd =input('pls input weibo password: ')
fromdata={'username':username,'password':pwd,
'savestate':'1','r':None,'ec':'0','pagerefer':None,
'entry':'mweibo','wentry':None,'loginfrom':None,
'client_id':None,'code':None,'qq':None,'mainpageflag':'1',
'hff':None,'hfp':None}
with Session() as s:
s.headers.update(headers)
resp = s.post(url,data=fromdata)
cross_domain_list = json.loads(resp.text)['data']['crossdomainlist']
formatUrl(cross_domain_list)
s.get(cross_domain_list['weibo.com'],cookies=cookies)
#通過cross_domain 獲取PC端的登陸狀態(tài),此時可以以登錄狀態(tài)直接訪問PC端的頁面扇单,從而繞過諸多加密校驗
s.get(cross_domain_list['sina.com.cn'])
s.get(cross_domain_list['weibo.cn'])
s.headers.update({'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'})
resp=s.get('https://weibo.com/')
with open('webo.html','wb') as f:
f.write(resp.content)
我宣布:微博的世界商模, 爬蟲大軍來啦!
注:如果需要鍛煉JS解析能力蜘澜,建議還是走PC端模擬登陸施流。