`
jsczxy2
  • 浏览: 1275599 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

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

阅读更多

当我们在进行数据抓取的时候,如果目标网站是以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

分享到:
评论

相关推荐

    多种javascript实现的分页样式

    对于使用JavaScript生成内容的分页,需要注意SEO优化,确保搜索引擎能够正确抓取和索引内容。可以使用服务器端渲染(SSR)或预渲染(Prerendering)技术,提前生成静态HTML供搜索引擎抓取。 7. A11Y无障碍访问: ...

    数据挖掘与数据管理-逆向分析请求页面.pptx

    动态加载数据是指网页的部分内容不是一次性加载完成,而是通过JavaScript等技术在用户滚动页面或者触发某些事件时动态生成和更新。这种技术在提高用户体验、减少服务器压力方面具有显著优势,但也给网络爬虫带来挑战...

    ajax分页需要的资料.zip

    在网页设计中,分页是一种常见的优化用户浏览体验的方式,尤其在处理大量数据时,它能避免一次性加载所有内容导致的页面卡顿。Ajax(Asynchronous JavaScript and XML)技术是实现这种分页的关键,它允许我们在后台...

    分页页码aaa

    前端分页功能通常通过 JavaScript 或 jQuery 动态生成和管理。这些脚本可以监听用户的点击事件,根据当前页码和每页显示数量计算出数据的起始和结束索引,然后向服务器发送 AJAX 请求获取对应数据并更新页面。 5. ...

    动态网页爬虫之小米应用商店

    传统的网页爬虫主要抓取HTML静态页面,而动态网页则需要解析JavaScript生成的内容。PhantomJS通过提供一个API接口,让开发者能够在后台运行完整的Webkit浏览器,从而能够加载和执行页面上的JavaScript代码,最终得到...

    纵向的JS相册效果 .

    在网页设计中,JavaScript(JS)常常被用来创建交互式和动态的效果,其中包括各种类型的相册展示。"纵向的JS相册效果"是一种常见的网页设计技术,它模仿了如百度等大型网站的相册浏览体验,使用户可以垂直滚动查看...

    pagination_zh.zip

    2. 客户端分页:在前端,可以使用JavaScript和AJAX技术动态加载页面,用户滚动到页面底部时,自动请求下一页数据,这种称为无限滚动或懒加载。 3. 分页参数传递:在请求分页数据时,需要将当前页数和每页显示的记录...

    js jquery 商城分类目录

    在商城分类目录中,JavaScript用于处理用户事件(如点击、滚动),动态更新页面内容,以及实现各种动画效果,提高用户体验。 2. **jQuery库**:jQuery是JavaScript的一个轻量级库,简化了DOM操作、事件处理和动画。...

    ajax_page.zip_ajax刷新_page

    在传统的分页中,每次点击下一页按钮,整个页面都会重新加载,包括已经加载过的数据,这不仅消耗了用户的流量,还可能导致页面滚动位置丢失。通过Ajax实现的无刷新分页则只加载新数据,保持当前页面状态,提高加载...

    AjAX异步页面处理技术

    **Ajax(Asynchronous JavaScript and XML)异步JavaScript与XML技术是Web开发领域中的一项核心技术,它使得网页可以实现部分刷新,无需重新加载整个页面就能获取并更新数据。这种技术极大地提升了用户体验,尤其在...

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

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

    仿京东分类多级数据实现

    可以采用懒加载或分页加载策略,只在用户滚动到相应区域或需要时才加载更多的分类。 7. 用户交互:为了提高用户体验,可能需要实现点击展开/折叠子分类、搜索分类等功能。这需要前端对事件监听和处理进行编程。 8....

    ajax 相关chm

    JavaScript会创建一个XMLHttpRequest对象,然后通过这个对象向服务器发送请求,服务器处理请求后返回数据,JavaScript接收到数据并更新DOM(Document Object Model)以改变网页内容。 二、Ajax工作流程 1. 创建...

    Ajax学习资料相当不错的

    - **动态内容加载**:如分页加载、无限滚动等,提高内容展示效果。 - **在线编辑器**:实时保存编辑内容,提高用户体验。 #### 四、Ajax的局限性与挑战 ##### 4.1 局限性 - **搜索引擎优化困难**:搜索引擎难以...

    php_hrmbeta2

    5. **前端分页优化**:除了后端处理,前端也有分页方案,如无限滚动,这使用JavaScript监听滚动事件,当用户接近页面底部时加载更多内容。这种技术可以提高用户体验,但需确保与PHP后端良好协作。 6. **SEO友好**:...

    Ajax参考手册 很好的教材

    ASP(Active Server Pages)是微软开发的一种服务器端脚本环境,用于生成动态网页。尽管该文件名提到ASP,但与Ajax直接关联不大,可能是为了提供ASP与Ajax结合使用的示例或教程,帮助开发者理解如何在ASP服务器端...

    AJAX DEMO代码

    5. **更新页面**:JavaScript解析响应数据,并利用DOM动态更新页面内容,无需刷新整个页面。 ### 关键知识点二:AJAX的核心技术——XMLHttpRequest #### 创建XMLHttpRequest对象 在JavaScript中创建一个...

    网站爬虫 pyppeteer

    总之,Pyppeteer 作为一个强大的网页自动化工具,为 Python 开发者提供了丰富的功能,可以用于构建高效且灵活的网站爬虫,应对各种复杂的网页抓取需求。通过熟练掌握 Pyppeteer,你可以在数据分析、内容抓取等领域...

    AJAX开发教程及例子

    - **SEO难题**:由于部分内容由JavaScript动态生成,搜索引擎可能无法抓取到。 - **用户界面问题**:如果请求耗时较长,用户可能会感到界面卡顿。 **五、学习资源与实践** 本教程提供的"AJAX开发简略(含续一).pdf...

    WebScraping:使用Python,Selenium和BeautifulSoup进行Web抓取

    1. 实时交互:Selenium可以启动真实的浏览器,与网页进行实时交互,从而获取JavaScript生成的数据。 2. 自动化脚本:编写脚本控制浏览器,执行各种操作,如点击、滚动、输入等。 3. 多浏览器支持:Selenium支持多种...

Global site tag (gtag.js) - Google Analytics