前段时间工作上需要采集别的网站上的内容,然后再自己系统中展示数据。经过自己找资料最后选用了HttpClient。以下为自己摸索的方法 记录下来以便以后使用:
1、模拟登陆
private static final Logger logger = Logger.getLogger(IpManagerRobot.class);
private DefaultHttpClient httpClient = new DefaultHttpClient();
private boolean loging = false;
public boolean login() throws Exception{
//需要登陆的地址,这里直接用登陆网站的form表单中的action属性。有的则可以直接使用...../login.jsp
String loginForm = "http://124.238.214.79/platform/j_spring_security_check";
// notifyMethod(loginForm);
HttpPost httpPost = new HttpPost(loginForm);
//设置请求头,httpwatch可以跟踪到
httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; znwb6600; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30618)");
httpPost.setHeader("Referer", "http://124.238.214.79/platform/");
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
//登陆form表单需要提交的参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("j_username", "stc2012"));
params.add(new BasicNameValuePair("j_password", "q1w2e3r4"));
params.add(new BasicNameValuePair("domain","124.238.214.79"));
params.add(new BasicNameValuePair("url","/platform/"));
params.add(new BasicNameValuePair("expiry",""));
//设置编码
try {
httpPost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
HttpResponse res = postMethod(httpPost);
if(res.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_PERMANENTLY ||
res.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY ||
res.getStatusLine().getStatusCode() == HttpStatus.SC_SEE_OTHER ||
res.getStatusLine().getStatusCode() == HttpStatus.SC_TEMPORARY_REDIRECT){
logger.info("登陆成功");
loging = true;
}else{
logger.info("登陆失败");
loging = false;
}
return loging;
}
public HttpResponse postMethod(HttpPost post) {
HttpResponse resp = null;
try {
resp = httpClient.execute(post);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
post.abort();
}
return resp;
}
2、登陆了以后就可以获取指定路径的页面内容了
public String get(String url) throws Exception{
// String url = "http://124.238.214.79/platform/pages/getWssHistory.action?startDate="+startDate+"&endDate="+endDate+"&pageContext.currentpage=1";
HttpGet get = new HttpGet(url);
try {
HttpResponse response = httpClient.execute(get);
String responseString = "";
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
HttpEntity entity = response.getEntity();
BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
responseString = IOUtils.toString(br);
}
return responseString;
} finally{
get.abort();
}
}
另一种方法获取指定路径页面的内容
public String getText2(String url) throws Exception{
HttpGet httpget = new HttpGet(url);
try {
//创建HttpGet对象实例(get method实现)
// String url = "http://124.238.214.79/platform/pages/getWssHistory.action?startDate="+startDate+"&endDate="+endDate+"&pageContext.currentpage=1";
// 创建Response Handler,这里使用了其自带的BasicResponseHandler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpClient.execute(httpget, responseHandler);
//编码转换,解决中文乱码问题
String responseString = new String(responseBody.getBytes("ISO-8859-1"),"UTF-8");
//返回网页的响应结果
return responseString;
} finally {
//代码执行完毕后,释放HttpClient占用的资源
// httpClient.getConnectionManager().shutdown();
httpget.abort();
}
}
保存指定路径页面为.htm文件
public void saveCollectionPage() throws Exception{
//这里也可以直接使用httpGet的绝对地址,当然如果不是具体地址不要忘记
HttpGet httpGet = new HttpGet("http://124.238.214.79/platform/pages/getWssHistory.action?startDate=2013-04-07&endDate=2013-05-07&pageContext.currentpage=1");
HttpResponse response = httpClient.execute(httpGet);
if(HttpStatus.SC_OK == response.getStatusLine().getStatusCode()){
//请求成功,取得请求内容
HttpEntity entity = response.getEntity();
if(entity != null){
File storeFile = new File("d:/tt.htm");
FileOutputStream output = new FileOutputStream(storeFile);
InputStream input = entity.getContent();
byte b[] = new byte[1024];
int j = 0;
while ((j = input.read(b)) != -1) {
output.write(b, 0, j);
}
output.flush();
output.close();
}
if(entity != null){
entity.consumeContent();
}
}
}
读取htm文件
public String readTextFile(String fileName,String encode){
StringBuffer str = new StringBuffer();
try {
File file = new File(fileName);
InputStreamReader read = new InputStreamReader(new FileInputStream(file),encode);
BufferedReader in = new BufferedReader(read);
String dataLine = "";
while (null != (dataLine = in.readLine())) {
str.append(dataLine);
}
in.close();
} catch (Exception e) {
logger.info("------------->文件读取失败!");
}
return str.toString();
}
</div>
分享到:
相关推荐
- 在Java程序中使用Jsoup和HttpClient来模拟登录一个网站并抓取页面内容。 - 案例中包含了登录、页面访问、内容抽取、页面修改和保存到本地等步骤,展示了完整的操作流程。 9. HTTP请求参数设置: - 设置HTTP...
在阅读博文《HttpClient模拟登陆》时,可以深入学习如何解决这些具体问题,并查看示例代码以获得更详细的实现细节。 标签“源码”意味着你需要关注底层的工作原理,而“工具”标签则暗示HttpClient作为一个实用工具...
模拟登录通常是开发自动化测试、爬虫或集成服务时必要的步骤,它允许程序模仿用户在网页上的登录行为。以下是一份使用`HttpClient`进行模拟登录的典型步骤和相关知识点: 1. **导入依赖**:首先,你需要在项目中...
1.6.1发送get请求获取网页内容 HttpClient client = new HttpClient(); //设置代理服务器地址和端口 //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port); //使用GET方法,如果服务器...
// 解析登录页面,获取可能的验证码等信息 HttpPost httpPost = new HttpPost("https://login.taobao.com/member/login.jhtml"); List<NameValuePair> params = new ArrayList(); params.add(new ...
- 使用Apache HttpClient可以通过`PostMethod`类来构造表单数据,并发送POST请求到指定的URL。 4. **自定义HTTP方法**: - 为了满足特定的需求,有时需要对Apache HttpClient中的默认方法进行扩展或修改。 - 本...
1. **请求登录页面**:使用HttpClient类向微信登录URL发起GET请求,获取登录页面的HTML内容,其中包含了用于后续请求的必要参数,如CSRF Token。 2. **填写登录信息**:根据登录页面获取的参数,构造包含用户名...
在本文中,我们将深入探讨如何使用C#编程语言来实现模拟登录微博并进行内容分享,特别是在实际项目中可能遇到的挑战和技术细节。 首先,我们需要理解C#的基础知识。C#是一种面向对象的、类型安全的编程语言,由微软...
最后,通过`DownloadString`方法获取网页内容,并更新或获取Cookie信息。 二、模拟POST请求 POST请求通常用于提交表单数据,例如登录网站时提交用户名和密码。在C#中,`WebClient.UploadString`方法可用于执行POST...
1. **HttpClient模拟登陆无法获取Cookie** - 解决方案:通过分析新浪的加密算法,并使用第三方工具如HTTPFox来捕获加密过程中的JS脚本,成功获取Cookie。 2. **通过HttpMethod请求网址之后返回内容出现乱码** - ...
这段代码创建了一个HttpClient实例,构造了POST数据,然后发送到指定URL,并获取响应内容。 接下来,我们介绍HtmlAgilityPack库。这是一个强大的.NET HTML解析器,它允许开发者以DOM(文档对象模型)方式处理HTML或...
- **建立连接**:创建HttpURLConnection对象,并连接到拍拍网的登录页面URL。 - **设置请求方法**:调用setRequestMethod("POST")方法指定为POST请求。 - **设置请求头**:模拟浏览器行为,添加必要的请求头,如...
4. **发送POST请求**:使用`PostAsync`方法发送POST请求,并指定登录页面的URL。 ```csharp HttpResponseMessage response = await httpClient.PostAsync("https://www.ganji.com/login", content); ``` 5. **处理...
3. **模拟登录**:使用C#的`HttpClient`类或者`WebClient`类来构造一个POST请求,模拟用户填写表单并提交。需要将之前解析到的字段作为POST数据传递,同时可能还需要添加一些额外的HTTP头,比如`User-Agent`和`...
Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个...