爬虫微博模拟登陆-从移动端到PC端

爬虫登陆微博,相信是诸多爬虫爱好者必须跨过得一道坎。这不,这几天我也在研究如何能够快速而简洁得实现登陆功能。
当然,前期工作一定要做好,我先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端模拟登陆。

你可能感兴趣的:(爬虫微博模拟登陆-从移动端到PC端)