Java爬虫入门——HttpClient,JSoup

news2024/11/17 16:36:30

一,网络爬虫介绍

爬虫也叫网络机器人,可以代替人工,自动的在网络上采集和处理信息。

爬虫包括数据采集,分析,存储三部

爬虫引入依赖

<!--引入httpClient依赖-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.14</version>
        </dependency>

二,入门程序

   public static void main(String[] args) throws IOException {

        //1,打开浏览器,创建HttpClient对象
        CloseableHttpClient client = HttpClients.createDefault();

        //2,输入网址,发起HttpGet请求
        HttpGet httpGet = new HttpGet("http://www.baidu.cn");

        //3,按回车,发起请求,使用Httpclient对象发起请求
        CloseableHttpResponse response = client.execute(httpGet);

        //4,解析响应,获取数据
        if (response.getStatusLine().getStatusCode() == 200){//获取响应数据的状态码
            HttpEntity entity = response.getEntity();//获取响应体
            String content = EntityUtils.toString(entity,"utf8");//获取静态页面
            System.out.println(content);
        }

获取到百度首页的前端页面

三,HttpClient请求

一),使用Http协议客户端HttpClient这个技术,抓取网页数据。

二),Get请求

1,不带参数的get请求,获取静态页面的行数

 public static void main(String[] args) throws IOException {
        //创建HttpGet对象
        HttpGet httpGet = new HttpGet("http://www.itcast.com");
        //创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        try {
            //使用HttpClient对象发起请求,获取response
            response = httpClient.execute(httpGet);
            //解析响应
            if (response.getStatusLine().getStatusCode() == 200){
                String content = EntityUtils.toString(response.getEntity(), "utf8");
                System.out.println(content.length());
            }
        } catch (IOException e) {


        }finally {
            response.close();
            httpClient.close();
        }
    }

2,带参数的HttpGet请求

    public static void main(String[] args) throws Exception {
        //建立URIBuilder请求的路径
        URIBuilder uriBuilder = new URIBuilder("http://www.baidu.com/s");
        uriBuilder.setParameter("wd","狂飙")
                .setParameter("rsv_spt","1");//设置参数

        //建立该路径下的Get请求
        HttpGet httpGet = new HttpGet(uriBuilder.build());
        System.out.println("发起请求的信息:" + httpGet);
        //创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        try {
            //使用HttpClient对象发起请求,获取response
            response = httpClient.execute(httpGet);
            System.out.println("响应状态码"+response.getStatusLine().getStatusCode());
            //解析响应
            if (response.getStatusLine().getStatusCode() == 200){
                String content = EntityUtils.toString(response.getEntity(), "utf8");
                System.out.println("响应体长度:" + content.length());
            }
        } catch (IOException e) {
            
        }finally {
            response.close();
            httpClient.close();
        }
    }

三),Post请求

1,不带参数的HttpPost请求

public static void main(String[] args)  {
        //创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        //创建HttpPost对象
        HttpPost httpPost = new HttpPost("http://www.baidu.com");
        System.out.println("发起请求信息"+httpPost);
        CloseableHttpResponse response = null;
        //获取响应
        try {
            response = httpClient.execute(httpPost);
            System.out.println("响应状态码:" + response.getStatusLine().getStatusCode());
            String content = EntityUtils.toString(response.getEntity());
            System.out.println("响应数据长度:"+content.length());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                httpClient.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

    }

2,带参数的HttpPost请求

    public static void main(String[] args) throws UnsupportedEncodingException {
        //创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        //创建HttpPost对象
        HttpPost httpPost = new HttpPost("http://www.baidu.com");
        System.out.println("发起请求信息"+httpPost);

        //设置List集合,用来存放请求的参数
        List<NameValuePair> params = new ArrayList<>();
        //添加请求参数
        params.add(new BasicNameValuePair("wd","狂飙"));
        //创建Entity对象,构造方法中,一个是请求参数集合,一个是字符集编码
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params,"utf8");
        //设置表单的Entity对象到Post请求中
        httpPost.setEntity(formEntity);
        
        CloseableHttpResponse response = null;
        //获取响应
        try {
            response = httpClient.execute(httpPost);
            System.out.println("响应状态码:" + response.getStatusLine().getStatusCode());
            String content = EntityUtils.toString(response.getEntity());
            System.out.println("响应数据长度:"+content.length());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                httpClient.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

    }

四,HttpClient连接池

public static void main(String[] args) {
        //创建httpClient连接池管理对象
        PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager();
        //设置连接池最大连接数量
        manager.setMaxTotal(100);
        //设置本机访问每个url时,最多分配10个httpClient对象访问
        manager.setDefaultMaxPerRoute(10);
        
        doGet(manager);
        doGet(manager);
    }
    public static void  doGet(PoolingHttpClientConnectionManager manager) {
        //从连接池中获取httpClient对象
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(manager).build();
        CloseableHttpResponse response = null;
        try {
            //设置请求路径和参数
            URIBuilder uriBuilder = new URIBuilder("http://www.baidu.com/s");
            uriBuilder.setParameter("wd","狂飙");

            //创建HttpGet请求
            HttpGet httpGet = new HttpGet(uriBuilder.build());
            System.out.println("请求头:" + httpGet);
            //发起请求

            response = httpClient.execute(httpGet);

            //解析请求
            if (response.getStatusLine().getStatusCode() == 200){
                HttpEntity entity = response.getEntity();
                String content = EntityUtils.toString(entity);
                System.out.println("响应数据的长度:"+content.length());
            }
        }catch (Exception w){

        }finally {
            try {
                response.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            //httpClient不能手动关闭,因为交给了连接管理
        }
    }

五,请求参数

因为网络或者服务器的原因,需要设置一些参数,确保访问快速,正常!

        //创建HttpGet对象
        HttpGet httpGet = new HttpGet("http://www.baidu.com");
        
        //设置HttpClient请求参数
        RequestConfig config = RequestConfig.custom().setConnectTimeout(1000)//设置连接创建最大时间
                .setConnectionRequestTimeout(1000)//设置获取连接最大时间,单位ms
                .setSocketTimeout(10 * 1000) //设置数据传输最大时间
                .build();
        
        httpGet.setConfig(config);//将配置设置到get请求中

六,Jsoup

Jsoup是专门解析html的技术,是一款Java的html解析器

可以直接解析url地址、Html文本内容,提供了非常省力的API,课通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。

主要功能:

1,从一个url,文件或字符串中解析html

2,使用DOM,CSS选择器来查找,取出数据

3,可操作HTML元素,熟悉,文本;

Jsoup依赖:

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.2</version>
        </dependency>

引入IO工具类依赖

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

引入字符串工具类

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>

一),Jsoup解析url

    @Test
    public void testURL() throws Exception{
        //Jsoup解析url地址,获取百度首页标题,超时时间1000ms
        Document document = Jsoup.parse(new URL("http://www.baidu.com"), 1000);
        String title = document.getElementsByTag("title").first().text();
        System.out.println(title);
    }

二),Jsoup解析字符串

 @Test
    public void testString() throws Exception{
        //将文件转换成字符串
        String fileToString = FileUtils.readFileToString(new File(""), "utf8");
        //使用Jsoup解析字符串
        Document document = Jsoup.parse(fileToString);
        //获取title标签
        Element title = document.getElementsByTag("title").first();
        System.out.println(title.text());
    }

三),Jsoup解析文件

    @Test
    public void testFile() throws Exception{
        Document document = Jsoup.parse(new File(""), "utf8");
        Element title = document.getElementsByTag("title").first();
        System.out.println(title.text());
    }

四),使用dom方式遍历文档

    @Test
    public void testDOM() throws Exception{
        //获取dom对象
        Document document = Jsoup.parse("http://www.baidu.com/");

        //解析
        Elements title = document.getElementsByTag("title");//通过标签获取元素
        Element elementById = document.getElementById("s_menu_mine");//通过id获取元素
        document.getElementsByAttribute("属性名");//通过属性获取元素
        document.getElementsByAttributeValue("href","value");
        document.getElementsByClass("类名");//通过类获取元素
    }

五),从元素中获取数据

    @Test
    public void testData() throws Exception{
        Document document = Jsoup.parse("http://www.baidu.com/");
        Element element = document.getElementById("kw");
        element.id();//获取元素id
        element.text();//获取文本内容
        element.className();//获取元素的class
        element.attributes();//从元素中获取所有属性的值
        element.attr("class");//从元素获取属性的值
        element.select("span");//通过搜索span标签获取Element
        element.select("#id");//通过搜索id标签获取Element
        element.select(".class");//通过搜索class标签获取Element
        element.select("[name]");//通过搜索属性获取Element
        element.select("[class=class_a]");//通过属性的值获取Element
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty服务端请求接受过程源码剖析

目标 服务器启动后&#xff0c;客户端进行连接&#xff0c;服务器端此时要接受客户端请求&#xff0c;并且返回给客户端想要的请求&#xff0c;下面我们的目标就是分析Netty 服务器端启动后是怎么接受到客户端请求的。我们的代码依然与上一篇中用同一个demo&#xff0c; 用io.…

Tektronix TAP3500/泰克TAP3500有源探头

产品概览 泰克 TAP3500 有源探头&#xff0c;2 .5 GHz 泰克 TAP3500 单端有源 FET 探头是一种多功能且易于使用的探头&#xff0c;可提供数字系统设计所需的高速电气和机械性能。泰克 TAP3500 探头专为使用和连接到 TekVPI™ 探头接口而设计。 泰克 TAP3500 有源探头的特性和规…

带你认识一下什么是函数式接口Comparator

函数式接口Comparator 1、函数式接口是什么&#xff1f; 所谓的函数式接口&#xff0c;实际上就是接口里面只能有一个抽象方法的接口。Comparator接口就是一个典型的函数式接口&#xff0c;它只有一个抽象方法compare。 有人会说equales方法也没有方法体&#xff0c;也是抽象…

江苏专转本考试倒计时,该如何自救?

专转本考试倒计时&#xff0c;该如何自救&#xff1f;第一点&#xff1a;回归考纲教材&#xff0c;刷题。 最后一段时间&#xff0c;一定要回归考纲及教材&#xff01;要把知识点看细&#xff0c;看明白。 另外大家也可以根据历年考试题对知识点进行系统地复习和梳理&#xff0…

【java】Spring Boot --深入SpringBoot注解原理及使用

步骤一 首先&#xff0c;先看SpringBoot的主配置类&#xff1a; SpringBootApplication public class StartEurekaApplication {public static void main(String[] args){SpringApplication.run(StartEurekaApplication.class, args);} }步骤二 点进SpringBootApplication来…

线程间通信的常用方式

线程间通信的常用方式 1.简介 线程通信简单来说就是实现线程的交替工作&#xff0c;传递信息。例如在一个方法中我有两个线程A和B在运行&#xff0c;我希望线程A先向一个集合里面循环新增数据&#xff0c;当增加到第五次的时候&#xff0c;线程B才开始执行其他的操作。 线程间…

博客系统测试用例

博客系统测试用例目录博客系统测试用例博客系统删除功能测试用例 (判定表)提交BUG 1测试用例 1测试用例 2提交BUG提交BUG 2博客系统测试用例 博客系统删除功能测试用例 (判定表) # 首先确定输入条件与输出条件 输入条件: 博客作者, 非博客作者, 点击删除博客输出条件: 删除成…

web移动端:rem适配布局(重点)

目录 1. rem基础 2.媒体查询 2.1 媒体查询的概念 2.2 语法规范 2.2.1 2.2.2 关键字 2.2.3 媒体特性 2.2 根据页面宽度改变颜色 2.3 媒体查询rem 实现元素动态大小变化 2.4 引入资源&#xff08;理解&#xff09; 2.4.1 语法规范 3. less基础 3.1 css弊端 3.2 less介绍…

基于SuperPoint与SuperGlue实现图像配准

基于SuperPoint与SuperGlue实现图像配准&#xff0c;项目地址https://github.com/magicleap/SuperGluePretrainedNetwork&#xff0c;使用到了特殊算子grid_sample&#xff0c;在转onnx时要求opset_version为16及以上&#xff08;即pytorch版本为1.9以上&#xff09;。SuperPoi…

计讯物联污染源自动监控系统,坚守“绿水青山就是金山银山”

近年来&#xff0c;“绿水青山就是金山银山”的理念在全国各地落地生根&#xff0c;各大城市积极构建环境监测体系&#xff0c;旨在让生态文明成色更足&#xff0c;绿色发展底色更亮。计讯物联污染源自动监控系统作为生态环境部门监督企业排污的“火眼金睛”&#xff0c;充分运…

apifox持续集成+java+企微机器人+xxljob定时推送

总览&#xff1a; apifox做接口测试后&#xff0c;把用例合并组装成测试套件&#xff0c;然后apifox-cli通过终端命令实现把套件执行后&#xff0c;输出本地文件的测试报告html或json。本地解析后拿到有用的解决通过定时执行推送到企微群里。 然后把html一起推到群里。 这个…

【Spark分布式内存计算框架——Spark SQL】8. Shuffle 分区数目、Dataset(上)

4.4 Shuffle 分区数目 运行上述程序时&#xff0c;查看WEB UI监控页面发现&#xff0c;某个Stage中有200个Task任务&#xff0c;也就是说RDD有200分区Partition。 原因&#xff1a;在SparkSQL中当Job中产生Shuffle时&#xff0c;默认的分区数&#xff08;spark.sql.shuffle.p…

基于STM32采用CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试

一、前言 在STM32项目开发中&#xff0c;经常会用到存储芯片存储数据。 比如&#xff1a;关机时保存机器运行过程中的状态数据&#xff0c;上电再从存储芯片里读取数据恢复&#xff1b;在存储芯片里也会存放很多资源文件。比如&#xff0c;开机音乐&#xff0c;界面上的菜单图…

Selenium + python自动化测试环境搭建

selenium 是一个web的自动化测试工具&#xff0c;不少学习功能自动化的同学开始首选selenium &#xff0c;相因为它相比QTP有诸多有点&#xff1a; 免费&#xff0c;也不用再为破解QTP而大伤脑筋 小巧&#xff0c;对于不同的语言它只是一个包而已&#xff0c;而QTP需要下载安…

JSON字符串解析

目录 依赖 方法 示例 判断JSON是否合格 依赖 方法 JSON.parseObject() JSON.parseArray() 示例 Data public class OrderVo {public String name;public Integer price;public Integer count; } JSON数据 { "name": "苹果手机", "pric…

BIT.8_Linux 多线程

目录Linux线程概念什么是线程线程的优点线程的缺点线程异常线程用途Linux进程VS线程进程和线程总结Linux线程控制POSIX线程库创建线程线程ID及进程地址空间布局进程和线程ID区别内核层面&#xff1a;pid & tgid线程终止线程等待__thread 和 pthread_self()分离线程Linux线程…

《爆肝整理》保姆级系列教程python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

简介 有些 post 的请求参数是 json 格式的&#xff0c;这个前面发送post 请求里面提到过&#xff0c;需要导入 json模块处理。现在企业公司一般常见的接口因为json数据容易处理&#xff0c;所以绝大多数返回数据也是 json 格式的&#xff0c;我们在做判断时候&#xff0c;往往只…

Guava常用工具类总结

-“Null的含糊语义让人很不舒服。Null很少可以明确地表示某种语义&#xff0c;例如&#xff0c;Map.get(key)返回Null时&#xff0c;可能表示map中的值是null&#xff0c;亦或map中没有key对应的值。Null可以表示失败、成功或几乎任何情况。使用Null以外的特定值&#xff0c;会…

每日学术速递2.17

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.Decoupled Model Schedule for Deep Learning Training 标题&#xff1a;深度学习训练的解耦模型时间表 作者&#xff1a;Hongzheng Chen, Cody Hao Yu, Shuai Zheng, Zhen Zhang,…

快速识别台式机的内存条

拿上一根内存条&#xff0c;让一个喜欢IT的识别一下&#xff0c;很多人不一定能说出点内容。 这很正常&#xff0c;IT细分领域太多了&#xff0c;很多搞IT的包括写代码的人可能都没有接触内存条。 硬件的集成度随着硬件技术的提升越来越高&#xff0c;成本也下来了&#xff0c;…