Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
M
meta_crawler
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
刘伟刚
meta_crawler
Commits
89f24aab
提交
89f24aab
authored
7月 26, 2022
作者:
张文库
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
定时任务-关闭浏览器驱动并重新打开
上级
e7ad390c
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
100 行增加
和
10 行删除
+100
-10
ReuseWebDriver.java
...rawler/src/main/java/com/zzsn/crawler/ReuseWebDriver.java
+9
-6
ChromeTest.java
comm_crawler/src/main/java/com/zzsn/test/ChromeTest.java
+1
-0
DriverUtil.java
comm_crawler/src/main/java/com/zzsn/util/DriverUtil.java
+19
-4
WindowsProcess.java
comm_crawler/src/main/java/com/zzsn/util/WindowsProcess.java
+71
-0
没有找到文件。
comm_crawler/src/main/java/com/zzsn/crawler/ReuseWebDriver.java
浏览文件 @
89f24aab
...
...
@@ -28,7 +28,6 @@ import java.util.stream.Stream;
*/
@Slf4j
public
class
ReuseWebDriver
extends
RemoteWebDriver
{
private
String
serverUrl
;
public
ReuseWebDriver
(
String
serverUrl
,
String
sessionId
)
throws
IOException
{
...
...
@@ -47,7 +46,7 @@ public class ReuseWebDriver extends RemoteWebDriver {
}
/***
*
再打开的浏览器
同步执行JS脚本
*
在打开的浏览器驱动中
同步执行JS脚本
* @author andylau
* @date 2022/7/24 10:06
*/
...
...
@@ -61,7 +60,7 @@ public class ReuseWebDriver extends RemoteWebDriver {
}
/***
*
再打开的浏览器
异步执行JS脚本
*
在打开的浏览器驱动中
异步执行JS脚本
* @author andylau
* @date 2022/7/23 18:06
*/
...
...
@@ -92,7 +91,7 @@ public class ReuseWebDriver extends RemoteWebDriver {
}
/***
* 判断是否连接失败并退出
* 判断是否连接失败并退出
驱动
* @author andylau
* @date 2022/7/25 14:25
*/
...
...
@@ -109,11 +108,15 @@ public class ReuseWebDriver extends RemoteWebDriver {
return
flag
;
}
/***
* 重写退出方法,杀掉驱动进程
* @author andylau
* @date 2022/7/25 11:44
*/
@Override
public
void
quit
()
{
super
.
quit
();
// 关闭DriverService,避免无法关闭DriverService,导致出现过多Driver进程。
//
彻底
关闭DriverService,避免无法关闭DriverService,导致出现过多Driver进程。
try
{
URL
killUrl
=
new
URL
(
serverUrl
+
"/shutdown"
);
new
UrlChecker
().
waitUntilUnavailable
(
3
,
TimeUnit
.
SECONDS
,
killUrl
);
...
...
comm_crawler/src/main/java/com/zzsn/test/ChromeTest.java
浏览文件 @
89f24aab
...
...
@@ -108,6 +108,7 @@ public class ChromeTest {
try
{
// 测试打开bing
driver
.
get
(
"https://www.bing.com"
);
// getTitle()获取当前页面title的值
System
.
out
.
println
(
"当前打开页面的标题是: "
+
driver
.
getTitle
());
...
...
comm_crawler/src/main/java/com/zzsn/util/DriverUtil.java
浏览文件 @
89f24aab
...
...
@@ -7,6 +7,7 @@ import com.zzsn.job.JedisUtil;
import
lombok.extern.slf4j.Slf4j
;
import
org.openqa.selenium.chrome.ChromeDriver
;
import
org.openqa.selenium.chrome.ChromeDriverService
;
import
org.openqa.selenium.chrome.ChromeOptions
;
import
org.openqa.selenium.remote.HttpCommandExecutor
;
import
java.net.URL
;
...
...
@@ -19,6 +20,7 @@ import java.util.Map;
* @date 2022/7/23 17:14
**/
@Slf4j
@SuppressWarnings
(
"all"
)
public
class
DriverUtil
{
/***
...
...
@@ -29,8 +31,19 @@ public class DriverUtil {
private
static
ChromeDriver
reconnectDriver
()
{
System
.
setProperty
(
"webdriver.chrome.driver"
,
Constants
.
CHROMEDRIVE
);
ChromeDriverService
service
=
ChromeDriverService
.
createDefaultService
();
ChromeOptions
options
=
new
ChromeOptions
();
// 无痕模式
options
.
addArguments
(
"--incognito"
);
// 禁用沙箱
options
.
addArguments
(
"no-sandbox"
);
// 禁用GPU
options
.
addArguments
(
"--disable-gpu"
);
// 禁用图形界面(此模式启动会导致驱动通信异常)
// options.addArguments("--headless");
// 禁用插件
options
.
addArguments
(
"disable-extensions"
);
// 重新初始化一个chrome浏览器实例
return
new
ChromeDriver
(
service
);
return
new
ChromeDriver
(
service
,
options
);
}
/***
...
...
@@ -44,7 +57,6 @@ public class DriverUtil {
return
server
.
toString
();
}
@SuppressWarnings
(
"all"
)
public
static
ReuseWebDriver
connectChrome
(
String
sessionId
,
String
serverUrl
)
throws
Exception
{
if
(
serverUrl
==
null
||
""
.
equals
(
serverUrl
)
||
sessionId
==
null
||
""
.
equals
(
sessionId
))
{
log
.
error
(
"未获取到驱动服务地址、sessionId"
);
...
...
@@ -56,7 +68,11 @@ public class DriverUtil {
// 若驱动返回错误码,重新创建驱动服务并缓存
ChromeDriver
chromeDriver
=
DriverUtil
.
reconnectDriver
();
serverUrl
=
DriverUtil
.
getServerUrl
(
chromeDriver
);
sessionId
=
chromeDriver
.
getSessionId
().
toString
();
if
(
chromeDriver
.
getSessionId
()
!=
null
)
{
sessionId
=
chromeDriver
.
getSessionId
().
toString
();
}
Map
<
String
,
String
>
map
=
new
HashMap
<>(
2
);
map
.
put
(
"sessionId"
,
sessionId
);
map
.
put
(
"serverUrl"
,
serverUrl
);
...
...
@@ -72,7 +88,6 @@ public class DriverUtil {
* @author andylau
* @date 2022/7/25 15:07
*/
@SuppressWarnings
(
"all"
)
public
static
ReuseWebDriver
getChromeDriver
()
throws
Exception
{
String
cacheInfo
=
JedisUtil
.
getString
(
"SELENIUM_DRIVER_CACHE"
);
Map
<
String
,
String
>
map
=
JSON
.
parseObject
(
cacheInfo
,
Map
.
class
);
...
...
comm_crawler/src/main/java/com/zzsn/util/WindowsProcess.java
0 → 100644
浏览文件 @
89f24aab
package
com
.
zzsn
.
util
;
import
com.zzsn.crawler.ReuseWebDriver
;
import
lombok.extern.slf4j.Slf4j
;
import
java.io.BufferedReader
;
import
java.io.InputStreamReader
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
/**
* @author kethy
*/
@Slf4j
@SuppressWarnings
(
"all"
)
public
class
WindowsProcess
{
private
static
Pattern
TASK_LIST_PATTERN
=
Pattern
.
compile
(
"^(.+?)\\s+(\\d+)\\s+(.+?)\\s+\\d+\\s+([0-9,]+)\\s+K$"
);
private
static
String
DRIVER_NAME
=
"chrome.exe"
;
public
static
void
main
(
String
[]
args
)
{
WindowsProcess
process
=
new
WindowsProcess
();
process
.
killProcess
();
}
/***
* 定时关闭浏览器并重新打开
* @author andylau
* @date 2022/7/26 11:23
*/
private
void
killProcess
()
{
try
{
String
line
;
Process
p
=
Runtime
.
getRuntime
().
exec
(
"tasklist.exe"
);
BufferedReader
input
=
new
BufferedReader
(
new
InputStreamReader
(
p
.
getInputStream
()));
while
((
line
=
input
.
readLine
())
!=
null
)
{
if
(
line
.
contains
(
DRIVER_NAME
))
{
Matcher
matcher
=
TASK_LIST_PATTERN
.
matcher
(
line
);
if
(
matcher
.
find
())
{
// String serviceName = matcher.group(1);
String
pid
=
matcher
.
group
(
2
);
// String sessionName = matcher.group(3);
// String size = matcher.group(4).replace(",", "") + "K";
// log.info("正在关闭服务:\n服务名:{}\nPid:{}\n会话名:{}\n内存使用:{}\n", serviceName, pid, sessionName, size);
Runtime
.
getRuntime
().
exec
(
"taskkill /pid "
+
pid
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
error
(
"浏览器驱动关闭异常..."
);
}
finally
{
// 定时任务关闭驱动后,重新打开驱动
try
{
reopenChromeDriver
();
}
catch
(
Exception
e
)
{
log
.
error
(
"驱动打开异常..."
);
}
}
}
private
void
reopenChromeDriver
()
throws
Exception
{
// 驱动关闭后重新打开
ReuseWebDriver
driver
=
DriverUtil
.
getChromeDriver
();
if
(
driver
==
null
)
{
// 从缓存取出SessionId为空才时,驱动会返回null,可参考工具类重新设置缓存
log
.
error
(
"获取浏览器驱动失败,请检查SessionId缓存是否存在..."
);
}
}
}
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论