笔者之前使用RPA工具-来也Uibot给公司人事开发了一款岗位薪酬爬虫程序,感觉这种工具还是是给不太懂开发的大众小白用的,不太灵活,也没有强大的技术栈做支撑,后来发现了谷歌的puppeteer技术,非常喜欢,感觉这才是程序员需要的开发工具,但puppeteer 只支持NodeJs,对于C++、Java、Python技术栈的我来说,感觉还是不够方便,再后来又遇到了PlayWright:Puppeteer团队跳槽到微软开发的同类技术,但除了Js还支持Java,Python和C#等多种语言。不错!就是你了,于是笔者拿PlayWright重写了之前那款爬虫,实现思路也很简单,大致如下:
1)依次创建PlayWright、Browser、BrowserContext等对象,
String keyword = "Java工程师";
List<String> pwArgs = new ArrayList<>();
pwArgs.add("--start-maximized");
try (Playwright playwright = Playwright.create()) {
Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setArgs(pwArgs).setHeadless(false));
BrowserContext context = browser.newContext(new Browser.NewContextOptions().setViewportSize(null));
。。。
2)创建一个页面并跳转到boss直聘页面
Page page = context.newPage();
page.addInitScript("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});");
String url = "https://www.zhipin.com/";
System.out.println(url);
page.navigate(url);
3)使用PlayWright提供的API,在搜索栏中输入岗位关键词,点击搜索按钮,并拦截“https://www.zhipin.com/wapi/zpgeek/search/joblist.json”接口获取相关岗位信息
page.locator("input[name='query']").fill(keyword);
Response rs = page.waitForResponse(
r -> r.url().contains("https://www.zhipin.com/wapi/zpgeek/search/joblist.json") && r.ok(),
() -> page.locator("text='搜索'").click()
);
4)解析拦截返回的岗位信息,并存储到Excel文件中
SONObject json = new JSONObject(rs.text());
JSONObject zpData = (JSONObject) json.get("zpData");
JSONArray jobList = zpData.getJSONArray("jobList");
System.out.println(jobList);
saveFile(jobList);
测试运行,一切OK。一个简单小巧且精致的爬虫程序就此完成。