常常需要爬取百度统计出来的数据,难免要进行百度的模拟登陆!现将程序贴出来,供他人也供自己以后使用:
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包如下:
相关推荐
本项目名为"Java模拟登录百度Demo",旨在通过Java编程语言实现对百度网站的自动登录功能。在这个教程中,我们将深入探讨如何使用Java来完成这一目标。 首先,模拟登录的核心是发送HTTP请求。在Java中,我们可以使用...
本文将详细讲解如何使用Java语言模拟登录百度网站,并且这个方法可以通用到其他网站的登录实现。 首先,理解模拟登录的基本原理:通过编程的方式,模拟用户在浏览器上填写表单、点击登录按钮的过程,向服务器发送...
本主题将深入探讨如何使用HttpClient4库进行百度和58同城的模拟登陆操作。HttpClient4是一个强大的Java库,它提供了丰富的功能来执行HTTP请求,非常适合进行网页交互。 首先,我们来了解HttpClient4的基本用法。...
本文将详细讲解如何利用Selenium与PhantomJS实现对百度的模拟登录,以及它们背后的核心概念和技术。 Selenium是一个开源的Web应用程序自动化测试框架,它允许开发者编写脚本来控制浏览器进行各种操作,如点击、输入...
这里提到的"模拟登陆v3版百度源码"是一个用于模拟登录百度账户的Java程序。下面我们将深入探讨这个主题。 首先,模拟登录通常涉及到以下几个关键知识点: 1. **HTTP/HTTPS协议**:网络通信的基础,理解GET和POST...
本项目利用Selenium和PhantomJS工具实现了对多个知名网站(微博、知乎、QQ空间、CSDN、京东、163邮箱、百度)的模拟登录功能。下面将详细解释这个项目涉及的关键知识点。 首先,**Selenium** 是一个强大的Web应用...
本篇将深入探讨如何使用Java语言来实现模拟百度登录的过程。 首先,我们需要了解登录过程的基本步骤。通常,登录一个网站涉及以下几个环节: 1. 用户输入用户名和密码。 2. 发送HTTP请求到服务器,携带用户名和...
Java百度贴吧登录源码是基于Selenium库的一个项目,它允许开发者通过编程方式模拟用户在浏览器上的操作,实现自动登录百度贴吧的功能。Selenium是一个强大的Web自动化测试工具,它可以控制浏览器执行各种操作,如...
### 利用selenium 3.7和python3添加cookie模拟登陆的实现 #### 背景介绍 在进行Web自动化或爬虫开发时,经常会遇到需要登录网站的情况。特别是对于那些采用验证码验证用户身份的网站,频繁的手动登录不仅效率低下...
2. Selenium库:Selenium是一款强大的自动化测试工具,能够模拟用户在浏览器上的各种操作,如点击、输入、导航等。它支持多种浏览器,包括Chrome、Firefox等,并提供了Python、Java等多种语言的绑定接口。 3. ...
Java实现的各种模拟登陆,主要有: 百度 百度翻译 CSDN 人人 新浪微博 人人贷 北理邮箱 北理极速论坛 北理研会 北理研究生院 北理联盟 北理教务处 注意 已经将里面需要输入用户名和密码的地方全部用"用户名"和"密码...
百度地图开发java源码 WebSpider first spider project,using webmagic blog: 一次JAVA爬虫之旅 前言 ...其中我们要注意的是,要模拟登陆,就要用到cookies等。下图就是一个http响应信息: 前端
secretshare 度盘秘享(secretshare),使用二维码分享文件,妈妈...模拟百度登陆 百度网盘REST浏览 二维码生成 二维码解析 百度网盘接口解析调用 使用到的开源项目 android support v4 & v7 commons-io gson jsoup ok
│ 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-使用自动...
##### 5.1 单点登陆与SSO 单点登录(Single Sign-On, SSO)是一种让用户只需登录一次就可以访问多个应用的机制。 1. 实现SSO功能,提升应用的安全性和便利性。 ##### 5.2 附件预览与上传 在移动应用中处理附件是...
可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。当然也可以将验证码图片上传到打码平台上进行识别。如果不成功,可以再次更新验证码识别,直到成功为止。 ...
16.综合案例_模拟登陆 第五章 方法和函数 00.导学 01.方法入门 02.返回值的类型推断 03.惰性方法 04.方法参数 05.方法调用方式 06.函数入门 07.方法和函数的区别 08.案例_打印nn乘法表 第六章 面向对象...
登陆 (ログイン | login) - **定义**: 用户验证身份的过程。 - **应用场景**: 在使用各种软件或网站服务时,通常需要先进行登录才能正常使用。 #### 25. 退出 (ログアウト | logout) - **定义**: 用户结束会话并...