`
kevinflynn
  • 浏览: 41216 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

模拟登陆百度的Java实现

阅读更多

常常需要爬取百度统计出来的数据,难免要进行百度的模拟登陆!现将程序贴出来,供他人也供自己以后使用:

 

 

package org.baidu;


import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;

/**
 * HTTPCLIENT请求封装。
 * @author kevin
 */
@SuppressWarnings("deprecation")
public class BaiduConnectService {

	private CookieStore cookieStore = new BasicCookieStore();
	
	private BaiduConnectService(){}
	
	private static class BaiduConnectServiceContainer{
		private static BaiduConnectService bc = new BaiduConnectService();
	}
	
	public static BaiduConnectService getInstance(){
		System.out.println("初始化:BaiduConnectService.");
		return BaiduConnectServiceContainer.bc;
	}
	
	public HttpResponse execute(String url) throws Exception{
		return this.execute(url,null);
	}
	
	public HttpResponse execute(String url, List<NameValuePair> params) throws Exception{
		HttpClient httpClient = new DefaultHttpClient(
				new ThreadSafeClientConnManager());
		HttpResponse response = null;
		HttpUriRequest request = null;
		if (params != null) {
			HttpPost httpPost = new HttpPost(url);
			try {
				HttpEntity postBodyEnt = new UrlEncodedFormEntity(params);
				httpPost.setEntity(postBodyEnt);
			} catch (Exception e) {
				e.printStackTrace();
			}
			request = httpPost;
		} else {
			HttpGet httpGet = new HttpGet(url);
			request = httpGet;
		}
		HttpContext localContext = new BasicHttpContext();
		localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
		response = httpClient.execute(request, localContext);
		System.out.println("[HTTP状态码:" + response.getStatusLine().getStatusCode() + "]" + "-->Request URL:" + url);
		return response;
	}

	public CookieStore getCookieStore() {
		return cookieStore;
	}

	public void setCookieStore(CookieStore cookieStore) {
		this.cookieStore = cookieStore;
	}
}

 

package org.baidu;


import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

/**
 * 百度登录SERVICE.
 * @author kevin
 */
public class BaiduLoginService {

	private BaiduConnectService bc = BaiduConnectService.getInstance();
	private static final String BAIDU_URL = "http://www.baidu.com";
	private static final String TOKEN_GET_URL = "https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&class=login&logintype=dialogLogin";
	private static final String LOGIN_POST_URL = "https://passport.baidu.com/v2/api/?login";
	private static final String QUERY_GET_URL="http://index.baidu.com/?tpl=trend&word=%D5%F7%B2%F0";
	
	private String username;
	private String password;
	private String verifycode;
	private String codestring;
	private String token;
	
	public BaiduLoginService(String username,String password,String verifycode,String codestring){
		this.username = username;
		this.password = password;
		this.verifycode = verifycode;
		this.codestring = codestring;
	}
	
	// test
	public static void main(String[] args) throws Exception{
		// 请确保你在www.baidu.com可以登录成功。
		new BaiduLoginService("账号", "密码","","").login();
		// 下载百度文库。
//		new BaiduDownloadService("http://wenku.baidu.com/view/71ce3ec60c22590102029dd1.html").download();
	}
	
	public void login() throws Exception{
		System.out.println("准备登录 . Usename:"+username);
		// 预登录,获取cookie以便获取token.
		bc.execute(BAIDU_URL);
		this.initToken();
		System.out.println("正在登录。");
		HttpResponse response = bc.execute(LOGIN_POST_URL, produceFormEntity());
		String result = EntityUtils.toString(response.getEntity());
		String statusCode = this.substring(result, "error=", "'");
		System.out.println("百度返回的状态码:" + statusCode);
		// 自动识别验证码。
//		 tools.autoCode(codestring);
		EntityUtils.consume(response.getEntity());
		System.out.println("--------------------------------");
		if(!checkLogin()){
			System.out.println("登录异常或频繁,需要验证码,codeString为:" + this.substring(result, "codestring=", "&"));
			System.out.println("登录结果:" + username + " 登录失败.");	
		}else{
			System.out.println("登录结果:" + " 登录成功.");
		}
		
//		this.queryKeywordsUrl();
		
		
	}
	
	private void queryKeywordsUrl() throws Exception {
		System.out.println("获取关键词的百度指数...");
		HttpResponse response = bc.execute(QUERY_GET_URL);
		String str = EntityUtils.toString(response.getEntity());
		System.out.println(str);

//        未被收录,如要查看相关数据,您需要购买创建新词的权限。
		if(str.contains("未被收录")){
			System.out.println("关键词未被收录");
		}else{
			System.out.println("关键词已被收录");
		}
//		Pattern pattern = Pattern.compile("token\" : \"(.*?)\"");
//		Matcher matcher = pattern.matcher(str);
//		if(matcher.find()){
//			token = matcher.group(1);
//		}
//		System.out.println("Token已获取:"+token);
	}

	public NodeList getNodeByName(String content,String tag,String name){
		Parser parser = Parser.createParser(content, "utf-8");
		AndFilter filter = new AndFilter(new TagNameFilter(tag),new HasAttributeFilter("name",name));
		try {
			return parser.parse(filter);
		} catch (ParserException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	// 登录POST参数
	private List<NameValuePair> produceFormEntity() throws UnsupportedEncodingException{
		List<NameValuePair> list = new ArrayList<NameValuePair>();
		list.add(new BasicNameValuePair("tt", ""+System.currentTimeMillis()));
		list.add(new BasicNameValuePair("tpl", "mn"));
		list.add(new BasicNameValuePair("token", token));
		list.add(new BasicNameValuePair("isPhone", ""));
		list.add(new BasicNameValuePair("username", username));
		list.add(new BasicNameValuePair("password", password));
		list.add(new BasicNameValuePair("verifycode", verifycode));
		list.add(new BasicNameValuePair("codestring", codestring));
		return list;
	}
	
	private void initToken() throws Exception{
		System.out.println("获取百度Token...");
		HttpResponse response = bc.execute(TOKEN_GET_URL);
		String str = EntityUtils.toString(response.getEntity());
		Pattern pattern = Pattern.compile("token\" : \"(.*?)\"");
		Matcher matcher = pattern.matcher(str);
		if(matcher.find()){
			token = matcher.group(1);
		}
		System.out.println("Token已获取:"+token);
	}
	
	private boolean checkLogin() throws Exception{
		HttpResponse response = bc.execute(BAIDU_URL);
		boolean res = false;
		String content = EntityUtils.toString(response.getEntity());
		if(!content.contains("登录")){
			res = true;
		}
		EntityUtils.consume(response.getEntity());
		return res;
	}
	
	public static String substring(String str, String s1, String s2) {
		// 1、先获得0-s1的字符串,得到新的字符串sb1
		// 2、从sb1中开始0-s2获得最终的结果。
		try {
			StringBuffer sb = new StringBuffer(str);
			String sb1 = sb.substring(sb.indexOf(s1) + s1.length());
			return String.valueOf(sb1.substring(0, sb1.indexOf(s2)));
		} catch (StringIndexOutOfBoundsException e) {
			return str;
		}
	}
}

   运行BaiduLoginService即可实现登陆!

 

   项目所需的jar包如下:

   项目所需jar包

 

 

  • 大小: 9.9 KB
0
4
分享到:
评论
4 楼 kevinflynn 2015-06-18  
qindongliang1922 写道
验证码能自动破解么

没有写有验证码的功能!Sorry!
3 楼 qindongliang1922 2015-06-17  
验证码能自动破解么
2 楼 kevinflynn 2015-06-17  
是这样的!还是得不断地学习,不断地总结经验才可以!
1 楼 hellohank 2015-06-17  
现在的很多网页,包括百度,页面上大量使用了js动态加载或js解析等方式展示内容,使用httpCleint方式已经不能很好的抓取这些信息了~
前两天我抓取一些百度地图上的一些信息时,一开始也是使用HttpClient,结果……被迫写了一个基于WebDriver的。HttpClient速度快,但不支持js动态内容;WebDriver完全调用浏览器,但效率低!

相关推荐

    Java模拟登录百度Demo

    本项目名为"Java模拟登录百度Demo",旨在通过Java编程语言实现对百度网站的自动登录功能。在这个教程中,我们将深入探讨如何使用Java来完成这一目标。 首先,模拟登录的核心是发送HTTP请求。在Java中,我们可以使用...

    模拟登陆百度

    本文将详细讲解如何使用Java语言模拟登录百度网站,并且这个方法可以通用到其他网站的登录实现。 首先,理解模拟登录的基本原理:通过编程的方式,模拟用户在浏览器上填写表单、点击登录按钮的过程,向服务器发送...

    httpclient4之百度模拟登陆,回复与58同城自动登陆

    本主题将深入探讨如何使用HttpClient4库进行百度和58同城的模拟登陆操作。HttpClient4是一个强大的Java库,它提供了丰富的功能来执行HTTP请求,非常适合进行网页交互。 首先,我们来了解HttpClient4的基本用法。...

    selenium+phantomjs实现百度模拟登陆

    本文将详细讲解如何利用Selenium与PhantomJS实现对百度的模拟登录,以及它们背后的核心概念和技术。 Selenium是一个开源的Web应用程序自动化测试框架,它允许开发者编写脚本来控制浏览器进行各种操作,如点击、输入...

    模拟登陆v3版百度源码(自行替换用户名密码)

    这里提到的"模拟登陆v3版百度源码"是一个用于模拟登录百度账户的Java程序。下面我们将深入探讨这个主题。 首先,模拟登录通常涉及到以下几个关键知识点: 1. **HTTP/HTTPS协议**:网络通信的基础,理解GET和POST...

    selenium+phantomjs实现各大网站模拟登陆,已实现微博、知乎、QQ空间、CSDN、京东、163邮箱、CSDN、百度

    本项目利用Selenium和PhantomJS工具实现了对多个知名网站(微博、知乎、QQ空间、CSDN、京东、163邮箱、百度)的模拟登录功能。下面将详细解释这个项目涉及的关键知识点。 首先,**Selenium** 是一个强大的Web应用...

    模拟百度登录

    本篇将深入探讨如何使用Java语言来实现模拟百度登录的过程。 首先,我们需要了解登录过程的基本步骤。通常,登录一个网站涉及以下几个环节: 1. 用户输入用户名和密码。 2. 发送HTTP请求到服务器,携带用户名和...

    java百度贴吧登陆源码-selenium:Selenium

    Java百度贴吧登录源码是基于Selenium库的一个项目,它允许开发者通过编程方式模拟用户在浏览器上的操作,实现自动登录百度贴吧的功能。Selenium是一个强大的Web自动化测试工具,它可以控制浏览器执行各种操作,如...

    利用selenium 3.7和python3添加cookie模拟登陆的实现

    ### 利用selenium 3.7和python3添加cookie模拟登陆的实现 #### 背景介绍 在进行Web自动化或爬虫开发时,经常会遇到需要登录网站的情况。特别是对于那些采用验证码验证用户身份的网站,频繁的手动登录不仅效率低下...

    Python调用谷歌浏览器打开百度

    2. Selenium库:Selenium是一款强大的自动化测试工具,能够模拟用户在浏览器上的各种操作,如点击、输入、导航等。它支持多种浏览器,包括Chrome、Firefox等,并提供了Python、Java等多种语言的绑定接口。 3. ...

    weblogin:模拟web登陆

    Java实现的各种模拟登陆,主要有: 百度 百度翻译 CSDN 人人 新浪微博 人人贷 北理邮箱 北理极速论坛 北理研会 北理研究生院 北理联盟 北理教务处 注意 已经将里面需要输入用户名和密码的地方全部用"用户名"和"密码...

    百度地图开发java源码-WebSpider:第一个蜘蛛项目,使用webmagic

    百度地图开发java源码 WebSpider first spider project,using webmagic blog: 一次JAVA爬虫之旅 前言   ...其中我们要注意的是,要模拟登陆,就要用到cookies等。下图就是一个http响应信息: 前端

    secretshare:度盘秘享(secretshare),使用二维码分享文件,妈妈再也不用担心我被

    secretshare 度盘秘享(secretshare),使用二维码分享文件,妈妈...模拟百度登陆 百度网盘REST浏览 二维码生成 二维码解析 百度网盘接口解析调用 使用到的开源项目 android support v4 & v7 commons-io gson jsoup ok

    Zabbix监控培训视频.rar

    │ 27 01-使用curl模拟登陆zabbix-web页面.mp4 │ 28 02-zabbix创建web场景监控.mp4 │ 29 03-创建web检查触发器.mp4 │ 30 04-使用percona插件监控mysql.mp4 │ 31 05-使用snmp监控linux系统.mp4 │ 32 06-使用自动...

    MKey+3G+21小时从入门到精通

    ##### 5.1 单点登陆与SSO 单点登录(Single Sign-On, SSO)是一种让用户只需登录一次就可以访问多个应用的机制。 1. 实现SSO功能,提升应用的安全性和便利性。 ##### 5.2 附件预览与上传 在移动应用中处理附件是...

    Python入门网络爬虫之精华版

    可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。当然也可以将验证码图片上传到打码平台上进行识别。如果不成功,可以再次更新验证码识别,直到成功为止。 ...

    scala从入门到精通技术教学视频

    16.综合案例_模拟登陆 第五章 方法和函数 00.导学 01.方法入门 02.返回值的类型推断 03.惰性方法 04.方法参数 05.方法调用方式 06.函数入门 07.方法和函数的区别 08.案例_打印nn乘法表 第六章 面向对象...

    IT日语单词

    登陆 (ログイン | login) - **定义**: 用户验证身份的过程。 - **应用场景**: 在使用各种软件或网站服务时,通常需要先进行登录才能正常使用。 #### 25. 退出 (ログアウト | logout) - **定义**: 用户结束会话并...

Global site tag (gtag.js) - Google Analytics