有时候网站的数据使用ajax或者js生成,或者例如登录界面使用了拖动验证码,这时基于httpclient实现爬虫就不大好做了.而使用 selenium可以模拟真实用户对浏览器进行操作,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样.
注意:浏览器版本或者浏览器驱动版本要与selenium-server的版本要匹配,以下的介绍是本人使用的版本
(1)windows系统,下载2.30版本的chromedriver.exe,selenium-server为3.0.1版本,chrome版本60.0.3112.113
System.setProperty("webdriver.chrome.driver", "E:\\工具\\chromedriver2\\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://www.baidu.com");
(1)linux系统,geckodriver使用0.16.0版本,selenium-server为3.0.1版本,firefox版本为45.4.0
System.setProperty("webdriver.firefox.marionette", "/usr/java/geckodriver");
driver = new FirefoxDriver();
driver.get("http://www.baidu.com");
(1)phantomjs版本为2.1.1,selenium-server为3.0.1版本
System.setProperty("phantomjs.binary.path", "E:\\工具\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe");
driver = new PhantomJSDriver();
driver.get("http://www.baidu.com");
Proxy proxy = new Proxy();
proxy.setHttpProxy("127.0.0.0:8888");
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(CapabilityType.PROXY, proxy);
driver = new ChromeDriver(capabilities);
(1)chromedriver
ChromeOptions options = new ChromeOptions();
options.addArguments("user-agent=myAgent");
driver = new ChromeDriver(options);
DesiredCapabilities capabilities;
capabilities = new DesiredCapabilities();
capabilities.setCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0) Gecko/20121026 Firefox/16.0");
driver = new PhantomJSDriver(capabilities);
(1)使用selenium实现需求:第一步,登录百度http://www.baidu.com,.第二步,搜索框中输入"爬虫".第三步,点击搜索按钮
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "E:\\工具\\chromedriver2\\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://www.baidu.com");
//设置10秒
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
WebElement word = driver.findElement(By.id("kw"));
word.sendKeys("爬虫");
WebElement btn = driver.findElement(By.id("su"));
btn.click();
Thread.sleep(5000);
driver.close();
}
注意,当程序运行久了时,看看进程中chromedriver.exe是否已经彻底杀死,以免该进程越来越多影响了服务器.
(2)实现需求:通过腾讯的点击验证码.因为页面的验证码部分是一个iframe,所以先找到"验证"这个元素,再鼠标右移,再点击.
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "E:\\工具\\chromedriver2\\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://open.captcha.qq.com/cap_web/experience-slidepass.html");
//设置10秒
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
List webElements = driver.findElements(By.cssSelector(".user-info"));
WebElement e = webElements.get(2);
Actions actions = new Actions(driver);
actions.moveToElement(e).perform();
Thread.sleep(2000);
actions.moveByOffset(100, 1).perform();
Thread.sleep(2000);
actions.click().perform();
Thread.sleep(5000);
driver.close();
}
完成效果: