利用Selenium模拟页面滚动,结合PicCrawler抓取网页上的图片

在做图片爬虫时,经常会遇到一些网站需要鼠标不断滚动网页才会继续响应,这对传统的HttpClient是一件很困难的事情,至少我不知道如何处理。幸好,我找到了Selenium。

Selenium

Selenium 是一组软件工具集,每一个都有不同的方法来支持测试自动化。大多数使用 Selenium 的QA工程师只关注一两个最能满足他们的项目需求的工具上。然而,学习所有的工具你将有更多选择来解决不同类型的测试自动化问题。这一整套工具具备丰富的测试功能,很好的契合了测试各种类型的网站应用的需要。这些操作非常灵活,有多种选择来定位 UI 元素,同时将预期的测试结果和实际的行为进行比较。Selenium 一个最关键的特性是支持在多浏览器平台上进行测试。

在build.gradle中添加依赖:

  
  
    
    
    
    
  1. compile 'org.seleniumhq.selenium:selenium-java:3.7.1'

除了需要添加selenium的依赖之外,还需要添加webdirver。

在这里,我使用chromedirver(也可以选择firefoxdriver,看个人喜好),chromedirver可以在https://sites.google.com/a/chromium.org/chromedriver/downloads 下载最新的版本。针对不同的操作系统,需要下载对应的版本。

PicCrawler

PicCrawler是我开发的抓取图片的爬虫,支持一些简单的定制比如User-Agent、referer、header、cookies等。感兴趣的同学可以看我之前写的文章基于RxJava2实现的简单图片爬虫

对于Java项目如果使用gradle构建,由于默认不是使用jcenter,需要在相应module的build.gradle中配置

  
  
    
    
    
    
  1. repositories {

  2.    mavenCentral()

  3.    jcenter()

  4. }

然后再添加最新的piccrawler的依赖

  
  
    
    
    
    
  1. compile 'com.cv4j.piccrawler:crawler:0.5.1'

具体实现

1. 配置chromedriver的路径

  
  
    
    
    
    
  1.    static {

  2.        System.setProperty("webdriver.chrome.driver", "crawler-selenium/chromedriver");

  3.    }

2.下载某个网页的图片

  
  
    
    
    
    
  1.    public void downloadPic(String url) {

  2.        WebDriver driver = new ChromeDriver();

  3.        driver.get(url);

  4.        String html = driver.getPageSource();

  5.        List<String> urls = parseHtmlToImages(html,picParser);

  6.        crawlerClient.downloadPics(urls);

  7.    }

在这里,通过WebDriver请求网页,然后将请求的html字符串进行解析得到图片的集合,最后交给图片爬虫进行下载图片。

3.多次滚动某个网页,下载网页上的图片

  
  
    
    
    
    
  1.    /**

  2.     *

  3.     * @param url

  4.     * @param scrollDownNum 模拟鼠标滚动到屏幕底部到次数

  5.     */

  6.    public void downloadPic(String url,int scrollDownNum) {

  7.        WebDriver driver = new ChromeDriver();

  8.        driver.get(url);

  9.        String html = driver.getPageSource();

  10.        List<String> urls = parseHtmlToImages(html,picParser);

  11.        crawlerClient.downloadPics(urls);

  12.        if (scrollDownNum>1) {

  13.            for (int i=0;i<scrollDownNum-1;i++) {

  14.                Utils.scrollDown(driver);

  15.                try {

  16.                    Thread.sleep(2000);

  17.                } catch (InterruptedException e) {

  18.                    e.printStackTrace();

  19.                }

  20.                html = driver.getPageSource();

  21.                urls = parseHtmlToImages(html,picParser);

  22.                crawlerClient.downloadPics(urls);

  23.            }

  24.        }

  25.    }

在这个方法里用到了scrollDown(),它的作用是模拟浏览器向下滚动。

  
  
    
    
    
    
  1.    /**

  2.     * 模拟浏览器向下滚动

  3.     * @param driver

  4.     */

  5.    public static void scrollDown(WebDriver driver) {

  6.        JavascriptExecutor js = (JavascriptExecutor)driver;

  7.        js.executeScript("scrollTo(0,10000)");

  8.    }

带scrollDownNum参数的downloadPic(),第一次先通过WebDriver请求网页,然后不断地模拟浏览器行为向下滚动不断地请求网页,并解析网页下载图片。scrollDownNum表示向下滚动的次数。

测试

对开发者头条网站上的图片进行抓取,并模拟浏览器向下滚动3次。

  
  
    
    
    
    
  1.    public static void main(String[] args) {

  2.        SeleniumCrawlerClient client = new SeleniumCrawlerClient();

  3.        client.downloadPic("https://toutiao.io/",3);

  4.    }

程序执行后,会弹出一个Chrome,由Selenium进行控制。毕竟Selenium是自动化测试的工具:)

利用Selenium模拟页面滚动,结合PicCrawler抓取网页上的图片_第1张图片

图片抓取完毕。


利用Selenium模拟页面滚动,结合PicCrawler抓取网页上的图片_第2张图片


再换一个网站尝试一下,对简书的个人主页上的图片进行抓取。

  
  
    
    
    
    
  1.    public static void main(String[] args) {

  2.        SeleniumCrawlerClient client = new SeleniumCrawlerClient();

  3.        client.downloadPic("http://www.jianshu.com/u/4f2c483c12d8",3);

  4.    }

同样能达到一样的效果,那我就可以放心去抓其他网站上的图片了:)

总结

具体的代码可以查看这个文件(https://github.com/fengzhizi715/PicCrawler/blob/master/crawler-selenium/src/main/java/com/cv4j/piccrawler/selenium/SeleniumCrawlerClient.java)。

由于selenium需要依赖webdriver,而webdriver本身比较大又跟操作系统相关,所以没有把它封装成一个库。我也是第一次尝试使用selenium,未来希望能够结合它能够做出更好玩的东西。

最后,附上github地址: https://github.com/fengzhizi715/PicCrawler



关注【Java与Android技术栈】

更多精彩内容请关注扫码

利用Selenium模拟页面滚动,结合PicCrawler抓取网页上的图片_第3张图片


你可能感兴趣的:(利用Selenium模拟页面滚动,结合PicCrawler抓取网页上的图片)