请教一下关于如何抓取新浪微博手机版的数据

陳宏博 发布于 2012/03/18 18:34
阅读 4K+
收藏 2
最近,由于实验设计需要,需要大量抓取微博中的数据,
在采取了一些网友的建议下,我试着写了一个Java程序配合HTMLparser去抓取新浪微博手机版页面的数据。
但是,在抓取用户页面中的数据时,意外遇到了需要本人先登录后才能访问他人页面的问题。

为了解决登录问题,我查取了大量资料。似乎HttpClient能配合实现自动登录。
但是,新浪微博手机版的登录框却是一个很特别的登录设计,
请看代码高亮部分。

<form action="login_submit.php?rand=1615712919&amp;backURL=http%3A%2F%2Fm.weibo.com%2F&amp;backTitle=%D0%C2%C0%CB%CE%A2%B2%A9&amp;vt=4&amp;revalid=2&amp;ns=1" method="post">
<div class="mg">
手机号/电子邮箱/会员帐号:<br/><input type="text" name="mobile" size="30" value=""/>
<br/>
密码:(<a href="login.php?backURL=http%3A%2F%2Fm.weibo.com%2F&amp;backTitle=%D0%C2%C0%CB%CE%A2%B2%A9&amp;vt=4&amp;revalid=2&amp;ns=1&amp;pt=1">使用明文密码</a>)<br/>
<input type="password" name="password_7069" size="30" value=""/><br/>
<input type="checkbox" name="remember" checked="checked" />记住登录状态,需支持并打开手机的cookie功能。<br/>
<input type="hidden" name="backURL" value="http://m.weibo.com/" />
<input type="hidden" name="backTitle" value="新浪微博" />
<input type="hidden" name="backURL" value="http://m.weibo.com/" /><input type="hidden" name="vk" value="7069_6c29_2038971687" /> <input type="submit" name="submit" value="登录" /><br/>

这里,账号的输入名很普通,是个固定的名称;但是,密码输入框就不一样了,它的名称是个动态生成的,而且每次访问后得到的结果都不一样。

请问在解决这个问题上该怎样处理的?下面的问号是怎样解决的?谢谢!
   HttpClient client = new HttpClient();
   PostMethod post_method = new PostMethod("http://3g.sina.com.cn/prog/wapsite/sso/login.php?ns=1&revalid=2&backURL=http%3A%2F%2Fm.weibo.com%2F&backTitle=%D0%C2%C0%CB%CE%A2%B2%A9&vt=");
        
    NameValuePair[] data = {
        new NameValuePair("mobile", "....@sina.com"),
        new NameValuePair("????", "password"),
        };
        
    post_method.setRequestBody(data);


加载中
0
tsl0922
tsl0922

你想抓取哪些数据?匿名抓页面的还是登陆再抓取?

用HttpClient不如直接用微博API来的快了,得到的都是纯数据,不需要从页面提取。

给个以前写的匿名获取最新发布微博示例(JS API):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title> Weibo测试 </title>
  <script src="http://tjs.sjs.sinajs.cn/open/api/js/wb.js?appkey=2598963202" type="text/javascript" charset="utf-8"></script>
  <script src="http://lib.sinaapp.com/js/jquery/1.6/jquery.js" type="text/javascript"></script>
  <script type="text/javascript">
	function getPublicTimeLine() {
		WB2.anyWhere(function(W){
			// 获取评论列表
			W.parseCMD("/statuses/public_timeline.json", function(sResult, bStatus){
				if(bStatus == true) {
					var html = "";
					var length = sResult.length;
					html += "<ul>";
					for(i = 0;i < length;i++) {
						var status = sResult[i];
						/*$.each(status, function(key, value) {
							html += key + ":" + value + "<br>";
						});*/
						var screen_name = status.user.screen_name;
						var text = status.text;
						var profile_image_url = status.user.profile_image_url;
						var url =status.user.url;
						html += "<li>";
						html += "<img src='" + profile_image_url +"'>" + "<br>";
						if(url != null && url != "") {
							html += "<a target='_blank' href='"+ url + "'>";
						}
						else {
							html += "<a target='_blank' href='http://weibo.com'>";
						}
						html += "<strong>" + screen_name + "</strong></a>";
						html += "说:" + text;
						html += "</li>";
					}
					html += "</ul>";
					$("#text").html(html);
				}
			},{
				source : "2598963202"
			});
		});
	}
  </script>
  <style type="text/css">
  #tip {
	color:red;
	font-size:16px;
	border:dashed 1px blue;
  }
  #text {
	color:black;
	font-size:10pt;
  }
  ul,li {
	margin:0;
	padding:0;
  }
  li {
	list-style:none;
	border-bottom:dashed red 1px;
	margin-top:5px;
  }
  </style>
 </head>

 <body>
	<a href="javascript:getPublicTimeLine();">获取最新发布微博(无需登录)</a>
	<h3>内容显示区:</h3>
	<div id="text"></div>
 </body>
</html>

B
BABA林
我想请问下 你的那个微博数据抓取成功没有
陳宏博
你好,谢谢回复。 我想要抓的是用户原创微博里的地理位置信息。大量。 API我正在使用,但是有限制,1小时之内只能访问150次。 匿名的情况下同一IP只能访问100次。 由于需求大量用户的原创信息,所以API在这里就不太适用了。 请问您还有别的什么方法吗?关于抓取数据的。。 谢谢了
0
Andre.Z
Andre.Z
子父关系、集合之类。那个输入框不就是form的第二个input么,管那个名字做啥。对象获取到了,其它的就不是问题。
陳宏博
你好,请问能稍微详细一点吗?呵呵,本人菜鸟,望指点。
0
c
cangbaotu
你可以去神箭手云爬虫上看看,里面有不少现成的爬虫可以用。
返回顶部
顶部