爬虫要想爬取需要的信息,首先第一步就要抓取到页面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/,但是进入后你会发现有句话

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

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

二、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.最简单的是对请求头进行伪装,看代码,加上红框里面的内容后再执行

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

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

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

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

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

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

我们选择那些存活时间久并且刚刚被验证的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刚好不能用的话,会报错,如下显示连接超时,这个时候需要更换一个新的代理ip

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

四、结束语

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

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

转载于:https://www.cnblogs.com/sam-uncle/p/10908567.html

Java爬虫系列二:使用HttpClient抓取页面HTML相关推荐

  1. Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲(附源码)

    在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天 ...

  2. Java爬虫(二)-- httpClient模拟Http请求+jsoup页面解析

    博客 学院 下载 GitChat TinyMind 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye 写博客 发Chat 传资源 登录注册 原 Java爬虫(二)-- httpClient ...

  3. java response 获得code_Java教程分享使用HttpClient抓取页面内容

    Java教程分享使用HttpClient抓取页面内容,使用HttpClient工具来发送Http请求 1.简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提 ...

  4. apache httpclient 工具类_Java教程分享使用HttpClient抓取页面内容

    Java教程分享使用HttpClient抓取页面内容,使用HttpClient工具来发送Http请求 1.简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提 ...

  5. JAVA爬虫进阶之springboot+webmagic抓取顶点小说网站小说

    闲来无事最近写了一个全新的爬虫框架WebMagic整合springboot的爬虫程序,不清楚WebMagic的童鞋可以先查看官网了解什么是Webmagic,顺便说说用springboot时遇到的一些坑 ...

  6. python3爬虫实战二:股票信息抓取及存储

    参考:http://python.jobbole.com/88350/?utm_source=blog.jobbole.com&utm_medium=relatedPosts#article- ...

  7. Java爬虫之利用Jsoup+HttpClient爬取类叔叔不约匿名聊天网站的图片,未果——后爬取某网站美女图片案例

    博主最近学了一点爬虫的知识,闲着无聊,秉承学以致用的理念,于是突然想到何不挑战一下,爬取一些叔叔不约网站的图片,来巩固一下所学知识(#滑稽).说干就干,打开eclipse或idea,创建maven工程 ...

  8. java爬虫问题二: 使用jsoup爬取数据class选择器中空格多选择怎么解决

    问题描述: 在使用jsoup爬取其他网站数据的时候,发现class是带空格的多选择,如果直接使用doc.getElementsByClass("class的值"),这种方法获取不到 ...

  9. java爬虫系列(二)——爬取动态网页

    准备工作 项目地址 网页解析工具地址 启动网页解析器 根据系统选择所需文件 指定端口号启动工具 项目配置 seimi.properties SeimiAgentDemo.java 分析原网页代码 Bo ...

最新文章

  1. R语言glmnet拟合岭回归模型实战:岭回归模型的模型系数(ridge regression coefficients)及可视化、岭回归模型分类评估计算(混淆矩阵、accuracy、Deviance)
  2. c语言50到100套,c语言51-100套试题答案及详解.pdf
  3. 职称计算机考试word2003真题,职称计算机考试《Word2003》历年真题回顾(4)
  4. linux shell 循环语句 for while until
  5. python七段数码管设计图案-Python绘制七段数码管实例代码
  6. Hadoop集群三种作业调度算法介绍
  7. 软件定义的网络体系结构是否使用网段路由?—Vecloud微云
  8. hyperopt中文文档:Interfacing-With-Other-Languages(在其他语言中使用hyperopt)
  9. POJ2301+水~~~~~~
  10. 【STM32】FreeRTOS任务挂起和恢复示例
  11. oracle大批量数据统计,加速Oracle大批量数据处理的2个好用方案
  12. POJ 2054 Color a Tree
  13. 别以为JDK8有了红黑树,HashMap就不会有死循环问题!
  14. python3 函数注意要点
  15. 图片热点的使用,html area 的用法
  16. 随想录(嵌入式工程师的出路)
  17. Centos磁盘管理和文件系统管理
  18. IDEA如何执行maven命令进行打包编译及常用命令
  19. 宝塔建站 mysql在哪_宝塔面板安装LAMP,创建网站,创建数据库
  20. MySQL移动数据目录出现权限问题

热门文章

  1. Alamofire4.x开源代码分析(三)文件上传下载
  2. 最近让我焦灼的四个问题(有解)
  3. ajax实战用法详解
  4. 山寨一个ini文件的解析器
  5. 自动化运维专题之zabbix课程内容大纲
  6. Archlinux in VirtualBox
  7. 怎么搞一个ORM出来用用呢???迷茫中
  8. strcmp可以比较数组么_数组:总结篇
  9. 减去字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)
  10. python中redirect_详解如何用django实现redirect的几种方法总结