本文已独家受权给脚本之家(jb51net)、新华先后端开发公众号发布
[TOC]css
作技术咱们最重要的是【作】。可是今天咱们来说片【玩】。这句话可能不太好理解。直接开门见山吧。对于外行朋友一谈到IT他们对咱们的定位就是黑客。其实咱们和黑客一点关系都没有。今天的技术是【爬虫】 。 为何说爬虫和黑客有点关联呢。由于爬虫能够将人为行为进行机器化。就是实现编写好代码让机器代替咱们人类重复的操做意见事情。html
对于爬虫了咱们这里不作基础的讲解了。在平时的开发中咱们偶尔会用到爬虫。好比说咱们系统须要添加天气状况。可是咱们有没有气象站给我提供数据。这时候咱们最显示的作法就是调用网络上免费的天气接口API 。 这个时候咱们Java就会经过爬虫模拟除一个浏览器请求去访问这个天气接口的API。 而后在经过爬虫获取这个API返回的数据。从而进行解析。java
对于这些免费的API咱们经过爬虫(HttpClient)就能够轻松的访问了。可是想优酷、爱奇艺、掘金这些等级网站他们会有发爬虫策略。最多见的就是利用爬虫进行刷票的行为。他们针对这些刷票作了一些措施。具体措施就不说了(不知道)。更有甚者他们对他们的页面进行加密。让你没法分析他们的html.或者加大你分析的成本。以上就是以前咱们用爬虫爬取数据遇到的一些问题。下面简单梳理下咱们遇到爬虫的问题jquery
今天咱们带了一个好东西。它转变了咱们传统爬虫的思路。传统的爬虫咱们会去按照开发者的思路去处理逻辑。可是selenium他不须要关注开发者逻辑。只须要咱们关注本身的需求。什么意思呢?就是说selenium他就是在模拟用户的行为,你告诉selenium我须要点击页面的某个按钮了,他就去点击了。你告诉他我须要在某个输入框中输入内容了。他就去给你输入内容。有了它,你不再用管输入内容以后提交登陆真正请求了。这样的好处是下降了爬虫的学习成本。对于不懂技术的人也能够很快上手了。web
点我下载内核chrome
这个是干吗的呢?这里先透露下selenium使用的是浏览器的内核操做页面的。因此这里须要如今内核。下载内核前提是电脑上有浏览器。笔者这里电脑上浏览器是Google 1.73版本 。 因此下载内核就得是对应的版本,不然会报错的。在notes.txt文件中会列出每一个对应的浏览器的版本的。npm
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency>
想一想咱们平时浏览网页的时候是须要先打开浏览器,这里也是同样。ubuntu
【咱们须要打开浏览器】(个人内核放在/root/Downloads/chromedriver)后端
ChromeOptions chromeOptions = new ChromeOptions(); File chromeDriverPath = new File("/root/Downloads/chromedriver"); System.setProperty("webdriver.chrome.driver", chromeDriverPath.getAbsolutePath()); chromeOptions.addArguments("--headless"); chromeOptions.addArguments("--disable-gpu"); //ubuntu浏览器中须要添加 chromeOptions.addArguments("--no-sandbox"); webDriver = new ChromeDriver(chromeOptions);
headless : 表示隐式打开浏览器,由于作爬虫就不须要显示界面了。
no-sandbox : 这个是由于个人Ubuntu安装的google须要这个参数,因此这里也须要加上
disable-gpu : 同上浏览器
【输入连接地址】(https://juejin.im/)webDriver.get("https://juejin.im/");
,这样内核就获取到了咱们在浏览器中看到的效果。那么咱们这么获取咱们须要的页面数据呢。findElement
经过这个方法咱们能够获取到咱们想要的任何数据。换句话说经过这个方法这个页面在你面前尽收眼底。包括他的衍生页面
有的读者有疑问了。我该怎么让他获取我想要的东西呢。
咱们能够看出来这个方法里只有一个参数,By对象。这个By对象里提供了以下方法
上面这些方法就是咱们定位元素的方法。什么意思呢,咱们前段朋友们常常经过jquery操做html的dom对象,在By对象里cssSelector就是和jquery一样的操做方法。好多都是和jquery相似的。这里不懂技术的人会说这里技术点很难。其实不难。 咱们不懂代码的怎么办呢。咱们在浏览器浏览页面 。 好比下图中我想获取个人博客名称(框架原理那点事--不就反射嘛。)
咱们鼠标放在【框架原理那点事--不就反射嘛】上右键选择【检查】。会自动跳转到对应的代码的
后面三种对应By里面的制定方法。这里就不说了。
WebElement webElement = webDriver.findElement(By.cssSelector("xxxxxx")); JavascriptExecutor js = (JavascriptExecutor) webDriver; js.executeScript("arguments[0].click();",digg);
上面的webElement是页面中一个按钮。咱们能够直接webElement.click()让按钮点击或者webElement.submit()提交Form表单。可是有的时候会不起做用。这个时候用上面的代码能够进行点击。
File source = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE); try { Files.copy(source.toPath(), new FileOutputStream(new File("/root/Downloads/test/1.png"))); } catch (IOException e) { e.printStackTrace(); } try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
咱们内核操做由于正常不开浏览器界面,可是咱们调试的时候又想知道结果,能够打印除当前窗口的图片。就是上述的代码
Set<String> windowHandles = webDriver.getWindowHandles(); for (String windowHandle : windowHandles) { if (!windowHandle.equals(webDriver.getWindowHandle())) { //webDriver.switchTo().window(windowHandle); } }
webDriver.navigate().to("https://juejin.im/post/5d76f6585188254cc27b2af4"); webDriver.get("https://juejin.im/post/5d76f6585188254cc27b2af4");
webDriver.get("https://juejin.im/timeline"); webDriver.manage().addCookie(cookie); webDriver.get("https://juejin.im/post/5d76f6585188254cc27b2af4");
这里值得注意的是,在添加cookie以前咱们须要先访问主页,告诉内核咱们后面添加的cookie是给那个Host下添加的。这样咱们添加的cookie才会有效。如上咱们在juejin.im这个Host下都添加了Cookie。
我的网站(https://zxhtom.oschina.io)
我的微信(zxh870775401)
微信公众号 : 新华先后端开发