因为最近新型冠状病毒的事件,在家闲的发慌,加上一直对爬虫有独特的喜爱,但目前只会java基础,py还未深入学习,所以我打算开始我的java爬虫学习之路。(本人大一,有什么说错的请大家纠正!)
为什么java爬虫要用到selenium呢?,在前几天刚刚接触selenium的时候,我也不是很清楚,为什么不能用httpclient,之类的框架做爬虫呢?,
对于这个疑问,后续我也使用了httpclient做了一个爬虫,然鹅,就在我要爬取我们学校教务系统的信息的时候,我发现了,我们学校的登录验证需要提交一个表单,而表单里面的内容,密码是经过了各种加密,还有一个token验证,才能登录成功。
所以这样看来,使用selenium是一个很好的选择,因为他采用了人工模拟操作浏览器点击的方式进行,所以绕过了这些防线。(或者是我太笨了,不会加密解密?)
Selenium是web自动化测试的一个工具
遇到的问题,和解决方法:
学习内容我将实实时更新,并分节进行,如果章节内容实在过多,我会用插入链接的方式进行更新。
屁话不多说,开始!
1.Selenium的jar包: http://selenium-release.storage.googleapis.com/index.html.
2.使用浏览器内核当然要先下对应的浏览器啊!,自己准备好浏览器。
3.各种浏览器的内核,(推荐使用chrome,我也不知道为啥用谷歌,看到很多人用,就用了)
下载完之后就可以开始写代码了:
打开eclipse
/*设置浏览器内核的路径
*第一个参数的格式: webdriver.你浏览器内核的名字.driver
*比如浏览器是谷歌: webdriver.chrome.driver
*火狐:webdriver.gecko.driver
*/
System.setProperty("webdriver.chrome.driver", "浏览器内核的路径");
//实例化对象
WebDriver driver = new ChromeDriver();
//打开浏览器,访问网站
driver.get("网站网址");
需要调用 —ChromeOptions,这个类中的方法:
为了加快爬取速度,我们一般通过执行浏览器启动参数,来进行——无头浏览,禁止加载图片,css文件,等操作。
而:浏览器启动参数一般有:
ChromeOptions chromeoptions=new ChromeOptions ();
chromeoptions.addArguments("--headless");//无头浏览
chromeoptions.addArguments("blink-settings=imagesEnabled=false");//禁用图片
WebDriver driver = new ChromeDriver(chromeoptions);//传入chromeoptions对象
driver.get("网站网址");
其实经过博主的大量测试,无头浏览加上禁用图片这2个操作,最多会加快个1秒左右,如果不是需要大量的爬取,加与不加都无所谓,仅仅是简洁的作用罢了。
谷歌还有很多启动参数,但是有些似乎没用的,大家有兴趣的可以看看:
https://peter.sh/experiments/chromium-command-line-switches/.
其实这个的话学过js定位操作的同学都很简单,不会js的同学先去学一学吧。
这里就举最常用的几个例子—sendkey() 和—click();
这里的By是selenium的一个类,通过这个类来指定元素,id,classname,tagname什么什么的
WebDriver driver = new ChromeDriver();
driver.findElement(By.id("yhm")).sendKeys(account);//输入账号
driver.findElement(By.id("mm")).sendKeys(password);//输入密码
driver.findElement(By.id("dl")).click();//点击
//如果是classname还有tagname之类的元素,需要一个List<>集合去获得
List<WebElement> list=driver.findElement(By.className("name"));
更多的元素操作跟js都是一个道理的,自己慢慢摸索吧。
driver.get(url);//访问指定URL
driver.getPageSource();//获取当前网页的源码
driver.getCurrentUrl();//获取当前的url
driver.getTitle();//获取网页标题
driver.manage();//获取options
driver.manage().getCookies();//获取cookie集合
driver.manage().getCookieNamed(name);//获取指定的cookie
driver.quit();//关闭浏览器(推荐使用这个方法,quit可以比close更加完全的释放资源)
driver.close();//关闭浏览器(不推荐用这个)
(1) 无返回值
JavascriptExecutor executor= (JavascriptExecutor) driver;//转换driver对象,获取js执行器
String js="console.log('hello world')";//js语句
executor.executeScript(js);//执行js
(2) 有返回值
JavascriptExecutor executor= (JavascriptExecutor) driver;//转换driver对象,获取js执行器
String js=""
+ "var a=1;"
+ "var b=2;"
+ "var sum=a+b;"
+ "return sum;";//return 返回值
int sum=(int)executor.executeScript(js);//执行js,并返回一个object值,强制转换为int
JavascriptExecutor 还有其他的方法可以使用,大家有兴趣可以自己研究一下。