Java 利用selenium获取大众点评团购信息(谷歌浏览器)

引入jar包

         
             org.seleniumhq.selenium
             selenium-java
         

 

确认谷歌版本号

Java 利用selenium获取大众点评团购信息(谷歌浏览器)_第1张图片

 

我的版本是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> cookies = (List>) redisTemplate.opsForValue().get(cookiesPath);

		if (cookies == null) {
			// 打开登陆页面
			webDriver.get("https://account.dianping.com/login");
			// 等待20秒用于页面加载,且扫码登录,保证Cookie响应全部获取。
			try {
				Thread.sleep(20000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			// 获取cookies
			Set cookieSet = webDriver.manage().getCookies();
			// 转成list,因为org.openqa.selenium.Cookie
			// 不能被Jackson2JsonRedisSerializer序列化,先转成json存储
			cookies = new ArrayList>();
			for (Cookie cookie : cookieSet) {
				cookies.add(cookie.toJson());
			}
			redisTemplate.opsForValue().set(cookiesPath, cookies);
		}
       else{
		Options manage = browser.manage();
		// 删除其他cookie
		manage.deleteAllCookies();
		// 添加cookie之前需要访问在相同域名的链接下
		browser.get("http://www.dianping.com");
		for (Map map : cookies) {
			Cookie cookie = JSONObject.parseObject(JSONObject.toJSONString(map), Cookie.class);
			manage.addCookie(cookie);
		}
    }

 

打开团购信息链接

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元素里面

Java 利用selenium获取大众点评团购信息(谷歌浏览器)_第2张图片Java 利用selenium获取大众点评团购信息(谷歌浏览器)_第3张图片

 

正常加载完后的是

(我可能访问太多,导致那个地图组件把我的访问地址ban了,所以google浏览器一直加载不出来了)

Java 利用selenium获取大众点评团购信息(谷歌浏览器)_第4张图片

 

这个地图组件加载需要滑动到那附近才会加载

所以这里模拟一个鼠标移动事件

        
        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);
		}

 

你可能感兴趣的:(JAVA)