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