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

news/2024/5/26 21:09:11/文章来源:https://blog.csdn.net/qq_33627452/article/details/136667321

目录

一、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.luyixian.cn/news_show_1006416.aspx

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

相关文章

el-Upload 上传组件,on-success方法response返回值为空

前言 家人们谁懂啊&#xff0c;我最近在用el-upload组件做上传用户的头像的功能&#xff0c;用的是它自带的action方法自动上传&#xff0c;它不是有个on-success方法吗&#xff0c;是个回调函数&#xff0c;上传成功后会返回三个参数&#xff0c;response&#xff08;是一个表…

使用Barrier共享鼠标键盘,通过macos控制ubuntu系统

之前文章写过如何使用barrrier通过windows系统控制ubuntu系统&#xff0c;该文章将详细介绍如何使用barrier通过macos系统控制ubuntu系统 一、macOS安装barrier macOS版本barrier链接 1、双击点开安装包 2、将安装包里的barrier拷贝到macOS的达达->应用程序中 3、在达达…

[QT]自定义的QtabWidget

需求 最近有一个需求就是一个QTabWidget要求有四个tab页在左侧用于显示主页面&#xff0c;在右侧有一个关于按钮&#xff0c;点击后用于弹出窗口显示一些程序相关信息。主要是怎么实现右侧按钮 相关代码 #ifndef MYTABWIDGET_H #define MYTABWIDGET_H#include <QWidget&g…

元宇宙崛起:区块链与金融科技共绘数字新世界

文章目录 一、引言二、元宇宙与区块链的深度融合三、区块链在元宇宙金融中的应用四、金融科技在元宇宙中的创新应用五、面临的挑战与机遇《区块链与金融科技》亮点内容简介获取方式 一、引言 随着科技的飞速发展&#xff0c;元宇宙概念逐渐走进人们的视野&#xff0c;成为数字…

手机备忘录可以设置密码吗 能锁屏加密的备忘录

在繁忙的生活中&#xff0c;手机备忘录成了我随身携带的“小秘书”。那些关于工作的灵感、生活的琐事&#xff0c;甚至深藏心底的小秘密&#xff0c;都被我一一记录在里面。然而&#xff0c;每次当手机离开我的视线&#xff0c;或者需要借给他人使用时&#xff0c;我总会心生担…

贝叶斯优化的门控循环神经网络BO-GRU(时序预测)的Matlab实现

贝叶斯优化的门控循环神经网络&#xff08;BO-GRU&#xff09;是一种结合了贝叶斯优化&#xff08;Bayesian Optimization, BO&#xff09;和门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;的模型&#xff0c;旨在进行时序预测。这种模型特别适用于时间序列数…

HTML 学习笔记(七)列表

html中的列表分为以下三种&#xff1a;有序列表&#xff0c;无序列表和自定义列表 1.有序列表 有序列表由两个元素组成&#xff1a;元素ol和元素li&#xff0c;此两个元素是父子关系&#xff0c;li必须包裹在ol里使用&#xff0c; ol里直接嵌套的只有li&#xff0c;其嵌套效果…

SpringBoot配置达梦数据库依赖(达梦8)

maven配置 <!-- 达梦数据库 --><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.193</version></dependency><dependency><groupId>com.alibaba&l…

Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制

目录 JavaEE-预编译-SQL JavaEE-过滤器-Filter JavaEE-监听器-Listen 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架库&#xff1a;MyBatis&#…

Era Network在web3行业的价值

近年来,以比特币和以太坊为代表的区块链技术快速发展,去中心化、信任机制的创新概念也越来越受到广泛关注。AI人工智能与区块链技术在互联网应用领域的落地,正在引领互联网进入价值互联的新阶段web3.0时代&#xff01; 新行业发展的价值与优先级 WEB3行业发展的核心需求是&…

N3-Chitosan N3 叠氮修饰壳聚糖 改性叠氮 CS-Azide

碳水科技&#xff08;Tanshtech&#xff09;可以提供壳聚糖衍生物 1.壳聚糖的各种改性(NH2/COOH/SH/N3/MAL-Chitosan等) 2.各种靶向小分子修饰壳聚糖&#xff08;Biotin/FA/cRGD-Chitosan等&#xff09; 3.各种荧光标记壳聚糖(FITC/RB/CY-Chitosan等) 4.壳聚糖和各种聚合物…

机器学习的基础学习笔记

黑马的学习视频 大家常说的人工智能、机器学习、深度学习其实是包含关系&#xff0c;深度学习是机器学习的一种特殊方法&#xff0c;而机器学习又是人工智能的一个子领域。 其中机器学习是使计算机系统能够通过学习经验和数据来改进性能。机器学习算法能够从数据中发现模式&am…

sqllab第七关通关笔记

知识点&#xff1a; 利用回显信息不同进行盲注爆破出敏感信息两种绕过方法 单引号闭合绕过&#xff1b;不加注释符 id 1 and 11 完全闭合原始语句的绕过&#xff1b;这题是采用了where id((输入)) id 1)) and 11 -- 首先判断注入类型 构造id1/0 正常回显&#xff0c;字符型注…

5.Python从入门到精通—Python 运算符

5.Python从入门到精通—Python 运算符 Python 运算符算术运算符比较&#xff08;关系&#xff09;运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级 Python 运算符 Python语言支持以下类型的运算符: 算术运算符比较&#xff08;关系&#xff09;运算符赋…

ubuntu20.04上获取Livox Avia雷达点云数据

若拿到手的Livox Avia激光雷达不知道它的ip信息&#xff0c;可以在官网上LiDAR Sensors - Livox下载上位机软件Livox Viewer&#xff0c;查看IP&#xff0c;下载window版本就可以。雷达通过网线连上电脑后&#xff0c;该软件就可以自动识别出来。按照下图步骤&#xff0c;就可以…

【计算机视觉】目标跟踪| 光流算法详细介绍|附代码

0、前言 在上篇文章中https://blog.csdn.net/Yaoyao2024/article/details/136625461?spm1001.2014.3001.5501&#xff0c;我们对目标跟踪任务和目标跟踪算法有了大致的了解。今天我们就来详细介绍一下其中的生成式算法的一种&#xff1a;光流法。 在介绍光流法之前&#xff…

基于单片机的GPS定位信息显示系统

基于单片机的GPS定位信息显示系统 摘 要 在当今信息时代的发展中&#xff0c;GPS全球定位系统是一个重要的组成部分&#xff0c;其具有精度很高、应用广泛、性能强大的特点&#xff0c;因此在实际生活中GPS全球定位显示系统被广泛运用于各类领域当中。它也是至今为止最好的定…

基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Linux 之九:CentOS 上 Tomcat 安装、SpringBoot 项目打包和部署

安装 Tomcat 下载 a. 方式一&#xff1a;可以在windows 真机上下载后&#xff0c;再上传到服务器 b. 方式二&#xff1a;可以在服务器端使用 wget 下载命令来下载 登录官网https://tomcat.apache.org/download-90.cgi&#xff0c;选择 linux 版本 右键&#xff0c;获取下载链接…

从政府工作报告探计算机行业发展

从政府工作报告中&#xff0c;我们可以深入洞察计算机行业在未来一年的发展趋势和政策导向。报告中明确提出了数字经济创新发展的重要性&#xff0c;以及制造业数字化转型、服务业数字化、智慧城市和数字乡村建设等关键任务&#xff0c;这些都为计算机行业提供了广阔的发展空间…