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

标签: js 数据 页面 | 发表时间:2015-11-08 23: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将页面定位到某个位置(DIV)

- - JavaScript - Web前端 - ITeye博客
昨天一个朋友问我如何在页面加载完成后,自动将页面定位到某个位置,当时有些忙,就没来得及解决. 殊不知今天在做PHP教程的项目中也有了同样的需求:为了页面美观,需要只显示用户从楼盘相册点击后进入的相册幻灯页面的楼盘信息(也就是自动定位到了楼盘的相关信息,忽略了顶部banner). 使用Javascript自动将页面滚动到指定位置.

js 和 jquery 获取页面和滚动条的高度

- - Web前端 - ITeye博客
js 和 jquery 获取页面和滚动条的高度 //页面位置及窗口大小 function GetPageSize() { var scrW, scrH; if(window.innerHeight && window.scrollMaxY) {. return {PageW:pageW, PageH:pageH, WinW:winW, WinH:winH}; }; //滚动条位置 function GetPageScroll() { var x, y; if(window.pageYOffset) {.

数据结构中的各种排序方法-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)的机制限定了数据包的寿命.

页面构建和js前端不得不说的那点事儿

- - 微博UDC
作为微博的页面构建工程师,主要职责就是利用html&css,高质量的完成静态页面的制作,保证项目的按时完成. 而页面需要的js效果则交给下游的js前端工程师去做. 但在大家的思维定势里可能觉得这两个岗位应由一个人来完成最好,毕竟,页面构建工程师写的html结构不一定是js工程师想要的那种,js工程师可能有更高效的方式.

javascript 获取滚动条高度+常用js页面宽度与高度

- - Web前端 - ITeye博客
javascript 获取滚动条高度+常用js页面宽度与高度 / ******************** * 取窗口滚动条高度 ****************** / function getScrollTop() {. return scrollTop; } / ******************** * 取窗口可视范围的高度 ******************* / function getClientHeight() {.

js记录页面的点击位置并在页面刷新后滚动到该位置

- - JavaScript - Web前端 - ITeye博客
页面上的结果集列表有多条记录,选中某一行进行操作时,页面可能已经滚动过一段距离,当点击提交时希望能记录滚动过的长度,并在页面提交刷新后自动滚动到该位置. 使用jquery来操作dom,方便易用. 1、获取当前滚动过的距离;. 以struts2+velocity为例. 前台在点击某条记录修改时获取当前滚动的距离x、y,将x、y传给后台,后台处理完成后继续跳转页面(在本需求中即为当前页面),将x、y作为参数传给目的页面.

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

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