前言
在了解了爬虫的大概原理和目前的技术现状之后,我就开始了java爬虫的蹒跚之旅。
首先我想到的是用框架,了解到的主流的Nutch、webmagic、webcollector等等,都看了一遍,最好懂的是webmagic,因为是国人开发的,有中文文档,看的很舒服。刚开始写练手的demo之后发现都很舒服,设置好对应爬取规则、爬取深度之后,就能得到想要的数据。
但是当我正式准备开发的时候,很快就发现我的业务场景并不适用于这些框架(Emm..当然也有可能是我太菜了)。
为什么这么说呢,让我们先回到上篇中我摘录的爬虫原理,传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
也就是,目标数据所在的网页的url都是在上一层页面上可以抽取到的,对应到页面上具体的讲法就是,这些链接都是写在html 标签的 href 属性中的,所以可以直接抽取到。
那些demo中被当做抓取对象的网站一般是douban、baidu、zhihu之类的数据很大的公开网站,url都是写在页面上的,而我的目标网站时险企开放给代理公司的网站,具有不公开、私密的性质,一个页面转到下一个页面的请求一般都是通过js动态生成url发起的,并且很多是post请求。
虽然那些框架有很多优越诱人的特性和功能,本着先满足需求,在进行优化的原则,我准备先用比较底层的工具一步步的模拟这些http请求。
正好,我发现webmagic底层模拟请求的工具用的就是Apache HttpClient,所以就用这个工具来模拟了。
HttpClient
HttpClient
是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。它相比传统的 HttpURLConnection
,增加了易用性和灵活性,它不仅让客户端发送 HTTP 请求变得更容易,而且也方便了开发人员测试接口(基于 HTTP 协议的),即提高了开发的效率,也方便提高代码的健壮性
在搜索相关资料的时候,会发现网上有两种HttpClient。
org.apache.commons.httpclient.HttpClient与org.apache.http.client.HttpClient的区别:Commons的HttpClient项目现在是生命的尽头,不再被开发,已被Apache HttpComponents项目HttpClient和的HttpCore模组取代,提供更好的性能和更大的灵活性
所以在查找的时候别搞混了哦,英语好的同学推荐阅读HttpClient的官方文档
实战
所有HTTP请求都有由方法名,请求URI和HTTP协议版本组成的请求行。
HttpClient支持开箱即用HTTP/1.1规范中定义的所有HTTP方法:GET, HEAD,POST, PUT, DELETE,TRACE and OPTIONS。它们都有一个特定的类对应这些方法类型: HttpGet,HttpHead, HttpPost,HttpPut, HttpDelete,HttpTrace, and HttpOptions.
请求的URI是统一资源定位符,它标识了应用于哪个请求之上的资源。HTTP请求的URI包含协议方案,主机名,可选的端口,资源路径,可选查询和可选片段。
在开发过程中,主要处理都是get和post请求。
HTTP GET
模拟get请求
public static String sendGet(String url) {
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String content = null;
try {
HttpGet get = new HttpGet(url);
response = httpClient.execute(httpGet);
HttpEntity entity = response.ge