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

在做图片爬虫时,经常会遇到一些网站需要鼠标不断滚动网页才会继续响应,这对传统的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("//www.greatytc.com/u/4f2c483c12d8",3);
    }

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

总结

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348