由于公司需求,需要爬取某招聘网站的简历,这些招聘网站的简历需要登录企业账号才能查看简历,由于验证码比较特殊加上页面中有一些加密的js,导致直接用http请求实现起来难度较大。为了绕过页面中js对cookie的操作,所以采用selenium模拟登录并爬取简历。
首先先感受一下这些招聘网站的验证码:
从后台返回的图片是这样子的
这样子的
然后在页面上再利用js重新拼接成我们看到的样子,简直是丧心病狂啊!!!
这种类型的验证码应该算是比较难的,靠自己去破解显然不太现实,所以我们的做法是利用selenium+Ashot进行截图,然后把图片传到打码平台,那边会返回点击的坐标,再利用selenium的Action根据坐标模拟点击,部分代码如下:
gradle依赖的jar包
compile("org.seleniumhq.selenium:selenium-java:3.3.1")
compile("org.seleniumhq.selenium:selenium-support:3.3.1")
compile("ru.yandex.qatools.ashot:ashot:1.5.2")
对验证码进行截图:
WebDriver webDriver = new ChromeDriver();
WebElement divVImage = webDriver.findElement(By.id("divVImage"));
WebElement divVPhrase = webDriver.findElement(By.id("divVPhrase"));
Screenshot myScreenshot =newAShot().takeScreenshot(webDriver,divVImage);
Screenshot smallShot =newAShot().takeScreenshot(webDriver,divVPhrase);
BufferedImage contentImage = myScreenshot.getImage();//屏幕上截取验证码图片
BufferedImage headImage = smallShot.getImage();//屏幕上截取验证码头部文字图片
//合成图片后获取最终图片的字节数组
BufferedImage finalImg = new BufferedImage(contentImage.getWidth(),
contentImage.getHeight() + headImage.getHeight(), contentImage.getType());
finalImg.createGraphics().drawImage(contentImage, 0, 0, null);
finalImg.createGraphics().drawImage(headImage, 0, contentImage.getHeight(), null);
// 对最后的图片写入字节数组并返回
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
//这里formatName采用的是PNG,刚开始我们用的是JPEG,但是在docker环境下面截取的图片会出现色差,导致打码平台无法识别,所以换成了PNG,如果遇到类似问题的同学注意一下
ImageIO.write(finalImg, "png", byteOutputStream);
byte[] finalImageByte = byteOutputStream.toByteArray();
//把合成的图片传入打码平台,返回每次点击的坐标
下图分别是在docker中出现的颜色异常和正常的验证码图片:
主要难点就在于登录验证码,剩下的就是处理一些反爬虫的策略,包括采用代理、调整爬取时间等等,这些就需要看官根据需求不同自己去调整了,下面是selenium+chrome的docker的构建文件:
# Pull base image
FROM airdock/oracle-jdk:1.8
MAINTAINER chenjun "chenjun@lt51.cn"
# 更新
RUN apt-get update
# 复制chromedriver,根据自己需要配合不同的版本,连接如下
# https://sites.google.com/a/chromium.org/chromedriver/
COPY config/chromedriver /chromedriver
RUN chmod +x /chromedriver
# 复制chrome
COPY config/google-chrome-stable_current_amd64.deb /rencaijia/server/spider/google-chrome-stable_current_amd64.deb
# 安装chrome相关依赖
RUN apt-get -y install libpango1.0-0
RUN apt-get -y install libxss1
RUN apt-get -y install fonts-liberation
RUN apt-get -y install libappindicator1
RUN apt-get -y install xdg-utils
RUN apt-get -y install libasound2
RUN apt-get -y install libgconf-2-4
RUN apt-get -y install libnspr4
RUN apt-get -y install libnss3
RUN apt-get -y install wget
# 安装chrome,根据不同版本,安装chrome
RUN cd /rencaijia/server/spider/ && dpkg -i google-chrome-stable_current_amd64.deb
# 安装虚拟屏幕xvfb
RUN apt-get -y install xvfb
# 虚拟显示屏的编号设置成10
RUN export DISPLAY=:10
# 1440x900x24 表示分辨率是1440*900,这个根据自己需要去调整,24表示颜色的深度,如果考虑性能可以调低一点
RUN Xvfb :10 -ac -screen 0 1440x900x24 &