`

如何抓取Js动态生成数据且以滚动页面方式分页的网页

阅读更多

当我们在进行数据抓取的时候,如果目标网站是以Js的方式动态生成数据且以滚动页面的方式进行分页,那么我们该如何抓取呢?

如类似今日头条这样的网站:http://toutiao.com/

我们可以使用Selenium来搞定这件事情。Selenium的设计目的虽然是用于Web应用程序的自动化测试,但是却非常适合用来做数据抓取,可以非常简单地绕过网站的反爬虫限制,因为Selenium直接运行在浏览器中,就像真正的用户在操作一样。

使用Selenium,我们不但可以抓取Js动态生成数据的网页,而且可以抓取以滚动页面方式分页的网页。

首先,我们使用maven引入Selenium依赖:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>2.47.1</version>
</dependency>

  

接下来就可以写代码抓取了:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

import java.util.List;
import java.util.Random;

/**
 * 如何抓取Js动态生成数据且以滚动页面方式分页的网页
 * 以抓取今日头条为例说明:http://toutiao.com/
 * Created by ysc on 10/13/15.
 */
public class Toutiao {
    public static void main(String[] args) throws Exception{

        //等待数据加载的时间
        //为了防止服务器封锁,这里的时间要模拟人的行为,随机且不能太短
        long waitLoadBaseTime = 3000;
        int waitLoadRandomTime = 3000;
        Random random = new Random(System.currentTimeMillis());

        //火狐浏览器
        WebDriver driver = new FirefoxDriver();
        //要抓取的网页
        driver.get("http://toutiao.com/");

        //等待页面动态加载完毕
        Thread.sleep(waitLoadBaseTime+random.nextInt(waitLoadRandomTime));

        //要加载多少页数据
        int pages=5;
        for(int i=0; i<pages; i++) {
            //滚动加载下一页
            driver.findElement(By.className("loadmore")).click();
            //等待页面动态加载完毕
            Thread.sleep(waitLoadBaseTime+random.nextInt(waitLoadRandomTime));
        }

        //输出内容
        //找到标题元素
        List<WebElement> elements = driver.findElements(By.className("title"));
        int j=1;
        for(int i=0;i<elements.size();i++) {
            try {
                WebElement element = elements.get(i).findElement(By.tagName("a"));
                //输出标题
                System.out.println((j++) + "、" + element.getText() + " " + element.getAttribute("href"));
            }catch (Exception e){
                System.out.println("ignore "+elements.get(i).getText()+" because "+e.getMessage());
            }
        }

        //关闭浏览器
        driver.close();
    }
}

 

代码也可以从我的开源项目HtmlExtractor中获取。

这里我们共抓取了6页,每页20条新闻,共120条新闻,代码运行结果

 

 

 

 

 

 

 

3
3
分享到:
评论
3 楼 wkbulletin 2015-12-28  
[color=yellow]
引用
引用
[u][u][u][u][u][u][u][u][u][u][u][u][u][u][i][b]
[flash=200,200][url][img][list]
[*]
引用
[/list][/img][/url][/flash]
[/b][/i][/u][/u][/u][/u][/u][/u][/u][/u][/u][/u][/u][/u][/u][/u]
                             [/color]
2 楼 qwzs112 2015-10-14  
  文章不错 加油
腾讯公司推荐——新产品:
颠覆传统的产品管理系统iClap
官网:www.iclap.cn    
感兴趣的可以看下
1 楼 戢_时光 2015-10-14  
     

相关推荐

    Js读取json数据实现滚动分页实例

    在处理数据展示时,滚动分页是一种常见的优化用户体验的方法,它允许用户在滚动页面时动态加载更多内容,而不是一次性加载所有数据。本实例将探讨如何使用JavaScript从JSON数据源中实现滚动分页功能。 首先,理解...

    javascript读取json数组生成滚动分页

    在本场景中,我们将关注如何使用JavaScript从JSON数组中读取数据并生成滚动分页效果。滚动分页是一种用户滚动到页面底部时自动加载更多数据的技术,常见于社交网络和新闻网站。 首先,我们需要理解JSON(JavaScript...

    js html动态分页

    在网页开发中,数据量庞大的页面常常需要进行分页处理,以便用户能够更方便地浏览信息。本知识点将深入探讨“js html动态分页”的原理和实现方法,结合提供的资源——"html自动分页.html",我们将分析如何利用...

    动态生成div框并且同时加载数据

    在网页开发中,动态生成div框并同时加载数据是一种常见的优化技术,特别是在处理大量数据时。这种方法能够显著提高用户体验,因为它允许数据分批次或者按需加载,而不是一次性加载所有内容,从而减少网络负担和...

    jQuery动态生成分页列表代码.zip_doorrj2_jQuery动态生成分页列表代码

    在网页开发中,分页是常见的一种数据展示方式,它能有效地管理大量数据,提高用户体验。本资源"jQuery动态生成分页列表代码.zip"提供了一种实用的解决方案,由开发者doorrj2创建,用于实现每页固定数量列表的分页...

    jquery实现数据分页显示

    在网页开发中,数据分页是一项非常常见的功能,它能够帮助用户更有效地浏览大量信息,而不会一次性加载过多内容导致页面加载慢或者浏览器卡顿。本教程将专注于使用JavaScript库jQuery来实现数据分页显示,涵盖了内存...

    javascript读取Json数据分页显示

    在处理大量数据时,分页是一种常见的优化策略,可以提高网页性能并提升用户体验。在这个场景中,我们将讨论如何使用JavaScript从JSON数据源中读取数据,并实现支持键盘和滚轮翻页的功能。 首先,JSON(JavaScript ...

    24款网页分页方法满足网站需要

    3. 动态分页:一些方法利用JavaScript或者jQuery动态生成分页,例如根据服务器返回的数据自动调整页数。这种方式交互性强,用户体验佳,但需考虑浏览器兼容性。 4. AJAX无刷新分页:通过AJAX技术,用户在切换页面时...

    静态页面js分页实例

    "静态页面js分页实例"是指在不依赖服务器端动态生成的情况下,通过JavaScript在客户端实现分页功能。这种方法提高了页面加载速度,减轻了服务器压力,同时也提供了较好的用户体验。 在JavaScript分页中,我们需要...

    分页js文件

    JavaScript允许我们动态地生成和更新DOM元素,从而实现页面内容的实时更新。以下是一些使用JavaScript实现分页的关键步骤: 1. 计算总页数:根据数据总数和每页显示的条目数计算出总页数。 2. 创建分页导航:生成一...

    js+json精彩分页

    在JavaScript和JSON的世界里,"js+json精彩分页"是一个常见的应用场景,特别是在网页开发中。这个主题主要涉及两个核心概念:JavaScript(JS)和JSON(JavaScript Object Notation)。在这个项目中,它们被用来实现...

    网页js 写的 分页(7个)

    在没有JavaScript的情况下,通常会通过服务器端生成固定数量的页面链接,但这种方式对服务器压力较大,且不支持动态加载。JS分页通过AJAX异步请求,只获取当前页的数据,减少了服务器的负担,同时也提高了页面的响应...

    关于分页的页面控件

    在网页设计和开发中,分页是一种常见的用户体验优化技术,用于处理大量数据的展示,比如在电商网站的商品列表、论坛的帖子或者社交媒体的动态流中。分页将大量的信息分割成若干个小部分,使得用户可以逐页浏览,避免...

    jspdf实现JavaScript显示pdf文档可分页哦

    `jspdf` 提供了在浏览器环境中直接处理PDF的能力,允许开发者通过JavaScript生成动态的PDF内容。用户可以使用这个库将HTML元素转换为PDF格式,从而实现网页内容的离线保存或打印。通过调用`jspdf` 的API,可以轻松...

    HTML5页面在安卓手机端分页显示数据

    此外,考虑到性能优化,可以考虑在用户滚动到页面底部时动态加载下一页数据,这就是所谓的“懒加载”。 总结,实现HTML5页面在安卓手机端分页显示数据的关键在于合理利用HTML5的响应式设计、JavaScript的Ajax技术...

    jQuery 分页 滑动分页

    在网页开发中,分页是一种常见的用户界面设计,用于处理大量数据或内容的展示,以提高用户体验和页面加载速度。jQuery 是一个广泛使用的JavaScript库,它简化了DOM操作、事件处理和动画效果。滑动分页是jQuery分页中...

    jquery选项卡图片分组滚动切换带分页的图片滚动切换

    总的来说,"jquery选项卡图片分组滚动切换带分页的图片滚动切换"是一个综合性的网页开发项目,它涵盖了前端开发中的多个重要技术点,包括用户界面设计、动态效果实现和数据管理。通过实践这个项目,开发者可以提升...

    js分页,使用js脚本产生分页的html代码

    在网页开发中,分页是一种常见的用户界面设计,用于处理大量数据列表的显示。当数据过多,一次性加载全部内容会影响页面性能和用户体验时,分页就显得尤为重要。本篇文章将详细探讨如何使用JavaScript(js)脚本来...

    网页分页(带有说明)

    网页分页是网页设计中一个常见且重要的技术,特别是在数据量大、无法一次性展示所有内容时。本程序采用JavaScript实现,允许用户自定义每页显示的条目数量,旨在提供简洁易用的用户体验。以下是对这个分页程序的详细...

    javascript动态生成table及处理.

    通过 JavaScript 动态生成表格可以更加灵活地管理和更新数据。本文将深入分析一个具体的示例,该示例展示了如何使用 JavaScript 来动态生成一个表格,并根据用户的选择进行实时更新。 #### 核心代码解析 首先,...

Global site tag (gtag.js) - Google Analytics