毕设题目要使用到新浪微博数据,所以要爬取新浪微博的数据。一般而言,新浪微博的爬虫有两种模式:新浪官方API和模拟登录新浪微博。两种方法的异同点和适用情况就无须赘述了。前辈的文章已经非常多了。写这篇文章主要记录自己的探究过程。

参考文章:1,解析新浪微博的登录过程

     2,[Javascript] 爬虫 模拟新浪微博登陆

     3,用java程序模拟登陆新浪微博

背景知识:Http协议,HttpClient开源包。

1,微博登陆流程

使用Firefox下的HttpFox或者Chrome下的[工具]->[开发者工具](F12快捷键启动)可以查看浏览器与网站服务器之间的报文交换信息。

我使用的是FireFox下面的HttpFox。建议提前删除FireFox之前保存的关于新浪微博的Cookies。这样登录过程更明显。

首先在地址栏中输入weibo.com网址,进入到登陆界面。然后开启HttpFox,输入账号(account)和密码(password),单击登录按键,正常登陆。

如上图四个高亮项所示,微博的登录过程主要为四步HTTP请求:

(1)GET  http://login.sina.com.cn/sso/prelogin.php

(2)POST http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)

(3)GET http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&sudaref=weibo.com

(4)GET http://weibo.com/u/5081950920/home?wvr=5&uut=fin&from=reg

下面对四步进行解析:

(1)GET http://login.sina.com.cn/sso/prelogin.php

此步骤是向服务器请求servertime,nonce等参数。此时可暂不了解这些参数的用处。

首先GET请求的参数为:

这里,‘su’参数是登录账户account经过BASE64加密过后得到的字符串,先将account中的‘@’替换为'%40',然后对其BASE64加密,得到su的值。‘_’参数的值是当前时间(毫秒值)。其余参数值一般不变。

样例:

http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=Y29tbWVudHN3ZWlibyU0MDE2My5jb20%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.11)&_=1395726032529

向服务器发送这个请求后,会得到服务器的JSon格式的返回值:

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1395726033,"pcid":"gz-3271d864f76816bbfbd651c6887ba9eabf59","nonce":"04DGHY","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","showpin":0,"exectime":157})

retcode为0表示执行成功;servertime,nonce是后期对用户密码password加密用的参数。pubkey是加密用的公钥,它的值一般为固定不变的,任何一次请求返回值都一样。raskv也是加密使用的参数。其余参数用处不大。

(2)POST http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)

这一步就是向服务器提交表单,表单参数为:

Parameter Value 说明
entry weibo 固定值                                                  
gateway 1 固定值
from   空值
savestate 7 固定值
useticket 1 固定值
pagerefer   空值
vsnf 1 固定值
su Y29tbWVudHN3ZWlibyU0MDE2My5jb20= 账号account经过BASE64加密后得到的值
service miniblog 固定值
servertime 1395726063 上一步获取的值
nonce 04DGHY 上一步获取的值
pwencode rsa2 新浪所使用的加密方法,具体值与新浪使用算法有关。短期内应该为固定值
rsakv 1330428213 上一步获取的值
sp

一个256位的密文

密码password加密后的值,具体加密方法下面详细介绍
encoding UTF-8 固定值
prelt 171 一个在[100, 1000]内取随机值
url http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack 固定值
returntype META 固定值

将该表单提交到URL:

http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)

这个URL版本不断变化,现在为版本1.4.11。自己开发代码时,可以注意一下当时的具体版本。

上述参数pagerefer有时候会改为

ssosimplelogin                                 1                           固定值           
但是,经过验证,两者互换无差别。
重点为su和sp的获取。
su:用户名usrname,就是输入的账户account,一般为邮件地址,经过BASE64加密后获得。
 
sp:密码password经过加密后获得。加密算法有两种。登陆 weibo.com时,会获取新浪微博的一个名字为ssologin.js的 js 脚本文件,在weibo.com的页面中连接为 http://js.t.sinajs.cn/t35/miniblog/static/js/sso.js?version=8818b2c42b785af9 。上面截图没有截取,可自行截取,在输入weibo.com前打开HttpFox即可。

该脚本文件中包含了整个登陆过程,同时包含了 RSA加密算法,WSSE加密算法和BASE64加密算法。目前该脚本文件的版本为 1.4.11 ,版本一直在升级,升级过程加密算法可能会做更改。具体加密过程此处不表,课查看js该文件,或者翻阅文章开头的链接博文,里面讲解比较详细。

具体而言,就是RSA加密算法是将servertime,nonce与账户密码链接,同时设置rsaPubkey和‘10001’(固定值)作为参数,进行RSA加密,现在执行的是这一版本。

RSA:
request["servertime"] = me.servertime;
request["nonce"] = me.nonce;
request["pwencode"] = "rsa2";
equest["rsakv"] = me.rsakv;
var RSAKey = new sinaSSOEncoder.RSAKey();
RSAKey.setPublic(me.rsaPubkey, '10001');
password = RSAKey.encrypt([me.servertime, me.nonce].join("\t") + "\n" + password);

WSSE加密算法曾经作为sp的加密算法,现在不采用,以后或许也会重新采用。具体行为就是两次SHA1加密password,然后加入servertime和nonce再SHA1加密一次。

WSSE:
request["servertime"] = me.servertime;
request["nonce"] = me.nonce;
request["pwencode"] = "wsse";
password=sinaSSOEncoder.hex_sha1(""sinaSSOEncoder.hex_sha1(sinaSSOEncoder.hex_sha1(password)) + me.servertime + me.nonce);

然后表单提交之后,会得到一个html文件(在HttpFox中查看Content内容)。

        <html>
<head>
<title>ÐÂÀËͨÐÐÖ¤</title>
<meta http-equiv="refresh" content="0; url='http://weibo.com/sso/login.php?url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=ST-NTA4MTk1MDkyMA==-1395726048-gz-E9A629068822EF01DD1427CA6D0C14D9&retcode=0'"/>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
</head>
<body bgcolor="#ffffff" text="#000000" link="#0000cc" vlink="#551a8b" alink="#ff0000">
<script type="text/javascript" language="javascript">
location.replace("http://weibo.com/sso/login.php?url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=ST-NTA4MTk1MDkyMA==-1395726048-gz-E9A629068822EF01DD1427CA6D0C14D9&retcode=0");
</script>
</body>
</html>

重点在于

<script type="text/javascript" language="javascript">
location.replace("http://weibo.com/sso/login.php?url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=ST-NTA4MTk1MDkyMA==-1395726048-gz-E9A629068822EF01DD1427CA6D0C14D9&retcode=0");
</script>

在location.replace中会有个URL地址。我们要抽取出这个URL。

注意:如果rectcode不为0,则表示到此为止一切步骤都正常执行。如果返回其他值,则表示执行错误,无法向下继续执行。

(3)这步在HttpFox中表现为Redirect to第二步抽取的URL,所以我们在Coding时,直接请求这个网址即可获得微博登陆权限。

(4)这步是做个示范,微博登录成功以后,即可访问新浪微博的URL了。

上述过程如果是用Java实现,使用HttpClient来访问URL,一定要注意,Login时,从头到尾只能使用一个HttpClient,因为HttpClient会保存一系列的cookie,如果new一个新的HttpClient,这些保存全部没有,访问无法进行。

第三四部,会涉及一系列的Cookies,可以使用Cookies来实现跳转。但是我没有具体分析。

Java实现模拟登录新浪微博的更多相关文章

  1. 测试开发Python培训:模拟登录新浪微博-技术篇

    测试开发Python培训:模拟登录新浪微博-技术篇   一般一个初学者项目的起点就是登陆功能的自动化,而面临的项目不同实现的技术难度是不一样的,poptest在做测试开发培训中更加关注技术难点,掌握技 ...

  2. 【Python3爬虫】最新的模拟登录新浪微博教程

    一.写在前面 首先呢,由于之前重装系统,又要重新配置环境,然后还有一些别的事,导致我一直没有写爬虫了,不过现在又可以继续写了. 然后我这次说的模拟登录新浪微博呢,不是使用Selenium模拟浏览器操作 ...

  3. Java爬虫模拟登录——不给我毛概二的H某大学

    你的账号访问太频繁,请一分钟之后再试! 从大一开始 就用脚本在刷课 在专业课踢的只剩下一门C#的情况下 活活刷到一周的课 大二开始教务系统多了一个非常**的操作 退课池 and 访问频繁缓冲 难道,我 ...

  4. 模拟登录新浪微博(Python) - 转

    Update: 如果只是写个小爬虫,访问需要登录的页面,采用填入cookie 的方法吧,简单粗暴有效,详细见:http://www.douban.com/note/264976536/模拟登陆有时需要 ...

  5. curl模拟登录新浪微博

     这几天要做个获取新浪微博@我的信息, 又不用第三方登录,所以只能通过模拟登录来获取信息,研究的一下发现直接模拟登录微博比较困难,验证的算法比较复杂,于是绕道通过登录新浪通行证后来获取cookie 来 ...

  6. 【python网络编程】使用rsa加密算法模块模拟登录新浪微博

    一.基础知识 http://blog.csdn.net/pi9nc/article/details/9734437 二.模拟登录 因为上学期参加了一个大数据比赛,需要抓取数据,所以就想着写个爬虫抓取新 ...

  7. Java爬虫——模拟登录知乎

    登录界面,首先随意输入一个账号,登录查看发送表单的请求 可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: passwo ...

  8. 模拟登录新浪微博(Python)

    PC 登录新浪微博时, 在客户端用js预先对用户名.密码都进行了加密, 而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分. 这样, 就不能用通常的那种简单方法来模拟POST ...

  9. Android(Java) 模拟登录知乎并抓取用户信息

    前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅 ...

随机推荐

  1. maven中distributionManagement

    分发构件至远程仓库 mvn install 会将项目生成的构件安装到本地Maven仓库,mvn deploy 用来将项目生成的构件分发到远程Maven仓库.本地Maven仓库的构件只能供当前用户使用, ...

  2. vagrant特性——基于docker开发环境(docker和vagrant的结合)-2-命令

    Docker Commands Docker provider公开了一些额外的vagrant命令,这些命令对于与Docker容器交互非常有用.这有助于你在vagrant之上的工作流程,这样你就可以在底 ...

  3. [转]在C++中容易出现的#error No Target Architecture

    项目环境:win 7 64位,编译环境:VS2013 最近在写C++的项目,发现了自己很多不会的地方,这也使得我在C++中的成长变得比较快,下面我就说说我自己在写项目是遇到的一些问题,希望可以帮到一些 ...

  4. Python2.7-stat

    stat模块,用于解释 os.stat(),os.lstat(),os.fstat() 返回的结果,定义了许多表示文件或路径的各个状态的常数和测试各个状态的函数具体参考 官方文档 和 http://w ...

  5. Leetcode——64. 最小路径和

    题目描述:题目链接 同样对于这个问题,我们可以考虑用动态规划来解决. 解决动态规划常见的三个步骤: 1:问题的归纳.对于 i,j 位置上的最短路径可以用d[ i ][ j ]表示. 2:归纳递推式:d ...

  6. loadrunner中pacing的设置

    通常我们在谈到一个软件的“性能”的时候,首先想到的就是“响应时间”和“并发用户数”这两个概念.我们看到的性能需求经常都是这样定义的: “要求系统支持 100 个并发用户” 看到这样的性能需求,我们往往 ...

  7. jqgrid 设置冻结列

    有时,jqgrid表格的列非常多,而表格的宽度值是固定的,我们需要在表格底部出现滚动条,并且固定前面几个列作为数据参照项,如何实现? 需要用的jqgrid冻结列,步骤如下: 1)设置需要冻结的列属性, ...

  8. odoo销售转生产

    <!--form view 一个form视图足以--><record id="view_sale_tomrp_form" model="ir.ui.vi ...

  9. 利尔达推出工控解决方式 串口转以太网模块LSD1ES-W5500_S2E0

    利尔达最近推出工控解决方式,串口转以太网模块LSD1ES-W5500_S2E0,模块基于WIZnet-W5500. 同一时候,这也是利尔达科技集团成为WIZnet代理商后,自行推出的第一款基于WIZn ...

  10. 20155233 《网络对抗》Exp2 后门原理与实践

    实验过程 1.Win获得Linux Shell windows:使用ipconfig指令查看本机ip: windows:使用ncat命令打开监听: Linux反弹连接win: 输入 nc window ...