Java爬虫入门(二)——HttpClient请求

这个系列我分四个部分来分别接触四块知识,最后再串起来:
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源码

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/81391543