最近在面试,发现Java爬虫对于小数据量数据的爬取的应用仍是比较广,抽空周末学习一手,留下学习笔记html
爬虫我相信你们都应该知道什么,有什么用,主要的用途就是经过程序自动的去获取获取网上的信息数据,写爬出比较出色的就是PY,可是对于小排量的数据而言,java也是能够知足要求的;java
爬虫爬取网页上的数据和咱们单独点击连接访问网页数据是同理的,是要使用Http协议访问网页的,这里咱们使用Java的Http协议客户端HttpClient来实现抓取网页数据面试
可读性最高的一个列子帮助你们理解一下步骤正则表达式
post也很简单,和上面几乎一致,改变一下发起请求的方式便可,以下:json
固然若是没有携带参数的话,表单对象也是不用建立的,有一个HttpPost对象就能够了api
对代码中的对象的解释:网络
NameValuePair : 这是一个接口,点击进去Ctrl + h 发现只有一个实现即:BasicNameValuePair,内有两个属性一个K,一个V
在咱们的爬取数据的过程当中,HttpClient这个链接对象的建立和销毁是很是频繁的,这里咱们使用链接池对其进行优化多线程
public class poolTest { public static void main(String[] args) { //建立链接池管理器 PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager(); pcm.setMaxTotal(100); //设置池内最大链接数 pcm.setDefaultMaxPerRoute(10); //设置每一个坠机的最大链接数 //从链接池中获取链接对象,而不是单首创建链接对象 CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(pcm).build(); HttpGet httpGet = new HttpGet("https://www.cnblogs.com/msi-chen"); System.out.println(httpGet); //使用httpClient发起请求,得到响应 CloseableHttpResponse response = null; try { response = httpClient.execute(httpGet); //解析响应,获取到数据 if (response.getStatusLine().getStatusCode() == 200){ HttpEntity entity = response.getEntity(); String content = EntityUtils.toString(entity,"utf8"); System.out.println(content.length()); } } catch (IOException e) { e.printStackTrace(); }finally { if (response != null){ try { response.close(); } catch (IOException e) { e.printStackTrace(); } //由于咱们是链接池中获取到的链接,因此这里不能再给他关闭了 //httpClient.close(); } } } }
通过上面咱们的学习,咱们经过HttpClient已经可以抓取到页面了,抓取到页面以后咱们能够对其进行解析,可使用字符串解析工具来对页面进行一个解析,也可使用正则表达式的方式进行解析,可是这两个方案的开发成本很大,不推荐使用,这里咱们学习一个专门解析html页面的技术 Jsonp工具
jsonp是一款Java的Html解析器,可本身而解析某个url地址、html文本内容,他一共了一套现成的API来去除和操做数据post
jsonp的功能:
从一个URL,文字或字符串中解析HTML
使用DOM或者CSS选择器来进行查找,取出数据
可操做HTML元素、属性、文本
添加Jsoup的依赖便可使用Jsoup
这个是咱们待会爬取的页面的一个页面源码
个人的Java代码
能够看大已经获取到咱们想要的数据
注意:Jsoup仅仅局限于Html的解析工具使用,而不是替代HttpClient发起请求使用,由于HttpClient支持多线程,链接池,代理等技术,而Jsoup对此的支持不太理想,专业的事交给专业的人,HttpClient去发请求抓数据,Jsoup干解析
解析字符串的话,咱们随便写一个静态页面,使用根据类把它转换成字符串便可
Java代码
仍是上面那个静态页面,咱们除了把它转换成String后来解析外,也能够直接对该文件进行解析
我记得还有一个sax解析吧,那个比较麻烦,如今都快忘记了;
Dom解析,不知道你们有没有听过或者使用过,反正我之前是使用过,不过解析的确实XML,我先简单的介绍一个Dmo方式吧
Dmo解析会把目标文档当成一个对象来处理,先把整个文档加载到内存中,若是文档过于太大,可能内存溢出(通常不会),加载进内存的以后就会构建一颗Dom树,而后才开始提供访问和修改操做
若是你没有学习过,下面咱们就经过一个小Demo来学习一下,若是你使用过,咱们就权当复习一下:
首先定义一个自定义的html静态页面
Java代码以下:几种经常使用获取页面数据的api我都演示了一下
元素中获取属性
html页面以下
Java代码
“标签名” :根据标签获取元素
#id :根据id获取元素
.classValue :根据className获取元素
[自定义属性key] :根据属性key获取元素,能够是官方key,亦可为自定义key
[属性key=属性value] :根据 k=v 这方式锁定元素,获取数据
下面分别对以上始终选择器的使用作一下演示
html页面
Java代码
Java:1
html :1
Java :2
html :2
在上面的学习中,咱们已经知道,HttpClient的做是爬取数据的,而Jsoup是对HttpClient爬取到的数据作一个解析用的,下面咱们就赖练习一下这两个工具的使用
搁浅一哈,暂时...往后更新