Java爬虫-获取数据的方式之一

目录

一、jsoup的使用

1.概述

2.主要功能

3.快速入门

4.数据准备

二、Selenium

1.概述

2.使用

三、Selenium配合jsoup获取数据

四、爬虫准则

五、Selenium+jsoup+mybatis实现数据保存

1.筛选需要的数据

2.创建一个表,准备存储数据


手写?不存在的

一、jsoup的使用

1.概述

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

2.主要功能

  • 从URL,文件或字符串中刮取并解析HTML

  • 查找和提取数据,使用DOM遍历或CSS选择器

  • 操纵HTML元素,属性和文本

  • 根据安全的白名单清理用户提交的内容,以防止XSS攻击

  • 输出整洁的HTML

3.快速入门

  • 引入jsoup坐标

  • 然后就可以直接开整了

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

Java

public static void main(String[] args) throws IOException {Document doc = Jsoup.connect("https://www.baidu.com").get();String title = doc.title();System.out.println("Title is: " + title);
}

参数设置

Document doc = Jsoup.connect("http://example.com").data("query", "Java").userAgent("Mozilla").cookie("auth", "token").timeout(3000).post();

结束,使用就是这么快

使用需要的知识

  • Java基础

  • html三剑客基础【知道是干啥的就行】(html/css/javascript)

  • jQuery基础

4.数据准备

我这里主要是为了获取数据,更深入的知识可自行网上查阅,我就不写了

Element类方法详解 - jsoup - 文档中心 - 技术客 (sunjs.com)

  • 首先准备一个网址:我用的jd的

笔记本 - 商品搜索 - 京东热卖 (jd.com)

  • 回到Java程序,运行一次,看看有数据不

       String s = "笔记本";final String encode = URLEncoder.encode(s);
​Document doc = null;try {doc = Jsoup.connect("https://re.jd.com/search?keyword="+encode).userAgent("Mozilla").timeout(5000).get();} catch (IOException e) {e.printStackTrace();}System.out.println(doc);

输出如下图即可:

  • 打开网页,f12或鼠标右键点击检查,选择要获取数据容器/元素的位置

  • 之后分析html代码,根据类名/标签名/id等缩小范围即可

  • 回到Java代码,选择一下标签输出看一下

final Element shopList = doc.getElementById("shop_list");
System.out.println(shopList);

  • 发现是个空数据,由于jsoup只能爬取静态页面,所以需要借助另外一个工具了

拓展:

数据并不是不存在,它只是在js里

如果不嫌麻烦的话可以使用data()方法获取到,但是后续处理很麻烦,就不写了

二、Selenium

这是测试方向的,但别说真好用,这个我没咋学过,只会一点,有时间研究研究~

1.概述

Selenium是一系列基于Web的自动化工具,提供一套测试函数,用于支持Web自动化测试。函数非常灵活,能够完成界面元素定位、窗口跳转、结果比较。

具有如下特点:

  • 多浏览器支持

    • 如IE、Firefox、Safari、Chrome、Android手机浏览器等。

  • 支持多语言

    • 如Java、C#、Python、Ruby、PHP等。

  • 支持多操作系统

    • 如Windows、Linux、IOS、Android等。

  • 开源免费

    • 官网:Selenium

2.使用

  • 引入Selenium依赖坐标

  • 根据不同浏览器下载不同的驱动(有些可能需要点魔法)

  • 设置浏览器驱动

    • 我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“存放浏览器驱动”目录添加到Path的值中。

  • 验证浏览器是否能启动成功

<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version>
</dependency>

验证浏览器

    public static void main(String[] args) {
//        WebDriver driver = new ChromeDriver();    //Chrome浏览器
//        WebDriver driver = new FirefoxDriver();   //Firefox浏览器WebDriver driver = new EdgeDriver();      //Edge浏览器
//        WebDriver driver = new InternetExplorerDriver();  // Internet Explorer浏览器
//        WebDriver driver = new OperaDriver();     //Opera浏览器
//        WebDriver driver = new PhantomJSDriver();   //PhantomJSSystem.out.println(driver);}

如果报错还会给最新的驱动下载地址,这很nice!

驱动版本一致后运行

开始挨个解决异常信息

首先第一个:访问给的网址

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See SLF4J Error Codes for further details.

翻译一下

添加依赖

   <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency>

运行,第一个问题解决

第二个问题:

jdk11的有另外一种解决方案,我这用的jdk8的,11的可自行搜一下

        EdgeOptions edgeOptions = new EdgeOptions();edgeOptions.addArguments("--remote-allow-origins=*");WebDriver driver = new EdgeDriver(edgeOptions);

之后,所有问题解决,开始使用~

测试代码:

        EdgeOptions edgeOptions = new EdgeOptions();edgeOptions.addArguments("--remote-allow-origins=*");WebDriver driver = new EdgeDriver(edgeOptions);// 2.打开百度首页driver.get("https://www.baidu.com");// 3.获取输入框,输入seleniumdriver.findElement(By.id("kw")).sendKeys("selenium");// 4.获取“百度一下”按钮,进行搜索driver.findElement(By.id("su")).click();// 5.退出浏览器//driver.quit();

运行:完美,到这一步后后面就非常简单了~

三、Selenium配合jsoup获取数据

java代码

Scanner scanner = new Scanner(System.in);
System.out.println("请输入要搜索的内容");
final String s = "笔记本";
final String encode = URLEncoder.encode(s);
​
EdgeOptions edgeOptions = new EdgeOptions();
edgeOptions.addArguments("--remote-allow-origins=*");
//创建浏览器窗口
WebDriver edgeDriver = new EdgeDriver(edgeOptions);
​
edgeDriver.get("https://re.jd.com/search?keyword="+encode);
//动态网站数据填充比较慢,需要延迟才可以拿到数据,一般网不差3到5s就差不多了
Thread.sleep(5000);
//获取页面数据
final String pageSource = edgeDriver.getPageSource();
//将字符串转为document对象
final Document parse = Jsoup.parse(pageSource);
final Element shopList = parse.getElementById("shop_list");
//检查一下是否获得数据了
System.out.println(shopList.html());

数据有了~

推荐先直接把获取到的html数据持久化到本地~,爬的次数多了会被监视的~

四、爬虫准则

  • 爬虫访问频次要控制,别把对方服务器搞崩溃了
  • 涉及到个人隐私的信息不要也不能爬
  • 突破网站的反爬措施,后果很严重,如果你被监视了,最好不要尝试突破反爬措施
  • 遵守robot.txt----(Robots协议)

五、Selenium+jsoup+mybatis实现数据保存

1.筛选需要的数据

        Scanner scanner = new Scanner(System.in);System.out.println("请输入要搜索的内容");final String s = "笔记本电脑";final String encode = URLEncoder.encode(s);EdgeOptions edgeOptions = new EdgeOptions();edgeOptions.addArguments("--remote-allow-origins=*");//创建浏览器窗口WebDriver edgeDriver = new EdgeDriver(edgeOptions);edgeDriver.get("https://re.jd.com/search?keyword="+encode);//动态网站数据填充比较慢,需要延迟才可以拿到数据,一般网不差3到5s就差不多了Thread.sleep(5000);//获取页面数据final String pageSource = edgeDriver.getPageSource();//将字符串转为document对象final Document parse = Jsoup.parse(pageSource);final Element shopList = parse.getElementById("shop_list");final Elements li = shopList.children();System.out.println("----------------------------------------------------------------------------");// //div[@class='sear_container w']/div[2]/div/div/div/ul/li/*li.html()还有俩部分,一个是pic,一个是li_cen_botli_cen_bot再分3个,commodity_info商品信息(价格);commodity_tit:商品标题;comment:评论*/ArrayList<String> images = new ArrayList<>();ArrayList<String> prices = new ArrayList<>();ArrayList<String> titles = new ArrayList<>();ArrayList<String> comments = new ArrayList<>();//.get(1).attr("src").substring(2))li.forEach(inner -> {images.add("https:" + inner.getElementsByClass("img_k").attr("src"));titles.add(inner.getElementsByClass("commodity_tit").text());if (inner.getElementsByClass("price").text().length()==0){prices.add("预约");}else{prices.add(inner.getElementsByClass("price").text().substring(1));}comments.add(inner.getElementsByClass("praise praise-l").text());});

2.创建一个表,准备存储数据

先随便整一个吧~

加个img_url字段,字段长度如果太小了就自己再改改,有错误自己再调调,有基础这些错误都能自己调了

3.结果

mybatis配置啥的不写了,直接出结果代码了

public class DemoJ {public static void main(String[] args) throws InterruptedException, IOException {Scanner scanner = new Scanner(System.in);System.out.println("请输入要搜索的内容");final String s = "笔记本电脑";final String encode = URLEncoder.encode(s);
​EdgeOptions edgeOptions = new EdgeOptions();edgeOptions.addArguments("--remote-allow-origins=*");//创建浏览器窗口WebDriver edgeDriver = new EdgeDriver(edgeOptions);
​edgeDriver.get("https://re.jd.com/search?keyword="+encode);//动态网站数据填充比较慢,需要延迟才可以拿到数据,一般网不差3到5s就差不多了Thread.sleep(5000);//获取页面数据final String pageSource = edgeDriver.getPageSource();
​//将字符串转为document对象final Document parse = Jsoup.parse(pageSource);final Element shopList = parse.getElementById("shop_list");
​final Elements li = shopList.children();System.out.println("----------------------------------------------------------------------------");
​// //div[@class='sear_container w']/div[2]/div/div/div/ul/li/*li.html()还有俩部分,一个是pic,一个是li_cen_botli_cen_bot再分3个,commodity_info商品信息(价格);commodity_tit:商品标题;comment:评论*/ArrayList<String> images = new ArrayList<>();ArrayList<String> prices = new ArrayList<>();ArrayList<String> titles = new ArrayList<>();ArrayList<String> comments = new ArrayList<>();//.get(1).attr("src").substring(2))li.forEach(inner -> {images.add("https:" + inner.getElementsByClass("img_k").attr("src"));titles.add(inner.getElementsByClass("commodity_tit").text());if (inner.getElementsByClass("price").text().length()==0){prices.add("预约");}else{prices.add(inner.getElementsByClass("price").text().substring(1));}comments.add(inner.getElementsByClass("praise praise-l").text());});
​String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
​final SqlSession sqlSession = sqlSessionFactory.openSession();final ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
​for (int i = 0; i < images.size(); i++) {mapper.add(titles.get(i),prices.get(i),images.get(i),comments.get(i));}sqlSession.commit();sqlSession.close();}
}

结束

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

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

相关文章

基于STM32的电动车防盗器设计

1.项目需求 点击遥控器 A 按键&#xff0c;系统进入警戒模式&#xff0c;一旦检测到震动&#xff08;小偷偷车&#xff09;&#xff0c;则喇叭发出声响报警&#xff0c; 吓退小偷。 点击遥控器 B 按键&#xff0c;系统退出警戒模式&#xff0c;再怎么摇晃系统都不会报警&#…

正则表达式中元字符的使用

// 转义字符(\ 特定的普通字符)&#xff0c;把这些特定的普通字符转义为具有特殊含义的字符&#xff0c; // \\字符(\ \) &#xff0c;把转义字符 \ 转义为普通的字符 \&#xff0c;正则表达式元字符中若含有\&#xff0c;所以用\\表示是元字符自己的含义&#xff0c;而不是…

【DevOps实战之k8s】使用Prometheus和Grafana监控K8S集群

【DevOps实战之k8s】使用Prometheus和Grafana监控K8S集群 目录 【DevOps实战之k8s】使用Prometheus和Grafana监控K8S集群系统架构Kubernetes集群指标抓取指标可视化警告PromQL示例按命名空间统计集群中的Pod数按命名空间重启Pod未就绪的PodCPU过度使用Memory过度使用健康的集群…

Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等

一、前言 用ffmpeg做音视频保存到mp4文件&#xff0c;都会遇到一个问题&#xff0c;尤其是在视频监控行业&#xff0c;就是监控摄像头设置的音频是PCM/G711A/G711U&#xff0c;解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw&#xff0c;将这个原始的音频流保存到mp4文件是会…

Java代码审计工程师直播第六期

本期直播课程将深入探讨Java代码审计的关键概念和技术。涵盖课题包括安全漏洞分析、代码审查方法、常见漏洞案例分析等。学员将通过实例掌握代码审计实战技能&#xff0c;提升对Java应用程序安全的认知和技能水平。 课程大小&#xff1a;6.1G 课程下载&#xff1a;https://do…

从根到叶:深入了解Map和Set

窗间映出一片高远的天空&#xff0c; 向晚的天际宁静而又清明。 我孤独的心灵在幸福地哭泣&#xff0c; 它在为天空如此美好而高兴。 恬静的晚霞一片火红&#xff0c; 晚霞灼烧着我的热情。 此刻的世界没有别人&#xff0c; 只有上帝&#xff0c;我和天空。 ——&#x…

SpringBlade error/list SQL 注入漏洞复现

0x01 产品简介 SpringBlade 是一个由商业级项目升级优化而来的 SpringCloud 分布式微服务架构、SpringBoot 单体式微服务架构并存的综合型项目。 0x02 漏洞概述 SpringBlade 框架后台 /api/blade-log/error/list路径存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数…

让生活更加精致的APP?

晚上好&#xff0c;今天博主来介绍几款帮助你条理生活的APP&#xff0c;让你的生活更加精致&#xff0c;充满仪式感。 一&#xff0e;格志日记 一款以“格子”的方式记录日记的APP&#xff0c;非常简单明了&#xff0c;用户可以依据自己的喜好&#xff0c;来自由定义或者删除格…

SpringBoot实战项目——博客笔记项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍二、项目的整体框架 2.1 数据库模块 2.2 前端模块 2.3 后端模块三、项目图片展示四、项目的实现 4.1 准备工作 4.…

【R语言实战】——金融时序分布拟合

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

Android audiotrack尾帧无声

前言 产品一直有用户反馈音频截断问题。在机遇巧合下现学现卖音频知识处理相关问题。 问题描述 我们查看以下简化播放器代码&#xff1a; class AACPlayer(private val filePath: String) {private val TAG "AACPlayer"private var extractor: MediaExtractor? …

TortoiseSVN 报错:The server unexpectedly closed the connetion

前言 CentOS7Linux 安装subversionmod_dav_svn&#xff0c;搭建subversion(svn)服务器 The server unexpectedly closed the connetion 解决办法 重启Apache服务 shell> systemctl restart httpd

uniapp—day02

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 WXML 和HTML区…

系统及其分类

系统定义 系统&#xff1a;指若干相互关联的事物组合而成的具有特定功能的整体。 系统的基本作用&#xff1a;对输入信号进行加工和处理&#xff0c;将其转换为所需要的输出信号。 系统分类 系统的分类错综复杂&#xff0c;主要考虑其数学模型的差异来划分不同类型。主要分为…

怎么绕过CDN查找真实IP

一、怎么绕过CDN查找真实IP 首先使用全球ping查看该域名是否存在cdn 方法一&#xff1a;使用phpinfo等探针的方式找到真实IP 方法二&#xff1a;网站根域或子域查找真实IP 大部分CDN服务都是按流量进行收费的&#xff0c;所以一些网站管理员只给重要业务部署CDN&#xff0c…

大华智慧园区综合管理平台 clientServer SQL注入漏洞复现

0x01 产品简介 “大华智慧园区综合管理平台”是一款综合管理平台,具备园区运营、资源调配和智能服务等功能。平台意在协助优化园区资源分配,满足多元化的管理需求,同时通过提供智能服务,增强使用体验。 0x02 漏洞概述 由于大华智慧园区综合管理平台clientServer接口处未…

使用reprepro+nginx搭建apt服务器

目录 项目背景 项目要求 项目开发过程 1、apt服务器的搭建 2、实现自定义指定源文件列表来实现apt update更新 3、实现软件启动时自动更新 4. source.list中镜像源地址的格式 项目开发的难点/坑点 总结 项目背景 前面写过一篇“利用Nginx搭建一个apt服务器”&#xff…

STM32嵌入式开发需要掌握硬件、嵌入式系统、C编程语言以及相关的外设驱动等知识

学习STM32嵌入式开发需要掌握硬件、嵌入式系统、C编程语言以及相关的外设驱动等知识。以下是学习STM32的路线及重要的学习内容&#xff1a; 阶段学习内容目标1.基础知识- 理解嵌入式系统的基本概念和原理 - 了解STM32系列微控制器的特点和应用领域掌握嵌入式系统基本概念&…

Midjourney绘图欣赏系列(十)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

用Docker Compose实现负载均衡【入门篇】

在本文中&#xff0c;我们将讨论如何使用Docker Compose管理多个容器&#xff0c;并实现负载均衡。 首先&#xff0c;让我们简要介绍一下Docker Compose。Docker Compose是一个用于定义和运行多个Docker容器的工具&#xff0c;通过一个单独的文件来描述应用程序的整个服务架构…