java万能爬虫爬取拉勾网
程序员文章站
2022-05-02 20:54:20
...
看的小匠实战课写的,嘿嘿。跟着敲一遍代码后总结一下。
1.selenium定义(百度的)
Selenium(浏览器自动化测试框架)
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
2.为什么叫万能爬虫?
很多网站防抓取做的越来越好,selenium模拟人的操作,面对浏览器。
3.步骤
①下载chrome的webdriver 地址:http://nmp.taobao.org/mirrors/chromedriver
②创建maven项目,把dependency放在pom.xml文件里可以自动解析下载jar包,main里的java写代码,resources放wendriver。
③涉及到xpath的使用
pom.xml里加:
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.141.59</version>
</dependency>
</dependencies>
java里写类:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
public class LagouSpider {
public static void main(String[] args){
//设置webdriver路径
System.setProperty("webdriver.chrome.driver",LagouSpider.class.getClassLoader().getResource("chromedriver.exe").getPath());
//创建webdriver
WebDriver webDriver=new ChromeDriver(); /*ctrl+h查看子类*/
//跳转页面
webDriver.get("https://www.lagou.com/zhaopin/Java/?labelWords=label");
//把红包点了
WebElement btnRedEnvelope =webDriver.findElement(By.xpath("//div[@class='body-box']//div[contains(text(),'给也不要')]"));
btnRedEnvelope.click();
//点地理位置
WebElement placeElement = webDriver.findElement(By.xpath("//div[@class='current-handle-position']//span[contains(text(),'工作地点')]")); //ctrl+alt+v 快速抽取变量
WebElement optPlaceElement = placeElement.findElement(By.xpath("//div[@class='other-hot-city']//a[contains(text(),'上海')]"));//ctrl+F6重定义变量名字
optPlaceElement.click();
//通过xpath选中元素
clickOption(webDriver, "工作经验", "应届毕业生");
clickOption(webDriver, "学历要求", "本科");
/*ctrl+shift+m 抽取方法*/
/*ctrl+alt+n Inline变量(变量引回去)*/
/*ctrl+d 快速复制行*/
//解析页面元素
extractJobsByPagination(webDriver);
}
private static void extractJobsByPagination(WebDriver webDriver) {
List<WebElement> jobElements = webDriver.findElements(By.className("con_list_item"));
for (WebElement jobElement : jobElements) {
WebElement moneyElement = jobElement.findElement(By.className("position")).findElement(By.className("money"));
String companyName = jobElement.findElement(By.className("company_name")).getText();
String industry = jobElement.findElement(By.className("industry")).getText();
String advantage = jobElement.findElement(By.className("li_b_r")).getText();
System.out.println("公司:"+companyName+"薪资:"+moneyElement.getText()+"公司介绍:"+industry+"公司优势:"+advantage);
}
WebElement nextPageBtn = webDriver.findElement(By.className("pager_next"));
if(!nextPageBtn.getAttribute("class").contains("pager_next_disabled")){ //因为是类,所以getAttribute
nextPageBtn.click();
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
extractJobsByPagination(webDriver);//不是最后一页就调用
}
}
private static void clickOption(WebDriver webDriver, String choseTitle, String optionTitle) {
WebElement chosenElement = webDriver.findElement(By.xpath("//li[@class='multi-chosen']//span[contains(text(),'" + choseTitle + "')]")); //ctrl+alt+v 快速抽取变量
WebElement optionElement = chosenElement.findElement(By.xpath("../a[contains(text(),'" + optionTitle + "')]"));//ctrl+F6重定义变量名字
optionElement.click();
}
}
几个问题:
1.我敲代码的时候打开拉勾网会弹出一个红包,要点击下去,我仿照语法做成功了。
2.抽取方法时快捷键
3.路径问题,有时候路径是前一个小标签下的另一个标签,采用../好像不太好用。不如直接寻找//。(这点不太懂)
4.打印问题,我想打印出表格,没成功,最后做的是名称: 形式。
上一篇: 不会聊天就无法挽回 这样聊才能和好