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

标签: js 数据 网页 | 发表时间:2015-11-08 15:21 | 作者:jsczxy2
出处:http://www.iteye.com

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

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

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

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

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

Xml代码   收藏代码
  1. <dependency>  
  2.     <groupId>org.seleniumhq.selenium</groupId>  
  3.     <artifactId>selenium-java</artifactId>  
  4.     <version>2.47.1</version>  
  5. </dependency>  

  

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

Java代码   收藏代码
  1. import org.openqa.selenium.By;  
  2. import org.openqa.selenium.WebDriver;  
  3. import org.openqa.selenium.WebElement;  
  4. import org.openqa.selenium.firefox.FirefoxDriver;  
  5.   
  6. import java.util.List;  
  7. import java.util.Random;  
  8.   
  9. /** 
  10.  * 如何抓取Js动态生成数据且以滚动页面方式分页的网页 
  11.  * 以抓取今日头条为例说明:http://toutiao.com/ 
  12.  * Created by ysc on 10/13/15. 
  13.  */  
  14. public class Toutiao {  
  15.     public static void main(String[] args) throws Exception{  
  16.   
  17.         //等待数据加载的时间  
  18.         //为了防止服务器封锁,这里的时间要模拟人的行为,随机且不能太短  
  19.         long waitLoadBaseTime = 3000;  
  20.         int waitLoadRandomTime = 3000;  
  21.         Random random = new Random(System.currentTimeMillis());  
  22.   
  23.         //火狐浏览器  
  24.         WebDriver driver = new FirefoxDriver();  
  25.         //要抓取的网页  
  26.         driver.get("http://toutiao.com/");  
  27.   
  28.         //等待页面动态加载完毕  
  29.         Thread.sleep(waitLoadBaseTime+random.nextInt(waitLoadRandomTime));  
  30.   
  31.         //要加载多少页数据  
  32.         int pages=5;  
  33.         for(int i=0; i<pages; i++) {  
  34.             //滚动加载下一页  
  35.             driver.findElement(By.className("loadmore")).click();  
  36.             //等待页面动态加载完毕  
  37.             Thread.sleep(waitLoadBaseTime+random.nextInt(waitLoadRandomTime));  
  38.         }  
  39.   
  40.         //输出内容  
  41.         //找到标题元素  
  42.         List<WebElement> elements = driver.findElements(By.className("title"));  
  43.         int j=1;  
  44.         for(int i=0;i<elements.size();i++) {  
  45.             try {  
  46.                 WebElement element = elements.get(i).findElement(By.tagName("a"));  
  47.                 //输出标题  
  48.                 System.out.println((j++) + "、" + element.getText() + " " + element.getAttribute("href"));  
  49.             }catch (Exception e){  
  50.                 System.out.println("ignore "+elements.get(i).getText()+" because "+e.getMessage());  
  51.             }  
  52.         }  
  53.   
  54.         //关闭浏览器  
  55.         driver.close();  
  56.     }  
  57. }  

 

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

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

 本文转自:http://my.oschina.net/apdplat/blog/516848



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [js 数据 网页] 推荐:

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

- - 开源软件 - ITeye博客
当我们在进行数据抓取的时候,如果目标网站是以Js的方式动态生成数据且以滚动页面的方式进行分页,那么我们该如何抓取呢. 如类似今日头条这样的网站: http://toutiao.com/. 我们可以使用 Selenium来搞定这件事情. Selenium的设计目的虽然是用于Web应用程序的自动化测试,但是却非常适合用来做数据抓取,可以非常简单地绕过网站的反爬虫限制,因为Selenium直接运行在浏览器中,就像真正的用户在操作一样.

使用JS实现网页动态换肤

- 天朝小民 - 博客园-首页原创精华区
现在很多网站都有换肤功能,通过切换风格可以让同一个网站带给用户不一样的体验,那么如何动态切换风格呢. 我们现在的网站都是结构,表现,行为分离,所以我们可以通过切换CSS样式来更改页面风格. 如果你的网站使用了jQuery,那么我们可以定义一个jQuery扩展方法,用来动态切换CSS样式. //根据ID查找样式,如果存在则删除这个样式.

数据结构中的各种排序方法-JS实现

- zhai - 博客园-首页原创精华区
     新技术一直在不断变化,掌握一些基础是未来学习不断更新的技术的坚实基础. 近来闲来无事,为了温习一下从前学的数据结构,将数据结构中的排序算法用JS实现了一遍,并在本文末尾处嵌入了DEMO.      冒泡排序是最简单排序算法,时间复杂度为n的平方,代码如下:. document.write("这是第 + (i + 1) + "次循环·,结果为:");.

[JS]36个卓越的可视化数据工具(图表库)

- - 设计达人
如果将数据直接以文字形式展示,这样用户阅读起来是非常困难的,所以如果我们使用可视化形式来展示数据,这就会更清晰易懂. 这里由smashingapps整理了36个卓越的可视化数据工具,有地图图表、有柱状图表、饼状、散点等等,是一个不错的list收集. 下面来看看这些可视化数据图表工具,或许会对你的项目带来帮助.

攻击者如何劫持JS数据包

- - Solidot
在GitHub遭受的大规模DDoS攻击中,攻击者创造性的劫持了百度的JS数据包,让大约1%访问嵌入百度JS的海外中国网站访问者成为DDoS大军中的一员. 攻击者是如何做到的,如何确定这与百度无关. 网络中传输的数据包是有寿命的,为了防止数据无限循环,名为存活时间(Time to live,TTL)或跳数限制(hop limit)的机制限定了数据包的寿命.

WebView之js调用Android类的方法传递数据 - 依凡王子

- - 博客园_首页
  在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只有登陆按钮有用),输入用户名密码之后调用android中的类,并把输入的数据传过去,再在android中输出出来(具体你那数据做什么操作就看你的需求了),这样就做大额js与android数据交互的效果了:.

数据可视化平台 Plotly 开源强大的 JS 图表库

- - 开源中国社区最新新闻
数据可视化平台 Plotly 开源旗下强大的 JavaScript 图表库,支持三种不同类型的图表,包括地图,箱形图和密度图,以及更常见的产品如,条状和线形图. 源代码已发布在 GitHub. (已收录开源中国软件库 plotly.js)最新版本的 Plotly.js 可以免费、无限制地用于任何项目.

简单***的实现,利用js解析把web网页转换成自己的网页,加快开发

- - ITeye博客
利用开源js引擎rhino+jsoup进行web裁制,使用javascript来解析页面. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

WebView JS 交互

- - ITeye博客
WebView加jquery做页面会怎么样呢. // 创建WebView对象. // 把programList添加到js的全局对象window中,. // 这样就可以使用window.programList来获取数据. * 定义js回调java函数. // 绑定键盘的向上,向下按钮事件触发相应的js事件.

JS获取Ip和浏览器信息,用户逗留时间写进数据库

- - ITeye博客
已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.