当前位置:   article > 正文

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

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坐标

  • 然后就可以直接开整了

  1. <dependency>
  2.    <groupId>org.jsoup</groupId>
  3.    <artifactId>jsoup</artifactId>
  4.    <version>1.17.2</version>
  5. </dependency>

Java

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

参数设置

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

结束,使用就是这么快

使用需要的知识

  • Java基础

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

  • jQuery基础

4.数据准备

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

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

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

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

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

  1. String s = "笔记本";
  2.        final String encode = URLEncoder.encode(s);
  3.        Document doc = null;
  4.        try {
  5.            doc = Jsoup.connect("https://re.jd.com/search?keyword="+encode)
  6.                   .userAgent("Mozilla")
  7.                   .timeout(5000)
  8.                   .get();
  9.       } catch (IOException e) {
  10.            e.printStackTrace();
  11.       }
  12.        System.out.println(doc);

输出如下图即可:

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

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

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

  1. final Element shopList = doc.getElementById("shop_list");
  2. 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等。

  • 开源免费

2.使用

  • 引入Selenium依赖坐标

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

  • 设置浏览器驱动

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

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

  1. <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
  2. <dependency>
  3.    <groupId>org.seleniumhq.selenium</groupId>
  4.    <artifactId>selenium-java</artifactId>
  5.    <version>4.0.0</version>
  6. </dependency>

验证浏览器

  1.    public static void main(String[] args) {
  2. //       WebDriver driver = new ChromeDriver();   //Chrome浏览器
  3. //       WebDriver driver = new FirefoxDriver();   //Firefox浏览器
  4.        WebDriver driver = new EdgeDriver();      //Edge浏览器
  5. //       WebDriver driver = new InternetExplorerDriver(); // Internet Explorer浏览器
  6. //       WebDriver driver = new OperaDriver();     //Opera浏览器
  7. //       WebDriver driver = new PhantomJSDriver();   //PhantomJS
  8.        System.out.println(driver);
  9.   }

如果报错还会给最新的驱动下载地址,这很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.

翻译一下

添加依赖

  1. <dependency>
  2.            <groupId>ch.qos.logback</groupId>
  3.            <artifactId>logback-classic</artifactId>
  4.            <version>1.2.11</version>
  5.        </dependency>

运行,第一个问题解决

第二个问题:

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

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

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

测试代码:

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

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

三、Selenium配合jsoup获取数据

java代码

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

数据有了~

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

四、爬虫准则

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

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

1.筛选需要的数据

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

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

先随便整一个吧~

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

3.结果

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

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

结束

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/488681
推荐阅读
相关标签
  

闽ICP备14008679号