selenium 介绍
Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
测试我们才不关心呢,我们关心的是我们要的数据,哈哈
1. 下载驱动
https://chromedriver.storage.googleapis.com/index.html
根据浏览器选择对应的驱动,不同版本之间不能兼容
image.png2. Java工程中引入依赖
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.13.0</version>
</dependency>
3. 编写Java程序打开浏览器
// 加载驱动
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");//这一步必不可少
ChromeOptions options = new ChromeOptions();
//指定chrome启动位置
options.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
ChromeDriver driver = new ChromeDriver(options);
// 访问一个地址
driver.get("https://www.baidu.com");
4. 编写程序控制浏览器
public static void main(String[] args) {
// 加载驱动
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");//这一步必不可少
ChromeOptions options = new ChromeOptions();
//指定chrome启动位置
options.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
ChromeDriver driver = new ChromeDriver(options);
// 访问一个地址
driver.get("https://www.baidu.com");
WebElement kw = driver.findElementById("kw");
kw.click();
kw.sendKeys("helloworld");
//发送回车
kw.sendKeys("\n");
// 滚动
driver.getTouch().scroll(0, 1000);
}
image.png
5. 爬取京东首页商品信息
我们可以看到这些信息都是异步加载的,并没有在首页中加载,所以使用普通爬虫我们很难拿到数据,我看看这个神器需要几行代码可以拿到这些信息
image.pngcopy xpath
public static void main(String[] args) {
// 加载驱动
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");//这一步必不可少
ChromeOptions options = new ChromeOptions();
//指定chrome启动位置
options.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
ChromeDriver driver = new ChromeDriver(options);
// 访问一个地址
driver.get("https://www.jd.com");
//向下滚动
driver.getTouch().scroll(0, 10000);
//xpath 选择器
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"J_more\"]/div[2]/ul/li"));
elements.forEach(e -> {
System.out.println(e.getText());
});
}
image.png
自营三只松鼠年货坚果大礼包1698g/1753g火红A版每日坚果送礼网红零食坚果礼盒(新老套餐随机发货)
¥128.00
自营五粮液52度普五 500ML(新老包装随机发货)
¥1009.90满减
手动榨汁机简易迷你儿童榨汁水果挤压汁机橙子语家用压柠檬汁器 粉色/绿色【颜色随机】
¥10.00
浴室壁挂式肥皂盒吸盘香皂盒免打孔沥水肥皂架卫生间香皂架 2个装(颜色随机)
¥10.00券
【年货钜惠 颜色随机发货】男女通用 时尚潮流精致休闲钥匙包 收纳便携小巧钥匙扣多挂钩 深蓝色专享
¥39.00
自营三只松鼠坚果炒货零食每日坚果手剥开口松子100g/袋
¥39.90满减
不锈钢粘贴挂钩 免打孔双吸盘无痕壁挂架粘钩 卫生间毛巾杆毛巾架置物架 厨房收纳挂架 6连钩挂架
¥10.00
粘毛器可撕式滚筒粘尘纸毡滚刷粘毛沾毛神器衣服去除滚毛器毛刷 款带3卷
¥10.00
自营洋河蓝色经典 梦之蓝M3 52度 礼盒装 500ml*2瓶白酒 口感绵柔浓香型
¥1079.00券
80款
智能新潮
.......
完全无视什么安全校验,什么异步加载,什么接口调用限制
6. 截屏功能
byte[] screenshotAs = driver.getScreenshotAs(OutputType.BYTES);
Files.copy(new ByteArrayInputStream(screenshotAs), Paths.get("C:\\Users\\WangYa\\Desktop\\jd.png"));
image.png
7. 其他优化配置
- 屏蔽图片
Map<String, Object> prefs = new HashMap<String, Object>();
// 不加载图片
prefs.put("profile.managed_default_content_settings.images", 2);
options.setExperimentalOption("prefs", prefs);
TIM截图20190129153524.jpg
- 使用代理 , 在ip被限制的时候可以使用代理, 对于图片连接可以添加到不使用代理的白名单里面去,直接配置到localhost这样可以加快访问速度
ChromeOptions options = new ChromeOptions();
options.addArguments("--proxy-server=http://127.0.0.1:8888");
// 不使用代理的白名单
options.addArguments("--proxy-bypass-list=*.rightinthebox.com;s.pinimg.com;*.google.com;*.googleadservices.com;*.facebook.com;*.criteo.com;d.impactradius-event.com;connect.facebook.net");
}
image.png
- 后台运行
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
写在最后的话
selenium这个东西虽然好用但是对电脑要求还是比较高的, i7,16 开20个线程电脑基本上别的啥都干不了了, 如果有需求可以放到服务器上运行,放到服务器上运行要记得写缓存清理脚本否则跑不了一晚上内存就满,在没有报错的图片的情况下建议关掉图片加载这样可以减少流量,如果说页面内容不是有js加载的,那么还可以禁用js
网友评论