返回顶部
首页 > 资讯 > 后端开发 > Python >Java使用selenium爬取b站动态的实现方式
  • 408
分享到

Java使用selenium爬取b站动态的实现方式

2024-04-02 19:04:59 408人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录seleniumMac安装chromedriver完整代码Maven依赖完整代码目标:爬取b站用户的动态里面的图片,示例动态 如下所示,我们需要获取这些图片 如图所示,哔哩哔哩

目标:爬取b站用户的动态里面的图片,示例动态

如下所示,我们需要获取这些图片

image-20220116221456470

如图所示,哔哩哔哩漫画的数据是动态请求获取的

image-20220116221751682

这里我们使用selenium来爬取数据

selenium

Selenium是一个用于WEB应用程序测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

官网地址

这里我使用chrome浏览器,所以驱动就选用chromedriver

mac安装chromedriver

使用brew安装

brew install chromedriver

手动安装

查看电脑上chrome游览器的版本

image-20220116222550463

下载对应驱动

chromedriver下载官网

选择对应浏览器版本的驱动下载

image-20220116222829089

image-20220116222845433

解压zip文件,放置到对应文件夹

完整代码

这里使用SpringBoot框架

maven依赖

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <dependency>
            <groupId>com.GitHub.kevinsawicki</groupId>
            <artifactId>Http-request</artifactId>
            <version>6.0</version>
        </dependency>

selenium用于解析网页

http-request用于下载图片

完整代码

package com.sun.web_crawler;

import com.github.kevinsawicki.http.HttpRequest;
import org.openqa.selenium.By;
import org.openqa.selenium.javascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class getPictures3Test {
    // https://space.bilibili.com/4099287/dynamic
    public static WebDriver getWebDriver(int moudle, String driverPath) {
        System.setProperty("webdriver.chrome.driver", driverPath);
        HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
        chromePrefs.put("profile.managed_default_content_settings.images", 2);
        WebDriver driver;
        if (moudle == 1)
            driver = new ChromeDriver(new ChromeOptions().setHeadless(true).setExperimentalOption("prefs", chromePrefs));
        else
            driver = new ChromeDriver();
        return driver;
    }

    //将所有链接对应的图片下载到path中,并按照从number开始的顺序编号
    public static void downLoad(String path, ArrayList<String> links, int number) throws Exception {
        for (String s : links) {
            System.out.println("图片:" + s);
            HttpRequest hr = HttpRequest.get("https:" + s);
            if (hr.ok()) {
                File file = new File(path + number + s.substring(s.length() - 4));
                hr.receive(file);
                number++;
            }
        }
    }

    public static void main(String[] args) throws Exception {

        //用户uid
        String uid = "4099287";
        //图片存储位置
        String dir = "/Volumes/data/data/b/tako" + File.separator;
        //driver位置
        String driverPath = "/Volumes/data/env/chromedriver/chromedriver";
        //没有图片可以加载时会显示这个
        String bottomFlag = "你已经到达了世界的尽头";
        //pt2用来匹配一个动态里的图片链接
        Pattern pt2 = Pattern.compile("//i0[^@]{50,100}(png|jpg)");
        //初始化
        WebDriver driver = getWebDriver(1, driverPath);
        JavascriptExecutor jse = (JavascriptExecutor) driver;
        ArrayList<WebElement> wes = null;
        //图片链接links
        ArrayList<String> links = new ArrayList<String>();
        driver.get("https://space.bilibili.com/" + uid + "/dynamic");
        Thread.sleep(3000);
        jse.executeScript("window.scrollBy(0," + 4000 + ");");
        long time1 = System.currentTimeMillis();
        System.out.println("开始爬取页面图片地址!");
        int i=1;
        int count=0;
        while (true) {
            System.out.println("向下滚动第"+(i++)+"次!");
            //向下滚动
            jse.executeScript("window.scrollBy(0," + 800 + 500 * Math.random() + ");");
            //如果发现到底了,就退出循环
            if (driver.findElement(By.className("div-load-more")).getAttribute("innerhtml").contains(bottomFlag))
                break;
            wes = (ArrayList<WebElement>) driver.findElements(By.className("original-card-content"));
            wes.remove(wes.size() - 1);
            //每20个动态获取一次,并删除对应的网页元素(否则会很慢)
            if (wes.size() > 20) {
                for (WebElement we : wes) {
                    String innerHtml = we.getAttribute("innerHTML");
                    Matcher matcher2 = pt2.matcher(innerHtml);
                        while (matcher2.find()) {
                            String link = matcher2.group();
                            if (link.contains("album"))
                                links.add(link);
                            System.out.println("记录图片地址数量为:"+ (++count));
                        }
                    jse.executeScript("document.getElementsByClassName(\"card\")[0].remove();");
                }
            }
            Thread.sleep(50);
        }
        Collections.reverse(links);
        long time2 = System.currentTimeMillis();
        //下载
        System.out.println("开始下载图片!");
        downLoad(dir, links, 0);
        long totalMilliSeconds = time2 - time1;
        System.out.println();
        long totalSeconds = totalMilliSeconds / 1000;
         //求出现在的秒
        long currentSecond = totalSeconds % 60;
         //求出现在的分
        long totalMinutes = totalSeconds / 60;
        long currentMinute = totalMinutes % 60;
         //求出现在的小时
        long totalHour = totalMinutes / 60;
        long currentHour = totalHour % 24;
         //显示时间
        System.out.println("总毫秒为: " + totalMilliSeconds);
        System.out.println(currentHour + ":" + currentMinute + ":" + currentSecond + " GMT");
        driver.quit();
    }
}

开始下载代码时如下:

image-20220116224709802

下载完成后:

image-20220116225211086

完成后如下:

image-20220116225303392

 到此这篇关于Java使用selenium爬取b站动态的实现方式的文章就介绍到这了,更多相关Java selenium爬取b站动态内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java使用selenium爬取b站动态的实现方式

本文链接: https://lsjlt.com/news/162667.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java使用selenium爬取b站动态的实现方式
    目录seleniummac安装chromedriver完整代码maven依赖完整代码目标:爬取b站用户的动态里面的图片,示例动态 如下所示,我们需要获取这些图片 如图所示,哔哩哔哩...
    99+
    2024-04-02
  • Python爬虫实现自动化爬取b站实时弹幕的方法
    这篇文章主要介绍了Python爬虫实现自动化爬取b站实时弹幕的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Python主要用来做什么Python主要应用于:1、Web开...
    99+
    2023-06-14
  • 使用selenium+chromedriver+xpath爬取动态加载信息
    目录安装selenium模块说 明selenium模块的使用selenium 模块的常用方法总 结使用selenium实现动态渲染页面的爬取,selenium是浏览器自动化测试框架,...
    99+
    2024-04-02
  • Python 基于Selenium实现动态网页信息的爬取
    目录一、Selenium介绍与配置1.Selenium简介2. Selenium+Python环境配置二、网页自动化测试1.启动浏览器并打开百度搜索2.定位元素三、爬取动态网页的名人...
    99+
    2024-04-02
  • selenium动态数据获取的方法实现
    目录...
    99+
    2024-04-02
  • Python基于Selenium怎么实现动态网页信息的爬取
    这篇文章主要介绍“Python基于Selenium怎么实现动态网页信息的爬取”,在日常操作中,相信很多人在Python基于Selenium怎么实现动态网页信息的爬取问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-22
  • 如何使用selenium+chromedriver+xpath爬取动态加载信息
    这篇文章主要介绍如何使用selenium+chromedriver+xpath爬取动态加载信息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用selenium实现动态渲染页面的爬取,selenium是浏览器自动化测...
    99+
    2023-06-29
  • 使用scrapy实现增量式爬取方式
    目录1.要爬取的信息1.BookItem2.ChapterItem2.解析信息1.指定需要跟进的url和回调函数2.解析方法3.scrapy中实现增量式爬取的几种方式1.缓存2.对i...
    99+
    2024-04-02
  • Python编程实现下载器自动爬取采集B站弹幕示例
    目录实现效果UI界面数据采集小结大家好,我是小张! 在《Python编程实现小姐姐跳舞并生成词云视频示例》文章中简单介绍了B站弹幕的爬取方法,只需找到视频中的参数 cid,就能采集到...
    99+
    2024-04-02
  • 使用python抓取B站数据的方法
    这篇文章给大家分享的是有关使用python抓取B站数据的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述可以获取的数据包括:video-视频模块user-用户模块dynamic-动态模块这次用“Runnin...
    99+
    2023-06-15
  • 如何使用python爬取B站排行榜Top100的视频数据
    记得收藏呀!!! 1、第三方库导入 from bs4 import BeautifulSoup # 解析网页 import re # 正则表达式,进行文字匹配 import ...
    99+
    2024-04-02
  • Java 动态代理的多种实现方式
    目录一、动态代理简介二、动态代理的多种实现 1. 基于JDK的实现 2. 基于cglib的实现 三、为什么要有基于cglib的实现 四、两种方式的适用场景JDK动态代理 优点 缺点 ...
    99+
    2024-04-02
  • 使用selenium模拟动态登录百度页面的实现
    目标:模拟手动登录百度页面的过程,打开chrome浏览器,输入百度网址,进入百度网页,点击登录,输入账号和密码,进入登录页面。 代码演示过程: from selenium impor...
    99+
    2023-05-20
    selenium模拟动态登录百度页面 selenium动态登录
  • python如何自动爬取B站CXK的NBA形象大使的全部鬼畜视频
    这篇文章给大家介绍python如何自动爬取B站CXK的NBA形象大使的全部鬼畜视频,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。最近CXK的工作室告了B站,然后被B站的各路大神鬼畜恶搞,哈哈哈,至少有几十个版本,啧啧,...
    99+
    2023-06-02
  • 如何使用scrapy实现增量式爬取
    本篇内容主要讲解“如何使用scrapy实现增量式爬取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用scrapy实现增量式爬取”吧!1.要爬取的信息在scrapy中,信息通过item来封装...
    99+
    2023-07-02
  • SpringBoot2.动态@Value的实现方式
    title: SpringBoot2.动态@Value实现 前言 前面文章有详细描述过各个不同阶段对于bean的扩展接口 所以今天就基于BeanPostProcessor实现Spri...
    99+
    2024-04-02
  • springboot动态调用实现类方式
    目录springboot动态调用实现类springboot手动获取实现类springboot动态调用实现类 定义规则的多种类型 public enum RuleType { ...
    99+
    2024-04-02
  • Java动态代理四种实现方式详解
    代理模式也是一种非常常见的设计模式。了解Spring框架的都知道,Spring AOP 使用的就是动态代理模式。今天就来系统的重温一遍代理模式。在现实生活中代理是随处可见的,当事人因某些隐私不方便出面,或者当事人不具备某些相关的专业技能,而...
    99+
    2022-06-07
    Java动态代理 Java代理模式
  • 使用Spring特性实现接口多实现类的动态调用方式
    目录正好用到。mark一下背景问题的提出首先我们看一下这个方法的签名接下来看看我们遇到的问题是什么?实现代码如下验证关于SPI下面是JDBC驱动的接口下面是MySQL的JDBC驱动实...
    99+
    2024-04-02
  • 利用java实现动态代理的方法
    这篇文章将为大家详细讲解有关利用java实现动态代理的方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java 动态代理的方法总结AOP的拦截功能是由java中的动态代理来实现的。说白了,...
    99+
    2023-05-31
    java 动态代理 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作