当前位置: 首页 > news >正文

jsoup爬虫发送get、post请求、解析html、获取json

文章目录

  • 1 简介
  • 2 发送get请求
    • 2.1设置请求头和cookie
    • 2.2 设置请求参数
    • 2.3 获取登录后的cookie、response
  • 3 发送post请求
    • 3.1 发送post请求返回body
    • 3.2 发送post请求获取cookie、response
  • 4 Document的使用
    • 4.1 使用DOM的方式来取得
    • 4.2 通过类似于css或jQuery的选择器来查找元素
    • 4.3 从Element对象中,取出我们真正需要的内容
    • 4.4 示例

1 简介

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据

  • 依赖
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.8.3</version>
        </dependency>

官网地址:https://jsoup.org/apidocs/org/jsoup/nodes/Element.html

2 发送get请求

2.1设置请求头和cookie

    public static void main(String[] args) throws IOException {
        doGet("","");
    }

    public static void doGet(String url ,String cookie) throws IOException {
        url = "https://www.baidu.com/";
        cookie = "BIDUPSID=56C4FFBF72723876ACBD5B2EA2C75AD8; PSTM=1669362017; BD_UPN=12314753; BAIDUID=F4A7FCF34D70EE033317D31778290FE0:FG=1; ZFY=bMkQzdDwo03XIz75dDC8:AwpdCLhCOaBeWmYRxguNzHQ:C; BAIDUID_BFESS=F4A7FCF34D70EE033317D31778290FE0:FG=1; baikeVisitId=a61698de-af11-451a-8f37-7a0efc41ef7c; __bid_n=184d169de2c1b652e44207; RT=\"z=1&dm=baidu.com&si=7ao2cg4efas&ss=lb63h3q0&sl=3&tt=2hm&bcn=https://fclog.baidu.com/log/weirwood?type=perf&ld=31p&ul=18ia&hd=18ka\"; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; COOKIE_SESSION=439025_2_8_9_12_10_0_0_8_6_0_0_459518_56535_3_0_1670314644_1669853798_1670314641|9#56556_3_1669853666|2; BA_HECTOR=24a484ah0k84258h0h852gj41hovnrf1g; ab_sr=1.0.1_ODA0NTY3OGYzMmViNzMyNGQ1YWU1MzhjZDc1YjM2ZjQ0MjlkZjlhOTI2ZjZjMjk1N2NlODAzNjg5YjRlNDQxNjUzZjQ2M2JkZDYwOWQ2Y2Q1MDI4NzRhNjRkM2RjYmQxOGNiNjZhMTk0YjFhZThmMmE4ZjljN2MyMzJmOWFhOWNlMTk3MmZjNTcyNjNkN2RhYjQ3M2Y1MjNlMjViNjcyOQ==; BDRCVFR[PGnakqNNAQT]=mk3SLVN4HKm; BD_HOME=1; H_PS_PSSID=37856_36560_36920_37835_37841_37871_37765_37797_37760_37853_26350_22160_37881; delPer=0; BD_CK_SAM=1; PSINO=1; H_PS_645EC=35d9T+b4lE+jHT8VNaqK1aghA5CXp4Yf4fqDSH/hRVMSETsPPBQsOh069iA";
        //获取请求连接
        Connection con = Jsoup.connect(url);
        //请求头设置,特别是cookie设置
        con.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
        con.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36");
        con.header("Host","www.baidu.com");
        con.header("Referer","https://www.baidu.com/link?url=Su25Siv6Fi0gZJgDQoDcxse30NxOOLSSqQcNy0k6FU3&wd=&eqid=d8ed532b000af73400000003638feddc");
        con.header("Cookie", cookie);
        //解析请求结果
        Document doc = con.get();
        //获取标题
        System.out.println(doc.title());
        //输出网页
//        System.out.println(doc.toString());
    }

2.2 设置请求参数

		//获取请求连接
        Connection conn = Jsoup.connect("http://www.cnblogs.com/zhangfei/p/");
        //请求参数设置
        conn.data("page","3");
        //获取请求结果
        Document doc = conn.get();  

2.3 获取登录后的cookie、response

public static String doGetResponse(String url,String cook,String header) throws IOException{
        //获取请求连接
        Connection con = Jsoup.connect(url);
        //请求头设置,特别是cookie设置
        con.header("Accept", "text/html, application/xhtml+xml, */*");
        con.header("Content-Type", "application/x-www-form-urlencoded");
        con.header("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0))");
        con.header("Cookie", cook);
        //发送请求
        Response resp=con.method(Method.GET).execute();
        //获取cookie名称为__bsi的值
        String cookieValue = resp.cookie("__bsi");
        System.out.println("cookie  __bsi值:  "+cookieValue);
        //获取返回cookie所值
        Map<String,String> cookies = resp.cookies();
        System.out.println("所有cookie值:  "+cookies);
        //获取返回头文件值
        String headerValue = resp.header(header);
        System.out.println("头文件"+header+"的值:"+headerValue);
        //获取所有头文件值
        Map<String,String> headersOne =resp.headers();
        System.out.println("所有头文件值:"+headersOne);
        return headerValue; 
    }

3 发送post请求

3.1 发送post请求返回body

public static String doPost(String url,Map<String,String> map,String cookie) throws IOException{
        //获取请求连接
        Connection con = Jsoup.connect(url);
        //遍历生成参数
        if(map!=null){
            for (Entry<String, String> entry : map.entrySet()) {
               //添加参数
                con.data(entry.getKey(), entry.getValue());
               }
        }
        //插入cookie(头文件形式)
        con.header("Cookie", cookie);
        Document doc = con.post();
        System.out.println(doc);
        return doc.toString();
    }

3.2 发送post请求获取cookie、response

//发送请求
        Response resp=con.method(Method.POST).execute();
        //获取cookie名称为__bsi的值
        String cookieValue = resp.cookie(header);
        System.out.println(cookieValue);

4 Document的使用

4.1 使用DOM的方式来取得

	getElementById(String id)//通过id来获取
  getElementsByTag(String tagName)//通过标签名字来获取
  getElementsByClass(String className)//通过类名来获取
  getElementsByAttribute(String key)//通过属性名字来获取
  getElementsByAttributeValue(String key, String value)//通过指定的属性名字,属性值来获取
  getAllElements()//获取所有元素

4.2 通过类似于css或jQuery的选择器来查找元素

public Elements select(String cssQuery)

//举例
Elements links = doc.select("a[href]"); //带有href属性的a元素
Elements pngs = doc.select("img[src$=.png]");

4.3 从Element对象中,取出我们真正需要的内容

Element.text()
//这个方法用来取得一个元素中的文本。
Element.html()Node.outerHtml()
//这个方法用来取得一个元素中的html内容
Node.attr(String key)
//获得一个属性的值,例如取得超链接<a href="">中href的值

4.4 示例

		//爬取搜索页面的图片、书名、价格、出版社
		//获取请求
        String url = "https://search.jd.com/Search?keyword=java";
        // 解析网页 (Jsou返回的Document就是浏览器的Docuement对象)
        Document document = Jsoup.parse(new URL(url), 30000);
        //获取id,所有在js里面使用的方法在这里都可以使用
        Element element = document.getElementById("J_goodsList");
        //获取所有的li元素
        Elements elements = element.getElementsByTag("li");
        //用来计数
        int c = 0;
        //获取元素中的内容  ,这里的el就是每一个li标签
        for (Element el : elements) {
            c++;
            //这里有一点要注意,直接attr使用src是爬不出来的,因为京东使用了img懒加载
            String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img");
            //获取商品的价格,并且只获取第一个text文本内容
            String price = el.getElementsByClass("p-price").eq(0).text();
            String title = el.getElementsByClass("p-name").eq(0).text();
            String shopName = el.getElementsByClass("p-shopnum").eq(0).text();
            //打印爬取结果
            log.info("{}-{}-{}-{}",img,price,title,shopName);
        }
        return "";

相关文章:

  • 压缩与打包
  • SpringBoot系列之基于MongoRepository实现分页
  • 基于安卓的课程管理系统app设计
  • 2022,记录与华为的这场会议
  • Log,SqlServerProfile, EFProfile三种监视EntityFramework中的sql流
  • 2021.03青少年软件编程(Python)等级考试试卷(二级)
  • 网站变灰,6行代码,通通变灰
  • linux命令二
  • C语言竞赛
  • 关于ElasticSearch日期格式不一致的异常,可以这么解决
  • java面试题-java基础
  • r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
  • 使用VMware 16 安装中标麒麟 7
  • 高光时刻 | 方正璞华联合开发的「人力资源法律服务共享平台」在创新创业大赛中获奖
  • BP综述:自闭症中基于功能连接体的预测模型
  • 【第一章 Linux目录结构,网络连接三种模式,vi和vim】
  • 用细节问题撬动自我进化:首届雪浪算力开发者大赛来了!
  • Windows: Longmai GM3000 ukey修改注册表实现是否清PIN码方法
  • 计算机毕业设计Java棉花(源代码+数据库+系统+lw文档)
  • 央视主持人康辉再次出圈,一口气播出一个多小时不卡顿、零失误
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉