大家好,又见面了,我是你们的朋友全栈君。
防砸声明:此文仅仅能保证入门,不保证商业生产。
最终实现效果:
爬虫简介:
引用钱洋博士课程的部分内容(有删改):
网络爬虫技术,有效的获取网络数据资源的重要方式。简单的理解,比如您对百度贴吧的一个帖子内容特别感兴趣,而帖子的回复却有1000多页,这时采用逐条复制的方法便不可行。而采用网络爬虫便可以很轻松地采集到该帖子下的所有内容。 网络爬虫的作用,我总结为以下几点:
按照陈树义前辈在《聊聊整体性学习方法》一文中提到的思想,本文思路如下:
先说一句我不是专业搞爬虫的,从2019-07-06到2019-07-11累计学习6天。这篇文章是对我这6天学习的总结。以我浅显的了解,在此我列出我曾经尝试过后来又放弃了的框架,最后压轴(zhoù)再写我正在使用的框架。目前有以下流行的爬虫框架技术:
我在正文列出了9个爬虫框架。有强如Apache、Google大佬开发维护,也有诸如我国合肥工业大学学生的作品。其实各有各自的特色,弱水三千,我想全喝,但没有那个能力。所以目前只饮一瓢,就是cdp4j了。
首先,再强调一点:使用前提是安装了Chrome浏览器
当然,不能凭空使用,还需要Maven依赖
<dependency>
<groupId>io.webfolder</groupId>
<artifactId>cdp4j</artifactId>
<version>3.0.12</version>
</dependency>
<!-- 2.2.1 版本的cdp4j不用导入winp;3.0+ 版本的cdp4j需要导入此包 -->
<!-- https://mvnrepository.com/artifact/org.jvnet.winp/winp -->
<dependency>
<groupId>org.jvnet.winp</groupId>
<artifactId>winp</artifactId>
<version>1.28</version>
</dependency>
先看一下官网给出的HelloWorld
看出来我贴的是一张图片了吗?所以先别着急敲,因为这个程序还需要稍作修改,如下:
import io.webfolder.cdp.Launcher;
import io.webfolder.cdp.session.Session;
import io.webfolder.cdp.session.SessionFactory;
import static java.util.Arrays.asList;
public class HelloWorld {
public static void main(String[] args) {
Launcher launcher = new Launcher();
try (SessionFactory factory = launcher.launch(asList("--disable-gpu",
"--headless"))) {
String context = factory.createBrowserContext();
try (Session session = factory.create(context)) {
// 设置要爬的网站链接,必须要有http://或https://
session.navigate("https://www.baidu.com");
// 默认timeout是10*1000 ms,也可以像下面这样手动设置
session.waitDocumentReady(15 * 1000);
// 通过session得到渲染后的html内容
String html = session.getContent();
System.out.println(html);
}// session创建结束
// 处理浏览器上下文,源码:contexts.remove(browserContextId)
// 意思应该是将后台浏览器进程关闭
// 我曾经尝试将此举注释,只保留下面的launcher.getProcessManager().kill();
// 依然可以关闭后台进程,但是官方给的代码有这句,那就带着吧,或许有其他作用。
factory.disposeBrowserContext(context);
}// factory创建结束
// 真正的关闭后台进程
launcher.getProcessManager().kill();
}// main方法结束
}
上面的代码你可以手动敲一遍,当然一般都是复制粘贴的。
与截图不同的是:
大家如果不理解这段代码的作用,可以自行运行一下两种代码,然后打开任务管理器,查看IDEA进行下的子进程。
运行结束后再看一下任务管理器,如果执行了关闭操作,那么IDEA下的子进程会被关闭,否则,有两种情况:
说白了,cdp4j就是一个模拟浏览器,区别于HtmlUnit,这里是真的用到了浏览器,如果代码写的不对,还会弹出浏览器,吓你一跳 : )
目前只是简简单单的获取到了渲染后的html,真正的爬虫可不仅仅就这。
xPath、Jsoup这些新名词,很多人(比如我)大学上了3年,还是头一次听说,所以需要一些时间去接近,熟悉最终才能掌握。
【项目源码】 进去找 News163CommentCrawlerDemo 或者 News163CommentCrawlerDemo.zip
实现思路就是模拟真实浏览器拿到评论并展示的过程,注意是浏览器拿到评论的过程而不是人类拿到评论的过程,区别就在于,人类是通过html页面渲染,而浏览器是通过 解析json 动态加载的:
具体步骤:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.edu.heuet</groupId>
<artifactId>News163CommentCrawlerDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 指定 JDK1.8进行编译 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
<!--<dependency>-->
<!--<groupId>io.webfolder</groupId>-->
<!--<artifactId>cdp4j</artifactId>-->
<!--<version>2.2.1</version>-->
<!--</dependency>-->
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>io.webfolder</groupId>
<artifactId>cdp4j</artifactId>
<version>3.0.12</version>
</dependency>
<!-- 2.2.1 版本的cdp4j不用导入此包;3.0+ 版本的cdp4j需要导入此包 -->
<!-- https://mvnrepository.com/artifact/org.jvnet.winp/winp -->
<dependency>
<groupId>org.jvnet.winp</groupId>
<artifactId>winp</artifactId>
<version>1.28</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20170516</version>
</dependency>
</dependencies>
</project>
【项目源码】 进去找 News163CommentCrawlerDemo 或者 News163CommentCrawlerDemo.zip (约 90kb)
注意:Maven需要指定Java1.8 否则try-with-resource中不能使用外部数据。
虽说实现了爬取网易新闻评论的功能,但还有一些技术要点没有解决:
时间匆匆,一晃6天就过去了。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129016.html原文链接:https://javaforall.cn