chrome网页视频抓取(有type,记录如下流程状态->入库(组图))
优采云 发布时间: 2022-01-24 04:23chrome网页视频抓取(有type,记录如下流程状态->入库(组图))
背景说明
由于目标页面是用vue结构写的,通过urlConnection获取连接后无法使用Document/Jsoup解析。页面元素通过js动态呈现。后来尝试通过webMagic框架和selenium\Chrome来抓取和整理基础数据。
加工
设计标记表结构,记录捕获的状态和数据,配置selenium相关环境,分析页面dom元素的工具,编码和解析html进程,编码,集成和调试处理器和管道层webmagic 框架。数据存储操作
步骤解剖
1. 标记表结构设计,示例表如下
<br />CREATE TABLE `data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL COMMENT 'dataname',
`type` tinyint(4) DEFAULT NULL COMMENT '类型',
`xx` int(11) DEFAULT '0' COMMENT '修订',
`xx` ...
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='数据标记'
制作这张表的初衷是对抓取的数据做一个基本的保留,提取过程中的核心数据用于后期的统计和验证处理。因为不信任抓取数据的结果【可能是网络中断,页面无法正常打开,页面打开后布局混乱,并发情况下浏览器窗口意外关闭,页面修改元素添加和更改。获取目标数据]。所以有一个type字段来记录下面的进程状态
抓取 -> 打开 -> 操作 -> 解析 -> 库存 -> 抓取
其中
1.爬取 是指抓取根路径或者获取到页面上的目标url路径;
2.打开 是指通过Chrome driver打开url的过程;
3.操作 是指需要通过selenium模拟点击、跳转、输入等操作;
4.解析 是指到达目标页面后对html元素进行解析并获取有效内容
5.入库 将内容进行持久化操作
6.爬取 获取下一级链接,循环此操作
这里最不可控的一步是2、3、4。由于各种原因,可能会出现各种问题。因此,需要记录当前数据的执行状态。当然,如果数据对你来说是可丢失的、可重复的、可信的,你可以忽略部分数据,以量取胜。
2. Selenium 相关环境配置
先引入jar,下载浏览器对应驱动并配置
org.seleniumhq.selenium
selenium-java
3.9.1
org.seleniumhq.selenium
selenium-server
3.9.1
org.yaml
snakeyaml
上面是pom配置,下面是驱动变量设置,
static
{
System.getProperties().setProperty("webdriver.chrome.driver", "/Users/chenhailong/Downloads/tools/nessarytool/chromedriver");
}
运行以下代码时,浏览器可以正常打开,说明配置正常
WebDriver w = new ChromeDriver();
w.get("https://www.deathearth.com");
# 控制台会输出以下信息
Starting ChromeDriver 2.38.552518 (183d19265345f54ce39cbb94cf81ba5f15905011) on port 33558
Only local connections are allowed.
八月 23, 2019 5:02:46 下午 org.openqa.selenium.remote.ProtocolHandshake createSession
信息: Detected dialect: OSS
这种环境下最容易出现的问题就是浏览器版本和驱动版本不一致,导致程序无法打开浏览器。或者浏览器自动升级的影响。只需仔细配置即可。
3. 解析页面上的html元素
一个。这里最麻烦的就是页面修改问题。我只是写了一套匹配规则来处理它。但是,目标网站经常会改变布局,调整按钮的功能。因此,基本上需要随着目标网站的变化而变化。没门。
湾。其次,存在分析效率问题。我遇到过两种情况。一种是在抓取长文本类型(超过10w字节)的文章的内容时,通过父元素的text()方法读取,内容被截断。导致信息不完整。这是通过循环子标签来处理的。如下
<p>
...
...
修改前: w.findElements(By.id("content")).getText()
修改后:List ls = w.findElements(By.xpath("div"))
for(int i = 0;i