HttpClient 入门

本贴最后更新于 2718 天前,其中的信息可能已经东海扬尘

java 爬虫

java 爬虫:
主要是用 HttpClient 模拟浏览器请求第三方站点 url
然后响应,获取网页数据,
然后用 Jsoup 来提取我们需要的信息;

这里首先说一下 HttpClient 的用法,直接上代码:

CloseableHttpClient httpClient=HttpClients.createDefault(); // 创建httpClient实例   
HttpGet httpget = new HttpGet("http://www.evafjs.cn/"); // 创建httpget实例  
CloseableHttpResponse response=null;    
 try {
        response = httpClient.execute(httpget);
    } catch (ClientProtocolException e) {  // http协议异常
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) { // io异常
        // TODO Auto-generated catch block
        e.printStackTrace();
    } // 执行get请求  
 HttpEntity entity=response.getEntity(); // 获取返回实体
    try {
        System.out.println("网页内容:"+EntityUtils.toString(entity, "utf-8"));
    } catch (ParseException e) {  // 解析异常
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) { // io异常
        // TODO Auto-generated catch block
        e.printStackTrace();
    } // 指定编码打印网页内容
    try {
        response.close();
    } catch (IOException e) {  // io异常
        // TODO Auto-generated catch block
        e.printStackTrace();
    } // 关闭流和释放系统资源
}

这种方法不是万能的,有的服务器会有反爬虫:

系统检测亲不是真人行为,因系统资源限制,我们只能拒绝你的请求。

这时我们就要模拟浏览器设置下 User-Agemt 头消息:
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0"); // 设置请求头消息User-Agent

HttpClient 获取响应内容类型 Content-Type

  entity.getContentType().getValue()

运行输出:

Content-Type:text/html; charset=utf-8   

当然 Content-Type 还有一堆,那这东西对于我们爬虫有啥用的,我们再 > 爬取网页的时候 ,可以通过 Content-Type 来提取我们需要爬取的网页 或者是爬取的时候 ,需要过滤掉的一些网页

HttpClient 获取响应状态 Status

我们 HttpClient 向服务器请求时,

正常情况 执行成功 返回 200 状态码,

不一定每次都会请求成功,

比如这个请求地址不存在 返回 404

服务器内部报错 返回 500

有些服务器有防采集,假如你频繁的采集数据,则返回 403 拒绝你请求

  response.getStatusLine().getStatusCode()  

运行输出:

    Status:200  

代理 IP

在爬取网页的时候,有的目标站点有反爬虫机制,对于频繁访问站点以及规则性访问站点的行为,会采集屏蔽 IP 措施
这时候,代理 ip 就派上用场了;

分享几个代理 ip 的网站(可用:随缘)

建议使用高匿代理 IP 国内代理 IP 以及主干道网络大城市的代理 IP 访问速度快
http://www.xicidaili.com/
http://www.66ip.cn/
HttpHost proxy=``new HttpHost(``"116.226.217.54"``, ``9999``);

RequestConfig requestConfig=RequestConfig.custom().setProxy(proxy).build();

httpGet.setConfig(requestConfig);

HttpClient 连接超时及读取超时

httpClient 在执行具体 http 请求时候 有一个连接的时间和读取内容的时间;

HttpClient 连接时间

所谓连接的时候 是 HttpClient 发送请求的地方开始到连接上目标 url 主 > 机地址的时间,理论上是距离越短越快,

线路越通畅越快,但是由于路由复杂交错,往往连接上的时间都不固定,> 运气不好连不上,HttpClient 的默认连接时间,据我测试,

默认是 1 分钟,假如超过 1 分钟 过一会继续尝试连接,这样会有一个问题 > 假如遇到一个 url 老是连不上,会影响其他线程的线程进去,说难听点,

就是蹲着茅坑不拉屎。所以我们有必要进行特殊设置,比如设置 10 秒钟 假如 10 秒钟没有连接上 我们就报错,这样我们就可以进行业务上的处理,

比如我们业务上控制 过会再连接试试看。并且这个特殊 url 写到 log4j 日 > 志里去。方便管理员查看。

HttpClient 读取时间

所谓读取的时间 是 HttpClient 已经连接到了目标服务器,然后进行内容 > 数据的获取,一般情况 读取数据都是很快速的,

但是假如读取的数据量大,或者是目标服务器本身的问题(比如读取数据 > 库速度慢,并发量大等等..)也会影响读取时间。

同上,我们还是需要来特殊设置下,比如设置 10 秒钟 假如 10 秒钟还没读 > 取完,就报错,同上,我们可以业务上处理。

HttpClient 给我们提供了一个 RequestConfig 类 专门用于配置参数比如连接时间,读取时间以及前面讲解的代理 IP 等。
HttpGet httpGet=new HttpGet("http://central.maven.org/maven2/"); // 创建httpget实例
RequestConfig config=RequestConfig.custom()
.setConnectTimeout(5000)
.setSocketTimeout(5000)
.build();
httpGet.setConfig(config);

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    jsoup 可以直接发请求的,也能够设置超时、代理的,所以似乎没必要用 HttpClient 了 😄

    1 回复
  • 其他回帖
  • 416584102

    Jsoup parse(URL url, int timeoutMillis)
    D 大说的可是这个方法?

    1 回复
  • 88250

    我记得还有 connect 方法,链式调用那种

  • AlanTuring

    每次看到你们谈论我没涉及到的领域,我都很沮丧;但是我能怎么办,我也很无奈啊 😆

  • 查看全部回帖