当前位置:编程学习 > C#/ASP.NET >>

[方便查看] 新浪微博爬虫系列之模拟登录

微博很火啊,开发了一个微博爬虫应用

有的人 会说 新浪微博 不是API吗,为什么还要取单独开发爬虫系统呢

如果你用过新浪微博API,你就知道,有着诸多限制,功能少,信息少,信息不全,调用次数限制,重新授权等等 一系列的问题,最主要是返回的信息量少喝调用次数限制,

还有针对IP的.

我们设计这个爬虫的初衷是新浪微博的所有信息,目前是70%,为什么不是100%呢,说到底 还是资源问题了.

新浪微博号称有3亿多人,实际上我们发现存在的加上新注册的大概在2亿左右,其他的都是僵尸用户。

这些后续 再说吧。

这个系统最重要的第一步就是模拟登录了,如果登录都不行,后续的都是扯淡.

这个模拟登录早在2011年3月份就搞定了,到现在,登录也改过好几次,主要新浪那边有变动.

新浪模拟登录不算很复杂,最麻烦的就是验证码了.

要搞清楚这个登录,必须有些工具 httpfox,httpwatch,Fidder等web抓包工具中的一个。

我这里用的是httpFox,获取浏览器

 \

weibo.com打开后,你需要找到对你登录可能产生影响的请求,上面蓝色的返回的参数都是我们需要的,貌似 现在我以前又有点不一样了,

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1346291808,"pcid":"ec06b269ce680ef43ce669d56f9abbfd9d43","nonce":"28FKAG","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213"})

servertime nonce 都是登录时候需要提交的,以及密码加密,pubkey 是RSAJS 加密的公共密钥 pcid rsakv post时候需要带上去

这些返回值你都需要保存下来。

 

现在开始登录

 \

 

分析提交的参数:

entry=weibo&gateway=1&from=&savestate=7&useticket=1&vsnf=1&sso易做图login=1&su=dGVzdCU0MHNpbmEuY29t&service=miniblog&servertime=1346292130&nonce=28FKAG&pwencode=rsa2&rsakv=1330428213&sp=29f86ffc66bbd9ed7d750777a918fdf776211ef8ce4c3d4266111df5e3ad3cd06e2c11c9811a945d245b19eaf51174e70c798735ba5c96bb97220531c4131a6dc5f7207abeb2072401901e3259912b8e2cda3b6e540049b232d72d0693d7bb8db4d8e5d03f2f2b16c0bf11e3c0137150c80d355197b84da510d8c4ca117bbc58&encoding=UTF-8&prelt=264&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&returntype=META

固定的我就不说了,

su账号base64加密 应改都会把

sp是密码的加密是下面这个方法,至于说 怎么知道这些加密的,其实也不是很复杂,你需要把这个页面的JS 下载下来单独分析,看哪个地方是最终post数据的,再逆向找加密的地方就知道了 SHAEncrypt 就是sha加密了

[csharp] 
protected static string SinaSHA(string pwd, string servertime, string nonce) 
      { 
          StringBuilder sbl = new StringBuilder(); 
 
          string tmppwd = SHAEncrypt(SHAEncrypt(pwd)); 
 
          sbl.Append(tmppwd); 
          sbl.Append(servertime); 
          sbl.Append(nonce); 
 
          return SHAEncrypt(sbl.ToString()); 
      } 

 

servertime,nonce,rsakv,pdid(主要是在需要验证码的时候获取)获取过的

 

参数都解决了,再看返回值


  <html>
  <head>
  <title>ÐÂÀËͨÐÐÖ¤</title>
  <meta http-equiv="refresh" content="0; url='http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3'"/>
  <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/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3");
  </script>
  </body>
  </html>

只有当retcode=0的时候 才是登录成功,其他的都是登录失败,

101密码错误

5 也是密码错误

4057 你的账号异常了,需要人工认证下,

4049,2070 是需要验证码哦。

这里是登录失败了。如果是登录成功

<html>
<head>
<title>Sina Member</title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />

<script charset="utf-8" src="http://i.sso.sina.com.cn/js/ssologin.js"></script>
</head>
<body>
Signing in ...
<script>
try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["http:\/\/kandian.com\/logon\/do_crossdomain.php?action=login&savestate=1346897732","http:\/\/login.t.cn\/sinaurl\/sso.json?action=login&uid=你账号的UID"]});}catch(e){}try{sinaSSOController.crossDomainAction('login',function(){location.replace('http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1346897732&ticket=ST-MTk3NDEyNjk1NQ==-1346292932-xd-B6F5BF7A5E4438EA368D6116E6FD1622&retcode=0');});}catch(e){}
</script>
</body>
</html>

这个retcode=0的就是登录成功了.

接下来 就需要提取这里面的3个URL了,分别请求一遍就OK了

值得注意的是,这一些列都要用同一个CookieContainer

 

到此,登录就成功了,接下来看需要验证码的.

当你的IP,或者账号 对新浪来说有怀疑的时候,主要是访问次数过多的问题的,或者你账号异常的情况,需要你输入验证码

找了半天,账号都忘记了,一时找不到 登录需要验证码的账号

如果是需要验证码:

 

post时候加个参数就可以了

door=验证码

当然你请求验证码的时候需要pcid就是上面的那个,同时需要同一个cooki了,

至于验证码怎么解决,我在验证码识别中有记录.

 

这样登录就都搞定了。

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,