当我们在进行数据抓取的时候,如果目标网站是以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条新闻,代码运行结果。
相关推荐
javascript读取json数组生成滚动分页 javascript读取json数组生成滚动分页 javascript读取json数组生成滚动分页
实例014 页面自动滚动 26 实例015 打开窗口特殊效果 27 实例016 动态显示窗口 29 实例017 慢慢放大的窗口 30 实例018 下降式浏览器 32 实例019 旋转的窗口 33 实例020 移动的窗口 34 实例021 震动的窗口 35 实例022 ...
1.18 以频道模式打开页面 1.19 自动识别网页类型 1.20 在网页中动态添加Script脚本 1.21 用JavaScript随机修改页面的标题 1.22 判断网页加载完毕 1.23 嵌入网页的播放器 1.24 设置指定网页为主页 1.25 使用...
1.18 以频道模式打开页面 1.19 自动识别网页类型 1.20 在网页中动态添加Script脚本 1.21 用JavaScript随机修改页面的标题 1.22 判断网页加载完毕 1.23 嵌入网页的播放器 1.24 设置指定网页为主页 1.25 使用...
11、手机站全部数据自动提取对接标题、关键词、描述和内容,新增分页新闻和产品生成HTML页面。 12、后台设置关键词排序修正,按照数字从小到大排序,数据库排序字段按照数字调整。 13、添加关键词字段,重复过滤...
如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误。 npm test 在交互式监视模式下启动测试运行器。 有关更多信息,请参见关于的部分。 npm run build 构建生产到应用程序build文件夹。 它在...
实例293 动态生成CSS设置下拉式菜单实现 页面跳转 465 实例294 利用CSS样式设置解释型菜单 467 实例295 利用主题中CSS级联样式动态更换 网站皮肤 468 12.2 应用JavaScript脚本实现Web窗口 控制 470 实例296 利用...
动态请求数据来更新页面是现在非常常用的方法,比如博客评论的分页动态加载,微博的滚动加载和定时请求加载等。 这些情况下,动态请求返回的数据一般不是已拼好的 HTML 就是 JSON 或 XML,总之不在浏览器端拼数据就...
带有模板插件的jQuery Infinite JQuery插件,用于带有模板的启用Ajax的无限页面滚动。 如果您到目前为止喜欢jQuery,那么这个小库将有所帮助。演示版为了方便的http-server需要: git clone ...
X164476_nirvana_iframePack 一组关于iframe的插件,可以动态的改变iframe中的页面 MX152319_save_all 在Drw的File菜单下加一个Save All命令,用来保存所有Dreamweaver窗口的文件 Layerfx 可以让层做绕定轴转动、...
13,新增独立生成各频道栏目首页功能,后台自由生成,静动态模式自由切换; 114,首页及其它页面再次做细节美化调整; 5,页面增加拖动到一定位置是自动显示返回顶部按钮,并附带加入收藏及留言求片按钮,增强用户...
实例038 动态输出JavaScript代码 69 实例039 当数字遇到了字符串 70 实例040 PHP程序员的基础——变量的应用 72 实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变变量输出“I Like PHP!” 73 实例...
实例038 动态输出JavaScript代码 69 实例039 当数字遇到了字符串 70 实例040 PHP程序员的基础——变量的应用 72 实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变变量输出“I Like PHP!” 73 实例...
实例033 根据数据表结构自动生成数据录入页面 45 实例034 投票系统中单选按钮与复选框的应用 47 2.3 下拉列表的应用 50 实例035 在下拉菜单中显示数据表某列的字段值 50 实例036 在下拉菜单中显示数组中的...
手动优化了PDF的书签,书签可折叠,书签链接以目录方式保存,多达1000多页,每页都做了书签定位,手都累酸啦。 ============================== 因权限只能到60MB,分卷压缩了,共3个压缩包,需下载完3个一起解压, ...
一 实用且必用的小脚本代码二 鼠标旁边的提示信息,类似与163登录后的页面提示效果三 如果文字过长,则将过长的部分变成省略号显示四 滚动的图片五 接收键盘指令的脚本六 让你的文本链接渐隐渐显七 类似与QQ的好友/黑...
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 ...
如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且不能用Querystring传值 Asp.net地址转义(分析)加强版 Web的桌面提醒(Popup) Using the Popup ...
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...