zoukankan      html  css  js  c++  java
  • 半途而废的Java爬虫学习经历

    最近在面试,发现Java爬虫对于小数据量数据的爬取的应用还是比较广,抽空周末学习一手,留下学习笔记

    Java网络爬虫

    简单介绍

    爬虫我相信大家都应该知道什么,有什么用,主要的用途就是通过程序自动的去获取获取网上的信息数据,写爬出比较出色的就是PY,但是对于小排量的数据而言,java也是可以满足要求的;

    HttpClient发起请求

    爬虫爬取网页上的数据和我们单独点击链接访问网页数据是同理的,是要使用Http协议访问网页的,这里我们使用Java的Http协议客户端HttpClient来实现抓取网页数据

    Hello World

    • 可读性最高的一个列子帮助大家理解一下步骤

    带参数的Get请求

    带参数的Post请求

    post也很简单,和上面几乎一致,改变一下发起请求的方式即可,如下:

    当然如果没有携带参数的话,表单对象也是不用创建的,有一个HttpPost对象就可以了

    对代码中的对象的解释:

    • 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();
                }
            }
      
        }
    }

    获取资源的相关时间配置

    Jsoup不是Jsonp

    经过上面我们的学习,我们通过HttpClient已经能够抓取到页面了,抓取到页面之后我们可以对其进行解析,可以使用字符串解析工具来对页面进行一个解析,也可以使用正则表达式的方式进行解析,但是这两个方案的开发成本很大,不推荐使用,这里我们学习一个专门解析html页面的技术 Jsonp

    Jsoup介绍

    jsonp是一款Java的Html解析器,可自己而解析某个url地址、html文本内容,他一共了一套现成的API来去除和操作数据

    jsonp的功能:

    • 从一个URL,文字或字符串中解析HTML

    • 使用DOM或者CSS选择器来进行查找,取出数据

    • 可操作HTML元素、属性、文本

    Jsoup解析URL

    添加Jsoup的依赖即可使用Jsoup

    • 这个是我们待会爬取的页面的一个页面源码

    • 我的的Java代码

      • 可以看大已经获取到我们想要的数据

    注意:Jsoup仅仅局限于Html的解析工具使用,而不是替代HttpClient发起请求使用,因为HttpClient支持多线程,连接池,代理等技术,而Jsoup对此的支持不太理想,专业的事交给专业的人,HttpClient去发请求抓数据,Jsoup干解析

    Jsoup解析字符串

    • 解析字符串的话,我们随便写一个静态页面,使用根据类把它转换成字符串即可

    • Java代码

    Jsoup解析文件

    还是上面那个静态页面,我们除了把它转换成String后来解析外,也可以直接对该文件进行解析

    使用Dom方式遍历文档

    我记得还有一个sax解析吧,那个比较麻烦,现在都快忘记了;

    Dom解析,不知道大家有没有听过或者使用过,反正我以前是使用过,不过解析的确实XML,我先简单的介绍一个Dmo方式吧

    Dmo解析会把目标文档当成一个对象来处理,先把整个文档加载到内存中,如果文档过于太大,可能内存溢出(一般不会),加载进内存的之后就会构建一颗Dom树,然后才开始提供访问和修改操作

    如果你没有学习过,下面我们就通过一个小Demo来学习一下,如果你使用过,我们就权当复习一下:

    • 首先定义一个自定义的html静态页面

    Java代码如下:几种常用获取页面数据的api我都演示了一下

    元素中获取属性

    • html页面如下

    • Java代码

     

    Selector选择器

    • “标签名” :根据标签获取元素

    • #id :根据id获取元素

    • .classValue :根据className获取元素

    • [自定义属性key] :根据属性key获取元素,可以是官方key,亦可为自定义key

    • [属性key=属性value] :根据 k=v 这方式锁定元素,获取数据

    下面分别对以上始终选择器的使用做一下演示

    • html页面

    • Java代码

    Selector选择器组合使用

    • Java:1

    • html :1

    • Java :2

    • html :2

    Hello World级爬虫小案列

    在上面的学习中,我们已经知道,HttpClient的作是爬取数据的,而Jsoup是对HttpClient爬取到的数据做一个解析用的,下面我们就赖练习一下这两个工具的使用

    搁浅一哈,暂时...日后更新

     

  • 相关阅读:
    制作一个html中闪动的title 来提示消息
    Unicode与 utf8的互相转换
    程序员找女友的类
    使用php将数组转为XML
    自己动手画一个HTML5的按钮
    浏览器推通知给桌面
    如何使用定时任务
    封装之property,多态,鸭子类型,classmethod与staticmethod
    面向对象
    继承与派生
  • 原文地址:https://www.cnblogs.com/msi-chen/p/11561158.html
Copyright © 2011-2022 走看看