JAVA WebSpider

站在巨人的肩膀上

  1. 开源网络爬虫实现

  2. 爬虫原理

虚拟表单提交

HtmlUnit

简介
HtmlUnit本来是一款自动化测试的工具,它采用了HttpClient和java自带的网络api结合来实现,它与HttpClient的不同之处在于,它比HttpClient更“人性化”。 在写HtmlUnit代码的时候,仿佛感觉到的就是在操作浏览器而非写代码,得到页面(getPage)– 寻找到文本框(getElementByID || getElementByName || getElementByXPath 等等)– 输入文字(type,setValue,setText等等)– 其他一些类似操作 – 找到提交按钮 – 提交 – 得到新的Page,这样就非常像一个人在后台帮你操作浏览器一样,而你要做的就是告诉他如何操作以及需要填入哪些值。

HtmlUnit实现页面静态化

HtmlUnit与HttpClient比较

HttpClient

简介
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

使用详解

HttpClient与HttpURLConnection比较

简单实现

NameValuePair nameValuePair1 = new BasicNameValuePair("name", "yang");
NameValuePair nameValuePair2 = new BasicNameValuePair("pwd","123123");
List nameValuePairs = new ArrayList();
nameValuePairs.add(nameValuePair1);
nameValuePairs.add(nameValuePair2);
String validateURL = "http://10.0.2.2:8080/testhttp1/TestServlet";
try {
        HttpParams httpParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParams,5000); //设置连接超时为5秒
        HttpClient client = new DefaultHttpClient(httpParams); // 生成一个http客户端发送请求对象
        HttpPost httpPost = new HttpPost(urlString); //设定请求方式
          if (nameValuePairs!=null && nameValuePairs.size()!=0) {
              //把键值对进行编码操作并放入HttpEntity对象中
              httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));
           }
        HttpResponse httpResponse = client.execute(httpPost); // 发送请求并等待响应
          // 判断网络连接是否成功
          if (httpResponse.getStatusLine().getStatusCode() != 200) {
             System.out.println("网络错误异常!!!!");
             return false;
           }
        HttpEntity entity = httpResponse.getEntity(); // 获取响应里面的内容
        inputStream = entity.getContent();  // 得到服务气端发回的响应的内容(都在一个流里面)
        // 得到服务气端发回的响应的内容(都在一个字符串里面)
        // String strResult = EntityUtils.toString(entity); 
      } catch (Exception e) {
   System.out.println("这是异常!");
  }

注意问题

1.一般重定向都是GET的方式提交(response.sendRedirect(url?mesage=xxxx);)。也可以post的方式提交,实现如下

HttpClient http=new HttpClient (response);
http.setParameter("message","xxxx");
http.sendByPost(url);

HttpURLConnection

具体用法详解

部分实现代码

HttpURLConnection connection = (HttpURLConnection)url.openConnection();
initConnct(connection, cookie);
int responseCode = connection.getResponseCode();
int contentLength = connection.getContentLength();
if (responseCode != HttpURLConnection.HTTP_OK|| contentLength<=0) return(null);
InputStream in = connection.getInputStream();

注意问题

1.当设置了setDoOutput(true)时,必须设置为POST方式提交,成对出现;

2.setInstanceFollowRedirects(false),禁止本次链接重定向;

3.setFollowRedirects(),设置所有的HTTP链接自动处理重定向

4.setRequestProperty(“User-Agent”, ” Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36”),有的服务器禁止应用程序访问,设置后可以解决

5.setRequestProperty(“Content-Type”,“application/x-www-form-urlencoded” / “multipart/form-data”);
两种格式有区别,后者能够实现文件上传,前者不能

具体区别

6.所有setRequestProperty函数必须在connect()前,outputstream的设定必须在getInputStream()前。

7.connect()函数可以不调用,getInputStream()函数会默认调用该函数。

8.HTTPURLConnection是按照HTTP协议的直接提交数据到服务端,不会做前台验证。

爬虫实现

简介

网络爬虫通过遍历互联网络,把网络中的相关网页全部抓取过来。图的遍历方式分为宽度遍历和深度遍历,但是深度遍历可能会在深度上过深的遍历或者陷入黑洞。所以,大多数爬虫采用宽度优先遍历。另一方面,爬虫在按照宽度优先遍历的方式时候,会给待遍历的网页赋予一定优先级,这种叫做带偏好的遍历。

示例代码

Download

示例代码包含爬虫示例WebSpider(包含Ant运行版本);htmlUnit示例,JS虚拟表单提交示例,HttpURLConnection示例。

你可能感兴趣的:(httpclient,htmlunit,webspider,HttpUrlcon)