觉得自己是时候该沉淀了。。。说起来,自学Java网络爬虫也有两个月了,期间走了很多弯路,我也不禁对Java和Python这两门同样都能搞爬虫的语言但与之相关的文档与书籍的差别感到惊讶,对于Java来说,目前我知道的有关介绍Java网络爬虫这方面的书籍只有《自己动手写网络爬虫》,对于其中的内容,我觉得是晦涩难懂,不适合入门,并且内容相对来说感觉有点过时。
我觉得我必须开个博客专栏,对于之后想要入门Java网络爬虫的兄弟姐妹们,好减少一点他们在学习途中的迷茫,我期间是迷茫了好几次,但最终还是坚持下来了。对于Java和Python来说,很多人刚开始都不知道该选择哪门语言,在此我也不多做评价,有需要的请百度,或知乎。
其实我个人觉得,除非是特别情况,还是选择Python爬虫比较好。
请求URL
在这里我先说一下,对于一般需求性的网络爬虫来说,使用HttpClient请求页面,使用Jsoup解析页面,提取自己想要的数据,基本就可以开始“爬”,当初我就是使用这两个包,加上模拟请求和URL请求队列,抓取了豆瓣影评,四页共50条数据(虽然数据有点少,但总算是抓下来了)。
在学习的途中,由于HttpClient这个项目已经更新,但网络上的资料陈旧,用的是HttpClient过时的包,所以我也是摸索了好久,在这里给大家列出最新的用法~对于HttpClient这个第三方库有疑问的可以自行百度,我们在写项目的时候需要引入,对于怎么在IDEA中加入第三方库,我的另一篇博客Java学习笔记–整合数据库中有详细说明,这里我只演示它的用法。
HttpClient给我们提供了非常强大的请求URL的功能,他可以用来模拟浏览器行为,可以进行网站请求头的添加和修改来完成模拟登录,可以获得服务器响应过来的实体消息,是进行URL请求的一个利器。对于HTTP状态码和Web与服务器之间进行的交互不清楚的,推荐一本书《图解HTTP》,这也是进行网络爬虫所要掌握的基础知识。
接下来给大家上代码,多说无益。
/**
* Created by paranoid on 17-1-19.
*/
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpCLientDemo {
public static void main (String[] args) throws Exception {
// 创建默认的客户端实例
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建get请求实例
HttpGet httpget = new HttpGet("http://www.baidu.com");
System.out.println("executing request " + httpget.getURI());
try {
// 客户端执行get请求返回响应
CloseableHttpResponse response = httpClient.execute(httpget);
// 服务器响应状态行
System.out.println(response.getStatusLine().toString());
Header[] heads = response.getAllHeaders();
System.out.println(response.getHeaders("Content-Type"));
// 打印所有响应头
for(Header h:heads){
System.out.println(h.getName()+":"+h.getValue());
}
} finally {
httpClient.close();
}
}
}
返回响应
使用上面代码我们已经成功请求到URL,接下来需要将整个页面的源码抓取下来,提取我们所需要的数据。
这时候就要使用HttpClient返回实体的内容。
import org.apache.http.Header;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import static java.lang.System.out;
public class HttpClientDemo {
public static void main(String[] args){
//创建客户端
CloseableHttpClient closeableHttpClient = HttpClients.createDefault();
//创建请求Get实例
HttpGet httpGet = new HttpGet("https://www.baidu.com");
//添加头部信息模拟浏览器访问
httpGet.setHeader("Accept", "text/html,application/xhtml+xml," +
"application/xml;q=0.9,image/webp,*/*;q=0.8");
httpGet.setHeader("Accept-Encoding", "gzip, deflate, sdch, br");
httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.8");
httpGet.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" +
" (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
try {
//客户端执行httpGet方法,返回响应
CloseableHttpResponse closeableHttpResponse = closeableHttpClient.execute(httpGet);
//得到服务响应状态码
if(closeableHttpResponse.getStatusLine().getStatusCode() == 200)
//得到响应实体
String entity = EntityUtils.toString (closeableHttpResponse.getEntity(), "utf-8");
}
else{
//如果是其他状态码则做其他处理
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}