`

如何抓取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  
     

相关推荐

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

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

    JavaScript网页特效范例宝典源码

    实例014 页面自动滚动 26 实例015 打开窗口特殊效果 27 实例016 动态显示窗口 29 实例017 慢慢放大的窗口 30 实例018 下降式浏览器 32 实例019 旋转的窗口 33 实例020 移动的窗口 34 实例021 震动的窗口 35 实例022 ...

    程序天下:JavaScript实例自学手册

    1.18 以频道模式打开页面 1.19 自动识别网页类型 1.20 在网页中动态添加Script脚本 1.21 用JavaScript随机修改页面的标题 1.22 判断网页加载完毕 1.23 嵌入网页的播放器 1.24 设置指定网页为主页 1.25 使用...

    《程序天下:JavaScript实例自学手册》光盘源码

    1.18 以频道模式打开页面 1.19 自动识别网页类型 1.20 在网页中动态添加Script脚本 1.21 用JavaScript随机修改页面的标题 1.22 判断网页加载完毕 1.23 嵌入网页的播放器 1.24 设置指定网页为主页 1.25 使用...

    企业SEO站 v17.2 无组件生成HTML.rar

    11、手机站全部数据自动提取对接标题、关键词、描述和内容,新增分页新闻和产品生成HTML页面。 12、后台设置关键词排序修正,按照数字从小到大排序,数据库排序字段按照数字调整。 13、添加关键词字段,重复过滤...

    Infinite-Scroll-pagination-React:这是一个React应用程序,它在搜索页面中展示了无限滚动分页示例,可以使用React References和Intersection Observer轻松应用此技术,其想法是,当前列表中的最后一个元素出现在页面上时,下一个调用查询更多数据(下一页)

    如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误。 npm test 在交互式监视模式下启动测试运行器。 有关更多信息,请参见关于的部分。 npm run build 构建生产到应用程序build文件夹。 它在...

    ASP.NET开发实战1200例(第Ⅰ卷)第十二章

    实例293 动态生成CSS设置下拉式菜单实现 页面跳转 465 实例294 利用CSS样式设置解释型菜单 467 实例295 利用主题中CSS级联样式动态更换 网站皮肤 468 12.2 应用JavaScript脚本实现Web窗口 控制 470 实例296 利用...

    用模版生成HTML的的框架jquery.tmpl使用详解

    动态请求数据来更新页面是现在非常常用的方法,比如博客评论的分页动态加载,微博的滚动加载和定时请求加载等。 这些情况下,动态请求返回的数据一般不是已拼好的 HTML 就是 JSON 或 XML,总之不在浏览器端拼数据就...

    jquery-infinite-with-template:infiniteScrollWithTemplate-用于启用Ajax的无限页面滚动和模板自动分页的JQuery插件

    带有模板插件的jQuery Infinite JQuery插件,用于带有模板的启用Ajax的无限页面滚动。 如果您到目前为止喜欢jQuery,那么这个小库将有所帮助。演示版为了方便的http-server需要: git clone ...

    70款经典Dreamweaver插件

    X164476_nirvana_iframePack 一组关于iframe的插件,可以动态的改变iframe中的页面 MX152319_save_all 在Drw的File菜单下加一个Save All命令,用来保存所有Dreamweaver窗口的文件 Layerfx 可以让层做绕定轴转动、...

    仿优美电影网 For 光线CMS.zip

    13,新增独立生成各频道栏目首页功能,后台自由生成,静动态模式自由切换; 114,首页及其它页面再次做细节美化调整; 5,页面增加拖动到一定位置是自动显示返回顶部按钮,并附带加入收藏及留言求片按钮,增强用户...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例038 动态输出JavaScript代码 69 实例039 当数字遇到了字符串 70 实例040 PHP程序员的基础——变量的应用 72 实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变变量输出“I Like PHP!” 73 实例...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例038 动态输出JavaScript代码 69 实例039 当数字遇到了字符串 70 实例040 PHP程序员的基础——变量的应用 72 实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变变量输出“I Like PHP!” 73 实例...

    PHP程序开发范例宝典III

    实例033 根据数据表结构自动生成数据录入页面 45 实例034 投票系统中单选按钮与复选框的应用 47 2.3 下拉列表的应用 50 实例035 在下拉菜单中显示数据表某列的字段值 50 实例036 在下拉菜单中显示数组中的...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    手动优化了PDF的书签,书签可折叠,书签链接以目录方式保存,多达1000多页,每页都做了书签定位,手都累酸啦。 ============================== 因权限只能到60MB,分卷压缩了,共3个压缩包,需下载完3个一起解压, ...

    JavaScript经典效果集锦

    一 实用且必用的小脚本代码二 鼠标旁边的提示信息,类似与163登录后的页面提示效果三 如果文字过长,则将过长的部分变成省略号显示四 滚动的图片五 接收键盘指令的脚本六 让你的文本链接渐隐渐显七 类似与QQ的好友/黑...

    Ext Js权威指南(.zip.001

    Ex4.0共2个压缩包特性,《ext js权威指南》 前 言 第1章 ext js 4开发入门 / 1 1.1 学习ext js必需的基础知识 / 1 1.2 json概述 / 3 1.2.1 认识json / 3 1.2.2 json的结构 / 3 1.2.3 json的例子 / 4 1.2.4 ...

    asp.net知识库

    如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且不能用Querystring传值 Asp.net地址转义(分析)加强版 Web的桌面提醒(Popup) Using the Popup ...

    ASP.NET4高级程序设计(第4版) 3/3

    13.3.1 生成数据模型 442 13.3.2 数据模型类 442 13.3.3 实体关系 444 13.3.4 查询存储过程 446 13.3.5 LINQ to Entities查询揭秘 447 13.4 数据库操作 452 13.4.1 插入 452 13.4.2 更新 454 13.4.3...

Global site tag (gtag.js) - Google Analytics