引入jar包
org.seleniumhq.selenium
selenium-java
确认谷歌版本号
我的版本是71.0.3578.98
下载chromedriver (版本对应在地址里面找notes.txt查看)
----------ChromeDriver v2.45 (2018-12-10)---------- Supports Chrome v70-72
地址:
google源:https://chromedriver.storage.googleapis.com/index.html
淘宝源 : https://npm.taobao.org/mirrors/chromedriver/
打开浏览器的代码
String chromedriver = "webdriver.chrome.driver";
//下载的chromedriver文件地址
String chromedriverpath = "D:/project/chromedriver.exe";
System.getProperties().setProperty(chromedriver,chromedriverpath);
WebDriver browser = new ChromeDriver(options);
//建议等待一下(10s)
browser.manage().timeouts()
.implicitlyWait(10, TimeUnit.SECONDS);
或者可以设置浏览器参数
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized");
options.addArguments("disable-infobars");
options.addArguments("--disable-extensions");
options.addArguments("--disable-gpu");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--no-sandbox"); //linux root用户启动需要的
//代理设置
String proxyIpAndPort = "127.0.0.1:8080";
Proxy proxy = new Proxy();
proxy.setHttpProxy(proxyIpAndPort).setFtpProxy(proxyIpAndPort ).setSslProxy(proxyIpAndPort);
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(CapabilityType.ForSeleniumServer.AVOIDING_PROXY, true);
cap.setCapability(CapabilityType.ForSeleniumServer.ONLY_PROXYING_SELENIUM_TRAFFIC, true);
cap.setCapability(CapabilityType.PROXY, proxy);
options.merge(cap);
因为大众点评的团购信息页面需要登陆
我把登陆的cookies放入了redis
每次拿到浏览器之后
判断redis的cookies还存不存在
如果不存在,访问登陆页面扫码登陆并获取cookie 存入redis
如果存在,添加到浏览器当中
// cookies路径
String cookiesPath = RedisConstants.KEYPRE.DIANPING + RedisConstants.OBJTYPE.COOKIES
+ SysConstants.SysConfig.USERNAME;
// cookies已list集合的形式取出
List
打开团购信息链接
http://t.dianping.com/deal/********
等待跳转,这里需要补充逻辑,如果一直没跳出去,可能因为登陆失败,尝试重新登陆
// 等待跳转
try {
while (true) {
Thread.sleep(2000L);
if (!browser.getCurrentUrl().startsWith(SysConstants.SysConfig.DIANPINGLOGINURL)) {
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
分店地址信息需要等这个地图加载完才会显示在dom元素里面
正常加载完后的是
(我可能访问太多,导致那个地图组件把我的访问地址ban了,所以google浏览器一直加载不出来了)
这个地图组件加载需要滑动到那附近才会加载
所以这里模拟一个鼠标移动事件
Actions action = new Actions(browser);
//显式等待 最多等5秒
WebDriverWait wait = new WebDriverWait(browser, 5);
action.moveToElement(wait.until(ExpectedConditions.elementToBeClickable(browser.findElement(By.cssSelector("div.list-holder"))))).perform();
后面的可以通过Jsoup解析或者继续通过findElement定位获取
我这里使用的jsoup
找到所有分店元素
String html = Jsoup.parse(browser.getPageSource()).html();
Document document = Jsoup.parse(html);
// 获取分店id
Elements elements = document.getElementsByAttribute("data-shop-id");
List mbs = new ArrayList();
T: for (Element element : elements) {
// 排除地图信息
if (!element.attr("class").startsWith("J_content_list")) {
continue;
}
Elements elementChildrens = element.children();
MerchantBranchEntity mb = null;
for (Element children : elementChildrens) {
if ("shoptitle".equals(children.attr("class"))) {
Elements children2 = children.children();
for (Element element2 : children2) {
if (element2.hasAttr("href")) {
String shopId = element2.attr("href")
.replaceFirst(SysConstants.SysConfig.DIANPINGSHOP + SysConstants.Symbol.SLASH, "");
mb = dianPingService.findMerchantBranch(shopId);
if (mb != null) {
mbIds.add(mb.getId());
continue T;
}
mb = new MerchantBranchEntity();
mb.setId(UUIDUtils.getNewId());
mb.setShopId(shopId);
mb.setBranchName(element2.attr("title"));
}
}
}
if ("shopdetail".equals(children.attr("class"))) {
Elements children2 = children.children();
for (Element element2 : children2) {
String text = element2.text();
if (text.contains("地址")) {
mb.setAddress(text.substring(text.indexOf(":") + 1));
}
if (text.contains("电话")) {
mb.setTelephone(text.substring(text.indexOf(":") + 1));
}
if (text.contains("营业时间")) {
mb.setBusinessHours(text.substring(text.indexOf(":") + 1));
}
}
}
}
mbs.add(mb);
}