Java 爬虫:是时候 Get 新技能了,使用 Java 爬取网页信息

使用java 来爬取网页内容 使用java 来爬取网页内容前言明确爬取对象实现需求小说名称 前言 在日常中,我们经常需要浏览网页,阅读一些内容。 但网页中并不是所有内容都是我们所需要的。 毕竟,谁都不想看的好好时突然出现一个“澳门棋牌”。 那么这时我们就可以爬取它的内容。 明确爬取对象 这里就以大家熟知的 笔*阁为例。 打开笔*阁的首页。 不对,打开一本小说。 这里以《进化的四十六亿重奏》为例(我是挺推荐这本书的,还有,如果可以的话尽量支持正版。) 打开主页,查看源代码,我们可以从其中换取我们需要的一起。 那我们需要什么呢? 那我们 阅读详情

如果你想利用自己的技术做出一点有意思的产品来,那么爬虫、算法和 AI 等技术可能是一个不错的突破口。今天,我们就来介绍下使用 Java 爬取页面信息的几种思路。

说起爬虫,自从 Python 兴起之后,人们可能更多地使用 Python 进行爬虫. 毕竟,Python 有许多封装好的库。但对于 Javaer,如果你觉得学习 Python 成本比较高的话,使用 Java 也是一个不错的选择,尤其是当你希望在客户端进行爬虫的时候。

在这篇文中我们会以几个页面爬取的小例子来介绍使用 Java 进行爬虫的几种常用的手段。

1、使用 Jsoup 整理你的 Github

也许有许多人会像我一样,喜欢 Star 各种有趣的项目,希望某天用到的时候再看。但当你 Star 的项目太多的时候,想要再寻找之前的某个项目就会比较困难。因为寻找项目的时候必须在自己的 Star 列表中一页一页地去翻(国内访问 Github 的速度还比较慢)。你也可以用笔记整理下自己 Star 的项目,但这种重复性的工作,超过三次,就应该考虑用程序来解决了。此外,我们希望寻找自己 Star 过的项目的时候能够像检索数据库记录一样一个 SQL 搞定。所以,我们可以直接爬取 Star 列表并存储到本地数据库,然后我们就可以对这些数据为所欲为了不是?

下面我们开始进行页面信息的抓取。

1.1 页面分析

抓取页面信息之前我们首先要做的是分析页面的构成。我们可以使用 Chrome 来帮助我们解决这个问题。方式很简单,打开 Chrome,登入自己的 Github,然后点击页面的 Star 的 Tab 即可。然后,我们在自己的 Star 列表的一个条目上面进行 “检查” 即可,

Githu 的 Star 的列表

如图所示,页面的一个 <div> 标签就对应了列表中的一个元素。我们可以使用 Jsoup 直接抓取到这个标签,然后对标签的子元素信息进行提取。这样就可以将整个列表中的信息全部检索出来。

页面分析的另一个问题是页面的自动切换,即,因为 Star 列表是分页的,一个页面信息加载完毕之后我们需要让程序自动跳转到下一页进行加载。对于 Github,这个要求是很容易满足的。因为 Github 的 Star 页面完全由服务端渲染完毕之后返回的,所以我们可以在页面中直接找到下一页的链接。

Github 的 Star 的 Next 按钮

如图所示,我们直接在页面的 Next 按钮上面进行 “检查” 就可以看到,Next 按钮是一个 <a> 标签,这里直接包含了下一个页面的链接。

1.2 页面分析工具库

页面信息的分析,我们使用 Jsoup 来搞定。Jsoup 是一个基于 Java 的 HTML 解析器。我们可以直接通过在 pom.xml 中引入依赖来使用它,

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

这里我们使用 Maven 来作为项目的构建工具。如果你希望使用 Gradle 的话,稍微做下转换也是可以的。对于 Jsoup 的使用方式,你可以在其官方网站中进行了解:https://jsoup.org/.

1.3 配置数据库

然后,我们需要考虑的是数据的存储的问题。如果爬虫的数据量比较大、对数据库性能要求比较高的话,你可以使用 MySQL 和数据库连接池来提升读写性能。这里我们使用一种简单、轻量的数据库 H2. H2 是一个小型嵌入式数据库,它开源、纯java实现,是关系数据库,小巧且方便,非常适合我们的应用场景。

参考下面的步骤进行安装:在windows上安装H2数据库。

然后按照说明的方式打开即可。如果打开的时候发生了错误,需要检查下是否是端口被占用的问题。可以使用 H2 Console (Command line) 来打开。如果确实是因为端口占用的问题,参考下面的步骤结束占用端口的程序即可,如何查看某个端口被谁占用。

1.4 编码

这里我们使用 IDEA 作为开发工具,Maven 作为构建工具。

首先,我们需要引入项目所需的各种依赖。上面我们已经介绍了 Jsoup,为了在项目中使用 H2 数据库,我们还要引入 H2 的数据库驱动,

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.197</version>
        </dependency>

数据库的读写有许多封装的库,比如常用的 ORM 框架,Hibernate 和 Mybatis 等。这里我们使用原生的数据库读取方式,因为我们的项目比较小并且熟悉这些底层的东西更有益于我们学习和理解上述框架。所以,目前为止,我们需要引用的依赖总计就两个。

然后就是编写代码了。这里,我们首先考虑项目整体的结构。我们没有直接使用消费者生产者模式,而是创建一个由 6 条线程组成的线程池,其中 1 个线程用来做观察,另外 5 条线程执行任务。这 5 条线程会从一个线程安全的队列中取出需要解析的页面链接,并且当它们解析完毕之后会获取到下一个页面的链接并插入到列表中。另外,我们建立了一个对象 Repository 用来描述一个项目。于是代码如下,

    // 线程池
    private static ExecutorService executorService = Executors.newFixedThreadPool(6);

    // 页面链接
    private static BlockingQueue<String> pages = new ArrayBlockingQueue<>(10);

    // 解析历史信息
    private static List<String> histories = Collections.synchronizedList(new LinkedList<>());

    // 解析出的项目记录
    private static List<Repository> repositories = Collections.synchronizedList(new LinkedList<>());

    // 布尔类型,用来标记是否解析完最后一页
    private static AtomicBoolean lastPageParsed = new AtomicBoolean(false);

    public static void main(String...args) {
        // 启动监控线程
        executorService.execute(new Watcher()); 
        // 启动解析线程
        executorService.execute(new Parser("https://github.com/" + USER_NAME + "?tab=stars"));
    }

    private static class Parser implements Runnable {

        private final String page;

        private Parser(String page) {
            this.page = page;
        }

        @Override
        public void run() {
            try {
                // 停顿一定时间
                Thread.sleep(DELAY_MILLIS);
                // 开始解析
                doParse();
            } catch (InterruptedException | IOException | ParseException e) {
                e.printStackTrace();
            }
        }

        private void doParse() throws IOException, InterruptedException, ParseException {
            System.out.println("Start to parse " + page);

            Document doc = Jsoup.connect(page).get();

            // 解析网页信息

            pages.remove(page);
        }
    }

    private static class Watcher implements Runnable {

        @Override
        public void run() {
            try {
                boolean shouldStop = false;
                while (!shouldStop) {
                    // 停顿一定时间,不用检查太频繁
                    Thread.sleep(WATCH_SPAN_MILLIS);
                    if (lastPageParsed.get() && pages.isEmpty()) {
                        // 最终完成,写入数据
                        shouldStop = true;
                        executorService.shutdown();
                        System.out.println("Total repositories " + repositories.size());
                        System.out.println("Begin to write to database......");
                        H2DBWriter.write(repositories);
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    // 数据库记录
    public static class Repository { /* ..... */ }

然后是数据库读写部分。我们需要先在数据库中执行数据库记录的 SQL,

     CREATE TABLE REPOSITORY
     (id INTEGER not NULL AUTO_INCREMENT,
     userName VARCHAR(255),
     repoName VARCHAR(255),
     ownerName VARCHAR(255),
     repoLink VARCHAR(255),
     description VARCHAR(1000),
     language VARCHAR(255),
     starNum INTEGER,
     date TIMESTAMP,
     PRIMARY KEY ( id ))

然后,是写入数据部分。这里就是将列表中的记录一个个地构建成一条 SQL 并将其插入到数据库中,

    public static void write(List<GithubStarExample.Repository> repositories) {
        Connection conn = null;
        Statement stmt = null;
        try {
            // 设置数据库驱动
            Class.forName(H2DBConfig.JDBC_DRIVER);
            // 获取数据库连接,需要驱动和账号密码等信息
            conn = DriverManager.getConnection(H2DBConfig.DB_URL, H2DBConfig.USER, H2DBConfig.PASS);
            stmt = conn.createStatement();
            // 遍历进行写入
            for (GithubStarExample.Repository repository : repositories) {
                PreparedStatement preparedStatement = conn.prepareStatement("INSERT INTO REPOSITORY (userName, repoName, ownerName, repoLink, description, language, starNum, date) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
                preparedStatement.setString(1, repository.userName);
                preparedStatement.setString(2, repository.repoName);
                preparedStatement.setString(3, repository.ownerName);
                preparedStatement.setString(4, repository.repoLink);
                preparedStatement.setString(5, repository.description);
                preparedStatement.setString(6, repository.language);
                preparedStatement.setInt(7, repository.starNum);
                preparedStatement.setString(8, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(repository.date.getTime()));
                preparedStatement.execute();
            }
            System.out.println("Database writing completed!");
            // 关闭数据库连接
            stmt.close();
            conn.close();
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try{
                if(stmt != null) stmt.close();
            } catch(SQLException se2) {
                se2.printStackTrace();
            }
            try {
                if(conn != null) conn.close();
            } catch(SQLException se) {
                se.printStackTrace();
            }
        }
    }

至于数据库读取部分,我们不详细叙述了。你可以通过查看源码来自行了解。

最后是测试阶段,注意需要先关闭之前打开的页面客户端,然后再进行测试。

1.5 小结

上面我们只是简单介绍了爬虫的一些基本的内容,当然,以上各个部分都可能存在一些欠缺。比如数据库读写性能比较低,以及执行 HTML 解析过程中线程池的利用率问题。毕竟上述只是一个小的示例,如果读者对读写和其他性能有更高的要求,可以按照之前说的,加入数据库连接池,并优化线程池的效率等。

2、使用 PhantomJs + Selenium 抓取 LeetCode 信息

2.1 分析

上面我们使用的是 Jsoup 来抓取页面信息,它可以解决一部分问题。对于由前端渲染的网页它就无计可施了。所谓前端渲染就是指,页面加载出来之后或者当用户执行了某些操作之后,比如页面滚动等,再进行数据加载。对应地,后端渲染主要是指服务端把页面渲染完毕之后再返回给客户端。

我们可以以抓取 LeetCode 的题目信息为例。

之前,为了随时随地查看 LeetCode 上面的题目,我希望将它们从页面上面拉取下来,保存到本地数据库,以便在移动端和其他设备上面离线查看。我分析了它的题目列表页面,

LeetCode 题目检查

如图所示,按照上面的分析,当我们使用 Jsoup 获取 class 为 reactable-data 的元素的时候,可以很容易地取出题目的列表元素。然而事实并不像我们想象地那么简单。因为我发现,当使用 Jsoup 加载完毕的时候,整个元素列表为空。这是因为,整个列表实际是有客户端发起一个请求,拿到一个 json 之后,通过解析 json 把一个个列表项目构建出来的。

所以,我换了另外一种解决方式,即使用 Chrome 的 Network 监听,获取该页面访问服务器的请求链接。(这种由前端渲染的页面可以先考虑使用这种方式,它更简单,你甚至不需要使用 Jsoup 解析 HTML.)

LeetCode 网络监听

如图,这样我们就轻松拿到了获取所有题目的请求的链接。吐槽一下,这个请求竟然返回了全部 900 多道题目,整个 json 的字符长度长达 26 万……不管怎样,我们拿到了所有题目的请求的链接。

但只有链接还是不够的,我们还希望获取所有题目的描述,最好把整个标签全部抓下来。

此时,我们又遇到了上述的问题,即 LeetCode 的题目的页面也是又前端渲染的。不过我还是能找到它的请求地址,

LeetCode 题目详情

当我拿到了这个请求之后到 Postman 里面调试了一下,发现这个链接使用了 Referer 字段用来防盗链。没办法,直接从访问该请求获取描述信息遇到了障碍。此时,我想到了几种解决办法。

第一,按照很多人说的,使用 HtmlUnit,然而我到 github 看了一下这个项目,只有 83 个 Star,尝试了一下还出现了 SOF 的错误,所以,只能放弃,

第二,使用 PhantomJs. 这应该算是一种终结的解决办法了。PhantomJs 用来模拟 JS 调用,配合 Selenium,可以用来模拟浏览器请求。这样我们可以等前端渲染完成之后获取到完整的 HTML.

2.2 编码

按照上面的描述,我们需要在项目中另外引入几个依赖。首先对于从服务器返回的 Json 的问题,我们使用 OkHttp + Retrofit 来自动映射。因此,我们需要引入如下的依赖,

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.11.0</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.retrofit2</groupId>
            <artifactId>retrofit</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.retrofit2</groupId>
            <artifactId>converter-gson</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.retrofit2</groupId>
            <artifactId>adapter-rxjava2</artifactId>
            <version>2.4.0</version>
        </dependency>

这里引入了 OkHttp 进行网络访问,引入了 Retorfit 以及对应的请求转换器和适配器,用来将请求转换成 RxJava2 的形式。

另外,我们还需要引入 PhantomJs 和 Selenium,

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.9.1</version>
        </dependency>
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>phantomjsdriver</artifactId>
            <version>1.4.4</version>
        </dependency>

对于这两个依赖,我使用的是 2018 年 2-3 月发布的版本。早期的版本可能会存在一些 Bug,另外就是注意它们之间的版本的搭配问题。

这样,我们就完成了依赖的引用。然后,我们先写请求 Json 部分的代码,

    // 服务端接口封装
    public interface ProblemService {

        @GET("problems/all/")
        Observable<AllProblems> getAll();
    }

    // 获取全部题目
    private static void getAllProblems() {
        ProblemService service = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(ProblemService.class);
        Disposable d = service.getAll()
                .subscribe(System.out::println);
    }

这样我们就拿到了整个题目列表。然后,我们需要对题目的内容进行解析。

对于每个题目的内容的链接的构成是,https://leetcode.com/problems/题目对应的question__title_slug/。我们可以使用上述请求的结果直接构建出题目的链接。

    private static void testPhantomJs() throws IOException {
        System.setProperty("phantomjs.binary.path", "D://Program Files/phantomjs-2.1.1/bin/phantomjs.exe"); // 这里写你安装的phantomJs文件路径
        WebDriver webDriver = new PhantomJSDriver();
        ((PhantomJSDriver) webDriver).setErrorHandler(new ErrorHandler());
        webDriver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        webDriver.get(PROBLEM_CONTENT_TEST_URL);
        System.out.println(webDriver.getPageSource());
    }

上面就是 PhantomJs + Selenium 请求执行的过程,如以上输出正确结果,则我们就可以直接对得到的 HTML 的内容进行解析了。解析的时候不论使用 Jsoup 还是使用 Selenium 提供的一些方法皆可。

当然,使用 PhantomJs 之前需要先进行安装才行。直接通过 http://phantomjs.org/download.html 进入下载页面下载并安装即可。

2.3 小结

这里我们介绍了使用 PhantomJs + Selenium 抓取由前端渲染的页面的步骤。这种类型的页面主要就两种方式吧,一个是尝试直接拿到前端请求的链接,一个是直接使用 PhantomJs + Selenium 模拟浏览器拿到 HTML 之后再解析。

总结

以上就是我们常用的两种抓取页面信息的方式。掌握了这些技能之后你就可以使用它来抓取网上的信息,做出一些好玩的东西了。

如有疑问,欢迎评论区交流 ?

源码地址:Java-Advanced/Jsoup

使用java爬取单个页面 本实验任务主要基于ubuntu完成java对单个网页内容的爬取,完成对所需数据的采集。   通过完成本实验任务,要求学生掌握java对网页数据的采集技能,为以后从事数据采集工程师奠定基础。完成实验实例,java语言爬取小说名字和小说介绍。Ubuntu、jdk 1.8.0、eclipse、Tomcat通过java Jsoup框架实现一个简答的爬虫,解析页面并且保存小说名字和介绍到本地;   打开页面进行检索分析,找到自己想要的内容。   构建自己的思路,进行内容的获取,并且逐步延伸自己获取范围。♥ 知识链接 阅读详情

相关推荐

java代码实现网页源码爬取

java代码实现网页源码爬取 java代码基于Eclipse简单实现网页源码爬取 哈哈,大家好!我是yanxiaolxy,前天四级英语考试考完了,作业也不多了,感觉整个人都变得轻松了许多。 今天给大家分享我的最新java学习进程--java网页源码爬虫,废话不多说盘代码。 仅需一页代码: package 网站爬虫2; /** * 爬取目标网页源代码示例 * @作者 YanXiaolxy * @版本 2020.03 * @时间 2020年12月14日 下午1:14:14 */ import jav

yanxiaolxy的博客 3007

是时候 Get 新技能了:使用 Java 爬取网页信息

如果你想利用自己的技术做出一点有意思的产品来,那么爬虫、算法和 AI 等技术可能是一个不错的突破口。今天,我们就来介绍下使用 Java 爬取页面信息的几种思路。 说起爬虫,自从 Python 兴起之后,人们可能更多地使用 Python 进行爬虫. 毕竟,Python 有许多封装好的库。但对于 Javaer,如果你觉得学习 Python 成本比较高的话,使用 Java 也是一个不错的选择,尤其是当你...

weixin_34396103的博客 335

Python网络爬虫入门指南

很高兴看到你对网络爬虫和Python的介绍。网络爬虫的确是一个强大且有趣的技术,而Python作为一种简单易学且功能丰富的编程语言,非常适合用于编写网络爬虫。   在本文中,我们将深入探讨Python网络爬虫的基本原理,介绍常用的工具和库,以及通过实战案例来帮助读者入门这个领域。我们将重点介绍如何发送HTTP请求、解析HTML页面、提取所需信息等基本技术,同时也会涉及一些高级的爬虫技术和注意事项。

不迁怒,不贰过。小知识,大智慧。 1995

【正完成】Java基于Jsoup的网络爬虫工具实现

Java基于Jsoup的网络爬虫工具实现,JAVA,算法

丛宏洁的博客 1174

Java网络爬虫实战:从网页抓取到数据解析

爬虫,又称网络蜘蛛或网络机器人,是一种自动抓取网页信息的程序或脚本。它广泛应用于搜索引擎、数据分析、市场监测和信息采集等领域。通过编写爬虫程序,可以高效地收集互联网上大量的数据,为用户提供价值或为机器学习等高级应用提供丰富的训练样本。通过本章节的介绍,我们了解了网页抓取的原理,包括HTTP协议的基础知识和爬虫的工作机制。另外,我们还探讨了进行网页抓取前的准备工作,这包括目标网站分析和选择合适的爬虫框架。在下一章节中,我们将深入探讨数据解析方法,并对DOM和XPath解析技术进行实际应用上的分析。

weixin_42610671的博客 1722

Java网络爬虫简易实现教程

网络爬虫(Web Crawler),又称网络蜘蛛(Spider)或网络机器人(Bot),是一种自动化访问互联网并从网页中提取信息的程序或脚本。在大数据时代,网络爬虫广泛应用于搜索引擎索引构建、市场数据监控、新闻聚合、学术研究等领域。Java由于其跨平台、多线程和强大的库支持等特性,成为了构建网络爬虫的热门语言之一。HTTP(HyperText Transfer Protocol)协议,即超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。

weixin_34581040的博客 1431

java爬取网页内容 简单例子

java爬取网页内容 简单例子(1)——使用正则表达式 【本文介绍】   爬取别人网页上的内容,听上似乎很有趣的样子,只要几步,就可以获取到力所不能及的东西,例如呢?例如天气预报,总不能自己拿着仪器去测吧!当然,要获取天气预报还是用webService好。这里只是举个例子。话不多说了,上看看效果吧。 【效果】 我们随便找个天气预报的网站来试试:http://www.weat

Lyndon的专栏 3万+

i春秋第二届春秋欢乐赛 classical writeup

i春秋第二届春秋欢乐赛 classical writeup 第一步:题目给出的提示 根据题目我们可以了解这道题应该是一个古典密码的题目,但是古典密码太多了我们如何知道是什么? 看题目给出的附件是一个很长很长的乱序字符串,我们可以想到用词频分析一下: 发现里面有一段不一样的信息:LyjtL3fvnSRlo2xvKIjrK2ximSHkJ3ZhJ2Hto3x9 像是base64解码能够做出来,但是发现...

hanjinrui15的博客 1429

Java网络爬虫

网络(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本创建Maven工程itcast-crawler-first并给pom.加入依赖加入log4j.properties网络爬虫就是用程序帮助我们访问网络上的资源,我们一直以来都是使用HTTP协议访问互联网的网页,网络爬虫需要编写程序,在这里使用同样的HTTP协议访问网页。这里我们使用Java的HTTP协议客户端 HttpClient这个技术,来实现抓取网页数据。

you4580的专栏 1967

非模式物种PySCENIC分析流程

外的物种想要做scenic分析的话, 可以使用同源基因转换后再进行分析, 将要分析的物种的gene Symbol转换为人、小鼠或者是果蝇的gene Symbol后进行分析。odiscus sinensis(中华鳖)的基因-细胞的矩阵,进行pyscenic分析的话,可参考以下示例。目前pyscenic分析支持的物种仅为人、小鼠和果蝇,其他物种暂时还没有相应的数据库,因。本教程基于Linux及服务。SCENIC转录因子分析。器中的Rstudio环境。例如我们有一个Pel。

weixin_47195452的博客 932

NCBI|叶绿体基因组数据上传

叶绿体基因组NCBI上传 小编最近在NCBI上传了好几次数据…想着可以把具体的上传步骤写下来,供大家参考。以下是叶绿体基因组的上传示例,大家可以瞅瞅 图片 准备工作 1.登录NCBI官网:https://www.ncbi.nlm.nih.gov/, 依次点击“sign in to NCBI”——“See more 3rd party sign in options”——搜索“Microsoft live.com”。 ”sign in to NCBI“ ”See more 3rd party sign i

weifanbio的博客 3900

网络爬虫:Python如何从网上爬取数据?

网络爬虫,就是按照一定规则自动访问互联网上的信息并把内容下载下来的程序或脚本。 在整个的Python爬虫架构里,从基础到深入我分为了10个部分:HTTP、网页、基本原理、静态网页爬取、动态网页爬取、APP爬取、多协程、爬虫框架、分布式爬虫以及反爬虫机制与应对方法。 1.HTTP 使用Python网络爬虫首先需要了解一下什么是HTTP,因为这个跟Python爬虫的基本原理息息相关。而正是围绕着这些底层逻辑,Python爬虫才能一步步地往下进行。 HTTP全称是Hyper Text Transfer..

weixin_46369953的博客 7551

CTFHUB------XSS反射型(WP)

文章目录前言XSS测试平台 前言 一开始我直接在上面写js脚本发现出错,最后发现只能通过下面的输入框来执行XSS测试,于是我们只能用XSS测试平台解决问题 XSS测试平台 注册一个XSS测试平台 这里随便填写 勾选默认模块就够了,点击下一步 这时会出现一个找个将代码复制 拼接到网站后缀name后面,点击send 这时平台会收到一个记录点开即可 得到flag ...

Y4tacker的博客 1万+

python网络爬虫 : 静态网页爬取

python网络爬虫 静态网页爬取概述 静态网页介绍 在网站设计中,纯粹HTML(标准通用标记语言下的一个应用)格式的网页通常被称为“静态网页”,静态网页是标准的HTML文件,它的文件扩展名是.htm、.html,可以包含文本、图像、声音、FLASH动画、客户端脚本和ActiveX控件及JAVA小程序等。(无法实现交互功能) 静态网页是网站建设的基础,早期的网站一般都是由静态网页制作的。静态网页是相对于动态网页而言,是指没有后台数据库、不含程序和不可交互的网页。动态网页有数据传递的过程,实时更新。静态网页

m0_51877411的博客 2320

荔枝派Nano内核编译

上文编译好uboot之后,想刷内核和根文件系统进去。其实官方的网盘里面,已经有打包好的系统镜像,包含所有的东西,可以直接烧录进flash或者TF卡,但是都是基于winbond芯片的,国产的xt25f128b刷进去妥妥的。所以没办法,只能自己再动手重新编译内核了。(PS:搞的我都想直接买一片w25q128换上了,有点麻烦,希望官方直接涨价或者出两版就行,不然对新手不友好啊)

木子点灯的博客 546

RabbitMQ的使用(JAVA)

Java快速上手的MQ上线!

.............. 1万+

网络爬虫之java HttpClient-Get

利用HttpClient-Get去爬取数据 1、网络爬虫方法简述: 其实网络爬虫就跟我们人用浏览器去访问一个网页套路是一样的,都是分为四个部分: 打开浏览器:创建HttpClient对象。 输入网址:创建发起Get请求,创建HttpGet对象。 按回车:发起请求,返回响应,使用httpClient发送请求。 解析响应获取请求:判断状态码是否是200,如果为200就是访问成功了。 最后关闭resp...

Zystem 1764

UE5网络同步优化:GetLifetimeReplicatedProps高级应用指南

本文深入探讨了UE5中GetLifetimeReplicatedProps函数的高级应用与优化策略。文章超越了基础变量注册,重点阐述了如何通过精细的复制条件控制、频率管理及分层复制机制,构建高效的数据同步通道,从而优化网络带宽与游戏性能,是提升多人游戏体验的实用指南。

weixin_29007243的博客 533

python网络爬虫_网络爬虫:Python如何从网上爬取数据?

网络爬虫,就是按照一定规则自动访问互联网上的信息并把内容下载下来的程序或脚本。在整个的Python爬虫架构里,从基础到深入我分为了10个部分:HTTP、网页、基本原理、静态网页爬取、动态网页爬取、APP爬取、多协程、爬虫框架、分布式爬虫以及反爬虫机制与应对方法。1.HTTP使用Python网络爬虫首先需要了解一下什么是HTTP,因为这个跟Python爬虫的基本原理息息相关。而正是围绕着这些底层逻辑...

weixin_39856055的博客 900

信捷PLC XD5系列运动控制(10轴)编程应用篇

项目PLC采用XD5-60T10-E,36DI 24DO 晶体管输出,支持10路脉冲输出功能。TMR指令定时器时基可以自己设定,这点比其他品牌PLC方便。ZRN指令我们需要上升沿指令触发。 5、变址寻址 该说不说这个变址寻址是真的强,比西门子指针、三菱的变址寄存器Z 、V都要更加灵活。 7、特殊寄存器:时钟 8、如何建立PLC通讯...............

RXXW_Dor的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【网络爬虫】

Selenium是一个开源的、便携式的自动化测试工具、它最初是为网站自动化测试而开发的,Selenium支持与主流浏览器的配合使用。网络爬虫的应用非常广泛。然后,它会解析HTML代码,提取出想要的数据,如标题、内容、链接等。urlopen不支持代理、Cookie等其他的HTTP/HTTPS高级功能,所以如果想要设置代理,不能使用自带的urlopen,而是要自定义opener。上述代码调用了urllib.resquest模块中的urlopen方法,导入了百度首页的url,使用的协议是http。

z12180534why_zyt的博客 1957

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

豆瓣网络爬虫

网络访问是指通过互联网访问远程服务器上的资源或服务的过程。这个过程涉及多个步骤,包括域名解析、建立连接、传输数据和关闭连接等。URL(统一资源定位符)解析: 用户在浏览器中输入网址,浏览器解析URL,提取协议、主机名(域名)、端口号和路径等信息。DNS解析: 浏览器向本地DNS服务器发起域名解析请求,本地DNS服务器查询域名对应的IP地址并返回给浏览器。建立TCP连接: 浏览器根据获取到的IP地址和端口号,通过TCP/IP协议向服务器发起连接请求。这个过程通常经过三次握手,确保双方建立稳定的连接。

m0_64505923的博客 2183

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python从网站爬取数据_网络爬虫:Python如何从网上爬取数据?

网络爬虫,就是按照一定规则自动访问互联网上的信息并把内容下载下来的程序或脚本。在整个的Python爬虫架构里,从基础到深入我分为了10个部分:HTTP、网页、基本原理、静态网页爬取、动态网页爬取、APP爬取、多协程、爬虫框架、分布式爬虫以及反爬虫机制与应对方法。1.HTTP使用Python网络爬虫首先需要了解一下什么是HTTP,因为这个跟Python爬虫的基本原理息息相关。而正是围绕着这些底层逻辑...

weixin_39938855的博客 1258

Java网络爬虫简介

一、爬虫介绍 1. 概述 网络爬虫(Web crawler)也叫网络蜘蛛(Web spide)自动检索工具(automatic indexer),是一种”自动化浏览网络“的程序,或者说是一种网络机器人。 爬虫被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。 它们可以自动采集所有其能够访问到的页面内容,以供搜索引擎做进一步处理(分检整理下载的页面),而使得用户能更快的检索到他们需要的信息。 2. 应用 2.1 搜索引擎 爬虫程序可以为搜索引擎系统爬取网络资源,用户可以通过搜索引擎

weixin_41422086的博客 3351

python网络爬虫爬取数据,python全网爬取内容

大家好,小编来为大家解答以下问题,python网络爬虫爬取数据,利用python爬取数据,现在让我们一起来看看吧!网络爬虫,就是按照一定规则自动访问互联网上的信息并把内容下载下来的程序或脚本。在整个的Python爬虫架构里,从基础到深入我分为了10个部分:HTTP、网页、基本原理、静态网页爬取、动态网页爬取、APP爬取、多协程、爬虫框架、分布式爬虫以及反爬虫机制与应对方法。

chatgpt002的博客 647

java实现简单的网络爬虫(爬取电影天堂电影信息)

在最开始,我们要在网上下载所用到的jar包,应为这只是一个简单的网络爬虫所以很多包里的内容没有用到。 下面几个包就可以了。并且要引入这些包。 主类Bigdata.java import org.htmlparser.util.ParserException; public class Bigdata { public static void main(String[] args) t

qq_35488275的博客 1万+
上一篇: LeetCode-Easy-021-Merge Two Sorted Lists
下一篇: Kotlin 总结:第一部分
开发者如是说
博客等级 码龄10年 67粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值