Java爬虫系列二:使用HttpClient抓取页面HTML

爬虫要想爬取需要的信息,首先第一步就要抓取到页面html内容,然后对html进行分析,获取想要的内容。上一篇随笔《Java爬虫系列一:写在开始前》中提到了HttpClient可以抓取页面内容。今天就

大家好,又见面了,我是全栈君。

爬虫要想爬取需要的信息,首先第一步就要抓取到页面html内容,然后对html进行分析,获取想要的内容。上一篇随笔《Java爬虫系列一:写在开始前》中提到了HttpClient可以抓取页面内容。

今天就来介绍下抓取html内容的工具:HttpClient。

围绕下面几个点展开:

  1. 什么是HttpClient

  2. HttpClient入门实例

  3. 复杂应用
  4. 结束语

一、什么是HttpClient

度娘说:

HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的官网:
(1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器等

这里面提到了官网,那就顺便说下它官网上的一些东西。

根据百度给出的HomePage是这个:http://hc.apache.org/httpclient-3.x/,但是进入后你会发现有句话

Java爬虫系列二:使用HttpClient抓取页面HTML

大意是:Commons HttpClient这个项目已经不再维护了,它已经被Apache HttpComponents替代了。也就是说我们以后要用的话就用新的。点这个Apache HttpComponents的链接进去能看到它最新的版本是4.5,而且有快速上手的例子和专业的说明文档。有兴趣并且英文好的朋友可以好好研究下哦 ~~Java爬虫系列二:使用HttpClient抓取页面HTML

额~~那个~~我的英文不好,就不按照官网的来了,直接给出我自己在网上学的练习案例~~

 

二、HttpClient入门实例

  1. 新建一个普通的maven项目:名字随便起,我的叫:httpclient_learn
  2. 修改pom文件,引入依赖
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.8</version>
    </dependency>

     

  3. 新建java类
    package httpclient_learn;
    
    import java.io.IOException;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.utils.HttpClientUtils;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    public class HttpClientTest {
        
        public static void main(String[] args) {
            //1.生成httpclient,相当于该打开一个浏览器
            CloseableHttpClient httpClient = HttpClients.createDefault();
            CloseableHttpResponse response = null;
            //2.创建get请求,相当于在浏览器地址栏输入 网址
            HttpGet request = new HttpGet("https://www.cnblogs.com/");
            try {
                //3.执行get请求,相当于在输入地址栏后敲回车键
                response = httpClient.execute(request);
                
                //4.判断响应状态为200,进行处理
                if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    //5.获取响应内容
                    HttpEntity httpEntity = response.getEntity();
                    String html = EntityUtils.toString(httpEntity, "utf-8");
                    System.out.println(html);
                } else {
                    //如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
                    System.out.println("返回状态不是200");
                    System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //6.关闭
                HttpClientUtils.closeQuietly(response);
                HttpClientUtils.closeQuietly(httpClient);
            }
        }
    }

     

  4. 执行代码,我们会发现打印出来的其实就是首页完整的html代码
    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        //Java开发老菜鸟备注:由于内容太多,具体不再贴出来了
    </head>
    <body>
      //Java开发老菜鸟备注:由于内容太多,具体内容不再贴出来了
    </body> </html>

    操作成功!

好了,到这里就完成了一个简单的小例子。

爬一个网站不过瘾,再来一打。接下来我们换个网站:https://www.tuicool.com/,你会发现结果是这样的:

返回状态不是200
<!DOCTYPE html>
<html>
    <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <p>系统检测亲不是真人行为,因系统资源限制,我们只能拒绝你的请求。如果你有疑问,可以通过微博 http://weibo.com/tuicool2012/ 联系我们。</p>
    </body>
</html>

爬虫程序被识别了,怎么办呢? 别着急,慢慢往下看

三、复杂应用

第二个网站访问不了,是因为网站有反爬虫的处理,怎么绕过他呢?

1.最简单的是对请求头进行伪装,看代码,加上红框里面的内容后再执行

Java爬虫系列二:使用HttpClient抓取页面HTML

你会发现返回结果变了,有真内容了(红字警告先不管它,我们起码获取到了html内容)

Java爬虫系列二:使用HttpClient抓取页面HTML

那代码中新加的那段内容是哪里来的呢?

请打开谷歌浏览器的F12,对就是这里了:

Java爬虫系列二:使用HttpClient抓取页面HTML

当然我们还可以设置请求的其他头信息,如cookie等

2.上面说的是伪装成浏览器,其实如果你伪装了之后,如果短时间内一直多次访问的话,网站会对你的ip进行封杀,这个时候就需要换个ip地址了,使用代理IP

网上有一些免费的代理ip网站,比如xici

Java爬虫系列二:使用HttpClient抓取页面HTML

我们选择那些存活时间久并且刚刚被验证的ip,我这里选择了“112.85.168.223:9999”,代码如下

//2.创建get请求,相当于在浏览器地址栏输入 网址
        HttpGet request = new HttpGet("https://www.tuicool.com/");
        //设置请求头,将爬虫伪装成浏览器
        request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
        HttpHost proxy = new HttpHost("112.85.168.223", 9999);
        RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
        request.setConfig(config);

执行代码,能正常返回html结果。如果代理ip刚好不能用的话,会报错,如下显示连接超时,这个时候需要更换一个新的代理ipJava爬虫系列二:使用HttpClient抓取页面HTML

3.另外,程序被识别出来很大原因是短时间内做了太多访问,这个是正常人不会有的频率,因此我们也可以放慢爬取的速度,让程序sleep一段时间再爬下一个也是一种反 反爬虫的简单方法。

 

四、结束语

这篇简单介绍了下httpclient和它的官网,并用代码说明了如何使用它,也提到了如果遇到反爬虫的话我们还可以用一些简单的反反爬虫方法进行应对。

对于其他复杂的反反爬虫的方法我还没有研究过,就是用这几种结合使用。 比如在爬取了一段时间后,网站需要输入验证码来验证是人在操作,我没有去管如何突破验证码的事儿,而是获取代理ip池然后在遇到验证码的时候逐个换新的ip,这样就可以躲过了验证码。如果有其他方法,欢迎留言哦

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120890.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nginx负载均衡原理简介_负载均衡算法有哪些

    nginx负载均衡原理简介_负载均衡算法有哪些前言今天这篇文章介绍了负载均衡的原理以及对应的四种负载均衡算法,当然还有对应的指令及实战,欢迎品尝。有不同意见的朋友可以评论区留言!负载均衡所谓负载均衡,就是Nginx把请求均匀的分摊给上游的应用服务器,这样即使某一个服务器宕机也不会影响请求的处理,或者当应用服务器扛不住了,可以随时进行扩容。Nginx在AKF可扩展立方体上的应用在x轴上,可以通过横向扩展应用服务器集群,Nginx基于Round-Robin或者Least-Connected算法..

    2022年8月31日
    1
  • Ansi,UTF8,Unicode,ASCII编码的差别

    Ansi,UTF8,Unicode,ASCII编码的差别

    2021年12月7日
    56
  • 宿主机和虚拟机的网络_vmware独享宿主机网卡

    宿主机和虚拟机的网络_vmware独享宿主机网卡问题描述:宿主机为win10家庭版,虚拟机为Centos7,上午还可以正常的进行互通,中间应该是弹出来一个外设的接入通知,其他的没有什么明显的操作,下午就不能互相访问了,原因不明。解决方法:首先检查虚拟机的网络配置,分为如下几步:1、编辑–>虚拟机网络编辑器,选择桥接模式,同时选择要桥接的网络:这个网路需要和宿主机中的网络保持一致,如果宿主机中存在多个网络连接,比如无线连接和有线连接,那就根据实际需要,看虚拟机需要连接到哪个网络中,就对应选择。选择完之后,确

    2022年8月21日
    3
  • Generic Host Process for Win32 Services 错误

    Generic Host Process for Win32 Services 错误机器运行时防火墙一直提示“GenericHostProcessforWin32Services”访问网络,选阻止后系统就一直弹出一个GenericHostProcessforWin32Services遇到问题需要关闭的对话框!在资源管理器中把系统文件的隐藏属性打开后,发现每个盘的根目录下和C:/WINDOWS目录下都有一个gg.exe文件,每个盘的根目录下有一个autoru

    2022年10月12日
    0
  • J2ME开发视频下载

    J2ME开发视频下载最近在学习J2ME开发方面的内容,下面这些视频下载地址是我通过Orbit下载工具,收集整理出来,已证明可下载。你只须将这些下载地址复制到Orbit或迅雷中,就可以批量下载这些视频教学!http://images.enet.com.cn/eschool/j2me/16-3.swfhttp://images.enet.com.cn/eschool/j2me/24-1.swf…

    2022年7月27日
    2
  • keil调试程序的断点设置技巧

    keil调试程序的断点设置技巧这几天整同事留下来的项目的BOM,很简单的错误,弄的头大,看下文章分下神,值得尝试一下这个调试方法。程序运行过程中,有些数据被莫名修改了,在哪里修改的?又是怎么修改的?这个代码我只想知道是否运行过,或者运行了多少次,但是不想让程序停下来,或者仅打印调试信息,怎么办?当这个变量设置成某个数据后,我想让程序自动暂停下来进行分析,怎么办?以上问题的所有答案就在本节内容:断点窗口(KEIL)。本节…

    2025年6月1日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号