爬虫登陆微博,相信是诸多爬虫爱好者必须跨过得一道坎。这不,这几天我也在研究如何能够快速而简洁得实现登陆功能。
当然,前期工作一定要做好,我先google + 百度了一把市面上的微博登陆教程,发现基本上都是PC端的base64加密用户名,然后RSA加密拼接关键信息,最后组合成POST的from data 进行登陆。
摆在我面前的有两条路,一条走PC端,一条走移动端。鉴于PC端已经有详尽教程,此时,我决定走一走移动端的路子。基于以往经验,任何网站如果有移动端,那一定是非常容易进行爬取的。果不其然,移动端的微博登陆比我想象得还要简单,一个简单的POST即可搞定。
与此同时,在抓包的过程中,我亦发现,微博在移动端登陆以后,会先访问3个cross domain的网址来设置cookie。此刻,请大家注意,经过这三个cross domain的设置后,我们居然可以直接以登陆状态访问PC端。即在技术上以移动端作为翘板,完美避开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端的登陆状态,此时可以以登录状态直接访问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端模拟登陆。