自从我的个人博客搭建起之后,每天的nginx日志里面都有很多来自爬虫的请求,大多都是 /index.php
/login.php /admin.php等等之类的请求.据说互联网50%以上的流量都是来自爬虫,
以前前后端未分离的时候,页面都是服务端渲染好后返回给客户端,这样的页面就很好爬取,模拟一个http请求就能获取到后端的资源.
随着AJAX技术不断的普及,以及现在的angular和React,Vue等框架的出现, 页面渲染被转移到客户端了,一个爬虫请求过去,只能拿到最基本的html,资源请求和页面渲染全是js来完成的,这种情况怎么办呢?俗话说一物降一物,有反爬就有反反爬(哈哈),下面介绍一个工具Selenium,专治这种情况.废话不多说了,上代码:
一,添加Selenium依赖
org.seleniumhq.selenium
selenium-java
2.33.0
二,下载一个chrome驱动
很多下载chrome驱动的网站都不能用了;推荐在淘宝的镜像仓库下载:
http://npm.taobao.org/mirrors/chromedriver/ 注意版本,我下载的是73.0.3683.68/
三,爬虫代码
以西瓜视频为例,西瓜视频使用的是自己的一个播放器,
红框里面的资源路径,就是视频的播放地址,是用js渲染进去的
下面的代码,第一行是先设置环境变量,让Selenium能找到chrome的驱动,不然会报错
public static void main(String[] args) throws Exception {
System.getProperties().setProperty("webdriver.chrome.driver", "D:\\chromeDriver\\chromedriver.exe");
ChromeDriver webDriver = new ChromeDriver();
webDriver.get("https://www.ixigua.com/i6707783341539590659/");
WebElement element = webDriver.findElement(By.xpath("/html"));
System.out.println(element.getAttribute("outerHTML"));
webDriver.close();
}
运行代码,会弹出一个窗口,因为Selenium会创建一个chrome进程,相当于本地打开了一个谷歌浏览器,然后将拿到的html打印出来,可以看到这个
资源路径已经拿到了,好了,后面的就不用说了
爬虫有风险,各位仅为学习之用,千万守住底线!