Android Jsoup爬取网页数据及其局限性,接口爬取数据的思路

news2024/11/25 17:23:33

1.Jsoup

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

需求是需要获取某个网站上的排行榜数据,用作App展示,所以就想到了Jsoup框架。

我看网上其实有很多的Jsoup博客,讲的挺好的,但是有些许差异,有的也将错了,我还是推荐去官网学习,内容很少,也很简便:

Load a Document from a URL: jsoup Java HTML parser

里面讲了如何从html文件,url地址,file加载内容,也讲了通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据,很详细也写的挺简单的,是全英文,看不太懂可以装个翻译插件,或者google浏览器翻个墙,他自己就给你翻译了。

这里我就不详细展开了,很多很杂但也很基础,讲个例子吧:比如获取2022年billboard榜单的前100位歌手数据(排名,封面,名字)

Top Artists – Billboard

 实现代码:Kotlin

1.使用getListData方法获取歌手信息列表;

2.Dispatchers.IO - 此调度程序经过了专门优化,适合在主线程之外执行磁盘或网络 I/O。示例包括使用Room组件、从文件中读取数据或向文件中写入数据,以及运行任何网络操作。

3.Jsoup.connect(url).get()获取到Document对象,拿到对象后,就可以用那几种方式获取自己想要的数据了。

    fun getListData(result:RequestCallBack<MutableList<ArtistInfo>>): List<ArtistInfo>? {
        CoroutineScope(Dispatchers.IO).launch {
            val artistList = mutableListOf<ArtistInfo>()
            val url = "https://www.billboard.com/charts/year-end/top-artists/"
            try {
                val document = Jsoup.connect(url).get()
                Log.d("TTTT", "jsoup:$document")
                val listDoc: Elements =
                    document.getElementsByClass("o-chart-results-list-row-container")
                Log.d("TTTT", "jsoup:size ${listDoc.size}")
                val artistSize = if (listDoc.size > 50) 50 else listDoc.size
                for (i in 0 until artistSize) {
                    val sortNum = listDoc[i].select("span").text()
                    Log.d("TTTT", "jsoup:$sortNum")
                    val artistName = listDoc[i].select("h3").text()
                    Log.d("TTTT", "jsoup:$artistName")
                    val img = listDoc[i].select("img").attr("data-lazy-src").toString()
                    Log.d("TTTT", "jsoup:$img")
                    val artistInfo = ArtistInfo().apply {
                        this.artist = artistName
                        this.rank = sortNum.toInt()
                        this.coverOnline = img
                    }
                    artistList.add(artistInfo)//加入列表
                    App.getInstance().getArtistDao().insertOrReplace(artistInfo)//单个歌手数据插入数据库,用的greenDao
                }
                result.success(artistList)//返回歌手列表数据,UI上展示

            } catch (exception: IOException) {
                exception.printStackTrace()
            }
        }
        return null
    }

当然,怎么去知道网页的数据在何种标签,哪个class下面呢,自然是去浏览器F12查看数据咯

1.首先是element查看当前网页的源代码,在旁边的黄色标记的箭头,你点击后,再去点左边网页的元素,你就知道,它的数据在哪里了。

 2.在network中,点到返回的各个数据中,选到response就可以看到,请求返回的数据,也可以观察其数据结构(有js、json等数据格式)

这个框框里的选项很有用,可以看到请求方式,参数,预览页,返回数据等等  

2.局限性

使用Jsoup还是挺快乐的,我在爬取国内大多数的网站的时候,大多数的数据都可以拿到。

但是,我在爬取某些网页的时候,发现某些数据拿不到,拿不全,我发现有些网页,他的数据并不是一次获取的,按F12发现,他会并行请求很多数据再展示,所以,Jsoup是否可以真的获得动态网页的数据吗???我在百度Jsoup 爬取动态网页发现一堆文章,但是我看其文章其实爬的数据都是一次性拿到的,真的懵逼。Jsoup是否有局限性呢?

所以我个人觉得Jsoup爬虫,该方式是有一定局限性的,就是你通过jsoup爬虫更适合爬静态网页,所以不特殊配制的情况下只能爬当前页面的部分数据。如果需要爬一个网站所有数据,通过接口,通过上传正确的参数,或许更容易爬到该网站的该有的数据信息。

emmmm,在爬取一个网站的音乐数据时,用Jsoup好久都没搞出来。最后还是F12查询接口,参数用接口获取到的数据。

接口获取数据的话,繁琐些,但是如果网站没做反爬虫,拿取数据还是没问题的。

tips:Jsoup或许可以通过配置请求体(data),配置header那些去获取动态网页的数据,但是个人觉得有些麻烦,爬的页面有点多,还是选择了接口

3.接口爬取数据思路

主要流程:

1.目标网页,看下图,观察header等等里面的数据,获取接口,需要的参数等等

2.这时候你会发现,接口返回的response里的Json数据,这可怎么看啊??这儿推荐一个超级好用的网址。

Online JSON Viewer

3.有网址了先别急,先用postman去模拟访问数据,看自己配的数据是否真的可以访问网址并获取到争取的数据。postman拿到的数据也可以放到上面的网址里面去查看数据结构,因为网址接口爬取的数据会很大,postman不好观察。

4.建立请求/返回的实体类,然后用android网络框架去访问它就行了。

这儿只提供下思路,具体实现就不说了。思路有了做起来很快的。

个人爬取数据仅作个人学习,老铁们记得好自为之啊,哈哈哈

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

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

相关文章

【axios】后端未收到前端post传参

今天遇到过问题&#xff0c;前端post请求参数明明已经传过去了&#xff0c;可是后端说没收到&#xff0c;不知道后端大哥是不是故意搞我。 代码前端图如下↓ 代码 import axios from axios //对象形式 const val {pass:123,user:name}axios.post(/api/login, val).then(res>…

Vue3-黑马(十三)

目录&#xff1a; &#xff08;1&#xff09;vue3-router-动态路由3 &#xff08;2&#xff09;vue3-进阶router-动态菜单 &#xff08;3&#xff09;vue3-进阶-router-令牌-获取用户信息 &#xff08;1&#xff09;vue3-router-动态路由3 登录页面后&#xff0c;如果点击了…

Android技术探索与实践:从新功能体验到故障调试的全方位探索

目录 Android技术探索与实践&#xff1a;从新功能体验到故障调试的全方位探索 第一章&#xff1a;技术解析 Android平台的架构和工作原理 应用组件的生命周期和交互方式 Android开发中常用的设计模式和技术框架解析 第二章:产品新功能体验测评 深入了解最新发布的Androi…

【安卓源码】Binder机制5 -- Java层Framework Binder机制和 AIDL

图中红色代表整个framework层 binder架构相关组件&#xff1b; Binder类代表Server端&#xff0c;BinderProxy类代码Client端&#xff1b;图中蓝色代表Native层Binder架构相关组件&#xff1b;上层framework层的Binder逻辑是建立在Native层架构基础之上的&#xff0c;核心逻辑都…

shell编程:概述、脚本入门、变量、运算符、条件判断、流程控制、读取控制台、函数、正则表达式、文本处理工具、综合案例

第 1 章 Shell 概述 1&#xff09;Linux 提供的 Shell 解析器有 [atguiguhadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh2&#xff09;bash 和 sh 的关系 sh&#xff1a;比较基础bash&#xff1a;功能更加强大&#xff0c;默…

三十四、Hybrid 接口用法解析

文章目录 前言交换机接口类型有哪些Hybrid 端口使用场景什么时候必须使用 Hybrid 一、Hybrid 特点二、Hybrid 当做 access和trunk使用三、Hybrid 特殊用法 前言 交换机接口类型有哪些 Access、trunk、Hybrid、qinq Hybrid 端口使用场景 接pc、服务器、接交换机、接路由器&a…

Linux守护进程

"忍耐的灵魂啊&#xff0c;安静地运转吧~" 我们先来看看这个场景。这是一个常见的基于TCP套接字的网络服务器&#xff0c;服务端接收客户端发送的消息&#xff0c;收到后并向echo回响给客户端。 对于Linux而言&#xff0c;终端只能有一个前台进程&#xff0c;这也是为…

行业唯一丨冠珠出席“中国企业社会责任高峰论坛”,并荣获人民日报社“ESG年度案例”

践行社会责任&#xff0c;推动品牌高质量发展。5月11日&#xff0c;由人民日报社指导、人民日报社经济社会部主办的“中国企业社会责任高峰论坛”在上海盛大举行。 本次论坛围绕乡村振兴、共同富裕、绿色低碳等重点议题进行深入研讨&#xff0c;邀请国家发展和改革委员会、商务…

教程硬货|微信小程序开发之基于vue的微信开发工具JS文件解读(一)

文章目录 1 前言2 前期准备3 微信开发者工具3.1 创建项目3.2 页面介绍 4 读懂Pages4.1 index.wxss4.2 index.wxml4.3 index.json4.4 index.js 5 logs6 小程序的主要文件6.1 app.js6.2 app.json 7 讨论 1 前言 鉴于前段时间出的第一篇记录安装Nodejs和HBuilderX搭建、部署微信小…

【C++】内存分区模型

目录 1、缘起 2、内存分区模型 2.1、程序运行前 2.2、程序运行后 3、总结 1、缘起 前几天学习完了 C 的 基础语法 知识点&#xff0c;现在终于要踏上学习 C 核心编程 的旅程了&#xff0c;期待沿途中所遇到的风景。 2、内存分区模型 C 程序在执行时&#xff0c;将内存大…

【Python Cookie 和代理 IP】零基础也能轻松掌握的学习路线与参考资料

一、Python Cookie 1、什么是Cookie&#xff1f; Cookie是一种在客户端保存数据的机制&#xff0c;服务器通过在HTTP响应头中添加Set-Cookie头实现。浏览器在接收到响应头中的Set-Cookie后&#xff0c;会将这个Cookie保存在本地。之后每次请求都会将本地保存的Cookie自动添加…

WPF插件之 - PropertyChanged.Fody插件的使用详解

总目录 文章目录 总目录一、PropertyChanged.Fody是什么&#xff1f;二、PropertyChanged.Fody的安装三、PropertyChanged.Fody的功能1. 特性1 实现属性通知的功能2 通知其他属性4 不进行属性通知3 指定属性更改时将调用的方法5 设置当前属性依赖的属性6 不检查是否相等7 DoNot…

lua:浅谈对元表和元方法的认识

前言 本篇在讲什么 浅谈对Lua元表和元方法的理解 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Lua5.1的环境 依赖Sublime Text3编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码…

ETCD实现分布式锁

分布式锁具备特点 互斥性&#xff1a;在同一时刻&#xff0c;只有一个客户端能持有锁 安全性&#xff1a;避免死锁&#xff0c;如果某个客户端获得锁之后处理时间超过最大约定时间&#xff0c;或者持锁期间发生了故障导致无法主动释放锁&#xff0c;其持有的锁也能够被其他机制…

ANR实战案例 - FCM拉活启动优化

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Trace日志分析二、业务分析1.Firebase源码分析2.Firebase官方查看官方文档Dem…

数据压缩新利器!小精灵ELF助你高效存储与传输

存储空间不够用&#xff1f;网络传输太慢&#xff1f;想必每个人在生活中都会遇到这些问题。看着爆满的硬盘、焦急的等待数据的接受&#xff0c;更新设备&#xff1f;不是每个人都能承担这个成本。那不如尝试一下无损压缩&#xff1f; 为了减少存储空间的占用&#xff0c;提高…

《Netty》从零开始学netty源码(五十七)之ServerBootstrap.bind()

目录 ServerBootstrap.bind()initAndRegister()init()register()doBind0() ServerBootstrap.bind() 在第一篇的HelloWorld中通过ServerBootstrap.bind()方法绑定端口号并最终启动Netty的服务&#xff0c;服务端的bind过程如下&#xff1a; 上面的代码主要分成两部分&#xff0…

【P20】JMeter XPath提取器(XPath Extractor)

文章目录 一、准备工作二、测试计划 一、准备工作 百度&#xff1a;https://www.w3school.com.cn/example/xmle/cd_catalog.xml 进入网页后&#xff0c;右键检查或按F12&#xff0c;打开调试工具 如图&#xff0c;使用XPath提取器&#xff08;XPath Extractor&#xff09;获取…

typescript学习笔记(下)

1、类型拓宽 所有通过 let 或 var 定义的变量、函数的形参、对象的非只读属性&#xff0c;如果满足指定了初始值且未显式添加类型注解的条件&#xff0c;那么它们推断出来的类型就是指定的初始值字面量类型拓宽后的类型&#xff0c;这就是字面量类型拓宽。 下面我们通过字符串…

数据结构-排序-(选择、堆排序、归并排序、基数排序)

目录 一、选择排序 二、堆排序 排序 效率分析 三、归并排序 排序 分析 四、基数排序 一、选择排序 思想&#xff1a;每趟在待排序元素中选取关键字最小的元素加入有序子列 不稳定性 空间复杂度&#xff1a;O(1) 时间复杂度&#xff1a; void swap(int &a,int &…