利用Selenium模拟页面滚动,结合PicCrawler抓取网页上的图片SeleniumPicCrawler具体实现总结

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

Selenium

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

在build.gradle中添加依赖:

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中配置

repositories {
    mavenCentral()
    jcenter()
}

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

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

具体实现

1. 配置chromedriver的路径

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

2.下载某个网页的图片

    public void downloadPic(String url) {

        WebDriver driver = new ChromeDriver();

        driver.get(url);
        String html = driver.getPageSource();
        List<String> urls = parseHtmlToImages(html,picParser);
        crawlerClient.downloadPics(urls);
    }

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

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

    /**
     *
     * @param url
     * @param scrollDownNum 模拟鼠标滚动到屏幕底部到次数
     */
    public void downloadPic(String url,int scrollDownNum) {

        WebDriver driver = new ChromeDriver();

        driver.get(url);
        String html = driver.getPageSource();
        List<String> urls = parseHtmlToImages(html,picParser);

        crawlerClient.downloadPics(urls);

        if (scrollDownNum>1) {

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

                Utils.scrollDown(driver);

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                html = driver.getPageSource();

                urls = parseHtmlToImages(html,picParser);

                crawlerClient.downloadPics(urls);
            }
        }
    }

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

    /**
     * 模拟浏览器向下滚动
     * @param driver
     */
    public static void scrollDown(WebDriver driver) {

        JavascriptExecutor js = (JavascriptExecutor)driver;
        js.executeScript("scrollTo(0,10000)");
    }

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

测试

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

    public static void main(String[] args) {

        SeleniumCrawlerClient client = new SeleniumCrawlerClient();
        client.downloadPic("https://toutiao.io/",3);
    }

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

Selenium控制Chrome的行为.png

图片抓取完毕。

开发者头条的图片抓取完毕.png

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

    public static void main(String[] args) {

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

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

总结

具体的代码可以查看这个文件

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

微信小程序开发初探

  (1)一切以用户价值为依归→用户是微信的核心,所以微信中没有很多与客户无关的功能,比如QQ中的乱七八糟一系列东西。

49730
来自专栏互联网杂技

Angular 1 vs. Angular 2 深度比较

AngularJS 2 尽管还在Alpha阶段,但主要功能和文档已经发布。让我我们了解下Angular 1 和 2 的区别,以及新的设计目标将如何实现。 Ang...

345100
来自专栏司想君

React编程思想

能够按照构建的方式来思考web app的实现,是React众多优点之一。在这篇文章中,我们将引导你进行使用React构建可搜索产品数据表的思考过程。

53050
来自专栏weixuqin 的专栏

利用 pyspider 框架抓取猫途鹰酒店信息

51570
来自专栏杨龙飞前端

react的一些思考

在做好第一个需求之后,我接到了一个react写的产品,这让我异常的兴奋,终于能写react了

9530
来自专栏司想君

React编程思想

在我们团队看来,React是使用JavaScript构建大型、快速的Web apps的首选方式。它已经在Facebook和Instagram项目中,表现出了非常...

41890
来自专栏极乐技术社区

五个套路看懂微信小程序开发(上)

你或许听说过,快速入门就是要学最小必要知识。而我最近在看微信小程序的官方教程时发现,这个教程虽然简单,但对于微信小程序开发来说,80%的套路都能从这里学习到,你...

31090
来自专栏华仔的技术笔记

React Native 初探

38060
来自专栏九彩拼盘的叨叨叨

耗时函数被短时间频繁调用时,防浏览器卡死的方法

耗时函数如果在短时间内被频繁调用,如果不做合适的处理,会导致浏览器卡死(无响应),严重影响用户体验。

8630
来自专栏HTML5学堂

jQuery1.x与2.x版本区别及1.9版本的变化

HTML5学堂:还记得2012年做开发时,使用的是jQuery1.4版本的框架,一个项目做完时,jQuery版本已经提升到了1.6。不得不说jQuery更新速度...

47640

扫码关注云+社区

领取腾讯云代金券