这个系列我分四个部分来分别接触四块知识,最后再串起来:
Java爬虫入门(一)——项目介绍
Java爬虫入门(二)——HttpClient请求
Java爬虫入门(三)——正则表达式
Java爬虫入门(四)——线程池和连接池
Java爬虫入门(五)——缓冲流写入
GitHub地址:
https://github.com/jjc123/Java-Crawler/blob/master/README.md
第一步:HttpClient请求
注意三点:
1. 连接的选择:不使用HttpURLConnection
HttpClient就是一个增强版的HttpURLConnection,
HttpURLConnection可以做的事情HttpClient全部可以做;
HttpURLConnection没有提供的有些功能,HttpClient也提供了,
但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。
2. 实体类的读取
强烈不推荐使用 EntityUtils 类,
除非响应实体来源于可信的 HTTP 服务器,并且知道它的最大长度。
所以这一步我用的是字符缓冲流
3. 我讲爬取的网页保存到txt文件中,而不是内存
//爬取所需网页
public class GetContent {
private BufferedReader bufferedReader = null;
private BufferedWriter bufferedWriter = null;
public void getContent() throws URISyntaxException, IOException {
// 获取爬取网络的地址
URI url = new URIBuilder().setScheme("https").setHost("www.baidu.com").build();
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
CloseableHttpResponse httpResponse = null;
File file = new File("src/a.txt");// 指定要写入的文件
if (!file.exists()) {// 如果文件不存在则创建
file.createNewFile();
}
bufferedWriter = new BufferedWriter(new FileWriter(file));
try {
httpResponse = httpClient.execute(httpGet);
HttpEntity entity = httpResponse.getEntity();
// 获取编码信息
InputStream is = entity.getContent();
String line = "";
// 转换为缓冲流,提高效率,可以按行读取
bufferedReader = new BufferedReader(new InputStreamReader(is, "utf-8"));
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
bufferedWriter.write(line);
bufferedWriter.newLine();
}
bufferedWriter.flush();
bufferedWriter.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (httpResponse != null) {
httpResponse.close();
}
}
}
}
这是最基础的用法,一开始我是这样写的,不过后来项目报错,原因:
一段时间内请求网络太多,请求接口close无法真正关闭连接,而是让其等待。所以导致请求不够用,这个时候我找了点资料,用上了连接池,可以看下节了解下,也可以看我的git源码