java 实现模拟浏览器 访问网站

一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面 有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都 不会构成问题。不过你可能在某些时候需要通过程序来访问这样的一些页面,比如从别人的网页中“偷”一些数据;利用某些站点提供的页面来完成某种功能,例如 说我们想知道某个手机号码的归属地而我们自己又没有这样的数据,因此只好借助其他公司已有的网站来完成这个功能,这个时候我们需要向网页提交手机号码并从 返回的页面中解析出我们想要的数据来。如果对方仅仅是一个很简单的页面,那我们的程序会很简单,本文也就没有必要大张旗鼓的在这里浪费口舌。但是考虑到一 些服务授权的问题,很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册然后登录后方可使用提供服务的页面,这个时候就涉 及到COOKIE问题的处理。我们知道目前流行的动态网页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。为了使我们的程序能使用别人所 提供的服务页面,就要求程序首先登录后再访问服务页面,这过程就需要自行处理cookie,想想当你用 java.net.HttpURLConnection来完成这些功能时是多么恐怖的事情啊!况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的 “顽固”!再有如通过HTTP来上传文件呢?不需要头疼,这些问题有了“它”就很容易解决了!

我们不可能列举所有可能的顽固,我们会 针对几种最常见的问题进行处理。当然了,正如前面说到的,如果我们自己使用java.net.HttpURLConnection来搞定这些问题是很恐怖 的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于Jakarta的 commons项目,目前的版本是2.0RC2。commons下本来已经有一个net的子项目,但是又把httpclient单独提出来,可见http 服务器的访问绝非易事。

Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可 以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给 httpclient替你完成。本文会针对我们在编写HTTP客户端程序时经常碰到的几个问题进行分别介绍如何使用httpclient来解决它们,为了 让读者更快的熟悉这个项目我们最开始先给出一个简单的例子来读取一个网页的内容,然后循序渐进解决掉前进中的所有问题。

1.  读取网页(HTTP/HTTPS)内容
下面是我们给出的一个简单的例子用来访问某个页面

package http.demo;
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;

public class SimpleClient {
    public static void main(String[] args) throws IOException
    {
        HttpClient client = new HttpClient();
        //设置代理服务器地址和端口
     //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);
        //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https
        HttpMethod method = new GetMethod("http://java.sun.com";);
        //使用POST方法
     //HttpMethod method = new PostMethod("http://java.sun.com";);
        client.executeMethod(method);
        //打印服务器返回的状态
     System.out.println(method.getStatusLine());
       //打印返回的信息
     System.out.println(method.getResponseBodyAsString());
       //释放连接
     method.releaseConnection();
    }
} 

在这个例子中首先创建一个HTTP客户端(HttpClient)的实例,然后选择提交的方法是GET或者POST,最后在HttpClient实 例上执行提交的方法,最后从所选择的提交方法中读取服务器反馈回来的结果。这就是使用HttpClient的基本流程。其实用一行代码也就可以搞定整个请 求的过程,非常的简单!

2.  以GET或者POST方式向网页提交参数
其实前面一个最简单的示例中我们已经介绍了如何使用 GET或者POST方式来请求一个页面,本小节与之不同的是多了提交时设定页面所需的参数,我们知道如果是GET的请求方式,那么所有参数都直接放到页面 的URL后面用问号与页面地址隔开,每个参数用&隔开,例如:http://java.sun.com/?name=liudong&mobile=123456,但是当使用POST方法时就会稍微有一点点麻烦。本小节的例子演示向如何查询手机号码所在的城市,代码如下:

package http.demo;
 import java.io.IOException;
 import org.apache.commons.httpclient.*;
 import org.apache.commons.httpclient.methods.*;

 public class SimpleHttpClient {
     public static void main(String[] args) throws IOException
     {
         HttpClient client = new HttpClient();
         client.getHostConfiguration().setHost("www.imobile.com.cn", 80, "http");
         HttpMethod method = getPostMethod();//使用POST方式提交数据
      client.executeMethod(method);
        //打印服务器返回的状态
      System.out.println(method.getStatusLine());
        //打印结果页面
     String response =   new String(method.getResponseBodyAsString().getBytes("8859_1"));
        //打印返回的信息
      System.out.println(response);
         method.releaseConnection();
     }

     private static HttpMethod getGetMethod(){
         return new GetMethod("/simcard.php?simcard=1330227");
     }

     private static HttpMethod getPostMethod(){
         PostMethod post = new PostMethod("/simcard.php");
         NameValuePair simcard = new NameValuePair("simcard","1330227");
         post.setRequestBody(new NameValuePair[] { simcard});
         return post;
     }
 } 

在上面的例子中页面http://www.imobile.com.cn/simcard.php需要一个参数是simcard,这个参数值为手机号码段,即手机号码的前七位,服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。GET的提交方法只需要在URL后加入参数信息,而POST则需要通过NameValuePair类来设置参数名称和它所对应的值

https://www.ibm.com/developerworks/cn/opensource/os-httpclient/ 参考另外文章

时间: 2024-11-07 14:47:53

java 实现模拟浏览器 访问网站的相关文章

java程序模拟浏览器访问Web服务器的处理过程

import java.net.*; import java.io.*; /* * 演示浏览器访问Web服务器的处理过程 */ public class WebServerDemo { public static void main(String[] args)throws IOException{ ServerSocket ss=new ServerSocket(10000); Socket s=ss.accept(); byte[] bytes=new byte[1024]; int len

黄聪:wordpress如何携带cookie模拟浏览器访问网站

$args = array( 'user-agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 'headers' => array( 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q

php -- php模拟浏览器访问网址

目前我所了解到的在php后台中,用php模拟浏览器访问网址的方法有两种: 第一种:file_get_contents($url) 通过php内置的 file_get_contents 函数可以模拟浏览器访问网址的行为,取的结果就是那个网址所返回的所有东西(这种情况一般用于返回的是 xml 格式字符串或者 json 字符串) 第二种:curl curl 是 php 提供的内置函数,其功能非常强大,封装常用的http,soap,ftp等协议 微信主要通过其进行模拟POST请求 1)初始化curl 2

python爬虫模拟浏览器访问-User-Agent

模拟浏览器访问-User-Agent: import urllib2 #User-Agent 模拟浏览器访问 headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"} #通过urllib2.Request()方法构造一个请求对象 request

浏览器访问网站的过程

前言 当我们在浏览器中输入一个网址,比如www.百度.com,浏览器就会加载出百度的主页.那么浏览器背后完成的具体是怎么样的呢?总结起来大概的流程是这样的: (1)浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP (2)然后通过IP地址找到IP对应的服务器后,要求建立TCP连接 (3)浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包 (4)在服务器收到请求之后,服务器调用自身服务,返回HTTP

9、使用selenium + phantomjs 模拟浏览器登录网站

''' Selenium 模拟浏览器爬取网页信息 一种是真实的浏览器,也即是在程序调用浏览器时,会打开相应的浏览器来显示, 如:chrome,ie,safari,firefox 一种是伪浏览器,没有浏览器界面,只负责处理html,js和cookie的功能. 如:htmlunit,phantomjs 使用示例 ''' #author toloy from selenium import webdriver # driver = webdriver.Chrome("C:\Program Files

Chrome浏览器模拟手机访问网站

1. 按F12开打开发者工具,点击红框部分按钮 2. 点击红框部分 3. 输入网址试一下

火狐浏览器访问网站出现 HTTP Error 400. The request is badly formed.错误,怎么解决

今天在访问某个网站时,出现一个"HTTP Error 400. The request is badly formed."错误, 那么应该如何解决呢? 1.问题描述: 用火狐浏览网站出现""HTTP Error 400. The request is badly formed."错误 2.问题原因: Http error 400错误请求,是客户端问题,跟服务器没关系(也就是本地出问题了) 3.解决方法: 通过清理垃圾.清洁注册表,或检查广告拦截模块及防火墙

linux部署的java应用,浏览器访问时,报域名解析错误

工作中,经常需要在Linux环境中部署Tomcat,配置java应用.在浏览器中访问应用时,却报域名解析错误,该怎么样解决呢? 解决方法:关闭防火墙 iptables -L -n     查看已添加的iptables规则 iptables -F service iptables save 它会保存在/etc/sysconfig/iptables这个文件中