先来一段简介
Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
说白了 就是模拟用户的操作去控制浏览器,选择啊 点击啊之类的,主要功能是用来做测试的 实际上可以用来当做是爬虫,入门最好 因为他也能够爬取网页上的数据而且不用去分析网页请求的逻辑(因为直接是浏览器上浏览器都加载了 只需要去浏览器上面去取下来)那么很多反爬虫的东西自然而然也就绕过了,有优点肯定就有缺点了
maven依赖 -> 如果要jar包的话,直接去maven工厂里面找,我这儿就不贴了
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
本文用的是火狐浏览器和火狐浏览器对应的驱动 驱动这个网上都可以百度到,我也不贴了
本实例主要是用爬取51job的第一页作为demo
代码
public class Craw {
public List<Job> findJob(String job, String location) throws InterruptedException {
System.setProperty("webdriver.gecko.driver", "E:\\Python install\\python install\\geckodriver.exe"); //加载驱动
FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.addArguments("-headless"); //设置火狐浏览器无头模式 -> 无头模式就是不显式的打开浏览器
WebDriver driver = new FirefoxDriver(firefoxOptions);
// WebDriver driver = new FirefoxDriver(); //显式的打开浏览器
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);//超时等待30秒
driver.get("http://www.51job.com");
Thread.sleep(2);
driver.findElement(By.id("kwdselectid")).sendKeys(job); //填值
driver.findElement(By.id("work_position_input")).click(); //点击确定
List<WebElement> elementsloca = driver.findElements(By.cssSelector("#work_position_click_multiple_selected>span")); //根据css筛选元素
for (WebElement element : elementsloca) {
element.click();
}
List<WebElement> cityElements = driver.findElements(By.cssSelector("#work_position_click_center_right_list_000000 em"));
WebElement target = null;
for (WebElement element : cityElements) {
if (Objects.equals(element.getText(), location)) {
target = element;
}
}
if (target != null) {
target.click();
}
driver.findElement(By.id("work_position_click_bottom_save")).click();
List<WebElement> buttons = driver.findElements(By.cssSelector("div.ush > button"));
for (WebElement element : buttons) {
if (Objects.equals("搜索", element.getText())) {
element.click();
}
}
return handleOnePage(driver);
}
//这个方法是爬取一个页面 当要爬取每一个页面的时候 只需要写一个函数用来点击下一页 然后循环调用此方法就行了
public List<Job> handleOnePage(WebDriver driver) {
List<Job> jobList = new ArrayList<>();
List<WebElement> jobs = driver.findElements(By.cssSelector("#resultList div[class=el]"));
for (WebElement job : jobs) {
List<WebElement> span = job.findElements(By.tagName("span"));
Job job1 = new Job();
job1.setJob(span.get(0).getText());
job1.setCompany(span.get(1).getText());
job1.setLocation(span.get(2).getText());
job1.setMoney(span.get(3).getText());
job1.setReleaseTime(span.get(4).getText());
jobList.add(job1);
// System.out.println(job1.toString());
}
// System.out.println(jobList.size());
return jobList;
}
}