您的位置:首页 > 编程语言 > Java开发

Java模拟新浪微博登陆抓取数据

2017-05-17 13:50 323 查看
Java模拟新浪微博登陆抓取数据

前言:
兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以[b]今天有时间就整理整理,浅谈一二。[/b]
首先:
要想登陆新浪微博需要预登陆,即是将账号base64加密,密码rsa加密以及请求http://login.sina.com.cn/sso/prelogin.php链接获取一些登陆需要参数,返回的接送字符串如:

{"retcode":0,"servertime":1487292003,"pcid":"gz-9e1f24c9acdefb111e1c8078558c7d9c0bf2","nonce":"VHRDG1","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","is_openlock":0,"lm":1,"smsurl":"https:\/\/login.sina.com.cn\/sso\/msglogin?entry=weibo&mobile=18360903574&s=ea7a2e91c5f1d6da7f42aa87fe6963d0","showpin":0,"exectime":222}


,接下来是预登陆处理代码:

其次:
获取登陆需要的参数后使用post请求http://login.sina.com.cn/sso/login.php,将上述预登陆后处理数据作为参数代入请求,得到结果如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>新浪通行证</title>

<script charset="utf-8" src="http://i.sso.sina.com.cn/js/ssologin.js"></script>
</head>
<body>
正在登录 ...
<script>
try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["http:\/\/passport.97973.com\/sso\/crossdomain?action=login&savestate=1518828005","http:\/\/passport.weibo.cn\/sso\/crossdomain?action=login&savestate=1"]});}
catch(e){
var msg = e.message;
var img = new Image();
var type = 1;
img.src = 'http://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type;
}try{sinaSSOController.crossDomainAction('login',function(){location.replace('http://passport.weibo.com/wbsso/login?ssosavestate=1518828005&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&ticket=ST-NTUwODg3MjkxMQ==-1487292005-gz-FF56C545999F864FC6C7AB86FCA9FA4A-1&retcode=0');});}
catch(e){
var msg = e.message;
var img = new Image();
var type = 2;
img.src = 'http://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type;
}
</script>
</body>
</html>


然后用正则截取其中我们想要的部分:location.replace('')中间部分,正则表达式为:

String regex = "location.replace\\('([\\s\\S]*?)'\\);";


将正则得到的结果进行处理,如果成功则使用get请求得到的链接,截取返回结果的括号部分得到一个json格式字符串:

{"result":true,"userinfo":{"uniqueid":"5508872911","userid":null,"displayname":null,"userdomain":"?wvr=5&lf=reg"}}


,取出其中的uniqueid和userdomain用于访问个人主页,登陆部分的代码如下:

  补充一下密码加密部分的代码:

  

/**

* @author LongJin

* @description 返回错误信息

* @return

*/

public String getErrInfo() {

return errInfo;

}

登陆部分就基本完成了。
最后来进行测试登陆抓取数据:

  得到的结果为:

text--------------我投给了"易建联" 这个选项。 #本土MVP# 本赛季常规赛最有价值球员(MVP)评选小组由中国篮协新闻委员会成员单位代表、俱乐部推荐的地方媒体代表组成,新浪拥有一票,我们将把粉丝们的意见发给篮协。 R本赛季本土MVP是? ????




到此整个登陆就完成了,佛说,无私奉献是一种美德,所以博主将此篇博客分享给大家,用来共同学习进步,望有不足之处多提点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: