美文网首页我爱编程
使用selenium+chrome+docker在linux无界

使用selenium+chrome+docker在linux无界

作者: cjhuaxin | 来源:发表于2017-06-07 17:12 被阅读0次

    由于公司需求,需要爬取某招聘网站的简历,这些招聘网站的简历需要登录企业账号才能查看简历,由于验证码比较特殊加上页面中有一些加密的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中出现的颜色异常和正常的验证码图片:

    image.png image.png

    主要难点就在于登录验证码,剩下的就是处理一些反爬虫的策略,包括采用代理、调整爬取时间等等,这些就需要看官根据需求不同自己去调整了,下面是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 &
    

    相关文章

      网友评论

        本文标题:使用selenium+chrome+docker在linux无界

        本文链接:https://www.haomeiwen.com/subject/vltafxtx.html