热点技术:使用CasperJS构建Web爬虫

简介:

从你的应用中收集数据有时候可能有点困难和艰辛。可能是缺少一个必须的API,或者是有太多的数据需要处理。这时候你就需要借助于web抓取。

不用说了,这可能是个法律雷区,所以要确保你没有逾越法律的边界。

目前有很多工具可以帮助你抓取内容,例如Import.io,但是有时这些工具并不能完全满足你的需要。又或者,像我一样,充满好奇心,希望深入地了解web抓取。

挑战

让我们从一个简单地挑战——网络爬虫开始,让这个爬虫爬取Techmeme,并获得一个当天热门新闻列表!

注意: 在这里我将会使用DZone,但在获取页面时会出现问题。后面会详细说明这个问题。

机器设置

您只需要做很少的工作来完成安装。我假设您已经安装了Node.js(我的意思是谁没有安装呢!)。尽管我们并不直接使用PhantomJS,但是您依然需要安装它。版本2.0.1目前已经可以使用了——您可以从其官网下载或使用homebrew或其他等效的包管理器安装。

如果您使用具有homebrew的Mac,您可以这样安装PhantomJS

brew install phantomjs

下载完成之后,您将需要用相同的方式安装CasperJS。您可以将CasperJS看做PhantomJS的伴侣。它实际上是给您提供相似的网页处理API。尽管它是为网页测试设计的。与PhantomJS相同,它具有丰富的功能使其也非常适合于抓取内容。

CasperJS允许我们编写JavaScript脚本。您可以通过在终端中输入casperjs以测试其是否正确安装并加入到PATH中。

编写脚本

下面我们将编写一个新的JavaScript脚本文件。在我的例子中,我称其为index.js。您需要做的第一件事就是在您的代码中创建一个casper实例。您还需要加入依赖的模块并向其传递一些基本参数。

 
  1. var casper = require("casper").create({ 
  2. waitTimeout: 10000
  3. stepTimeout: 10000
  4. verbose: true
  5. pageSettings: { 
  6. webSecurityEnabled: false 
  7. }, 
  8.     onWaitTimeout: function() { 
  9.           this.echo('** Wait-TimeOut **'); 
  10.     }, 
  11.     onStepTimeout: function() { 
  12.         this.echo('** Step-TimeOut **'); 
  13.     } 
  14. }); 

当您等待一个元素可见时,上面的onWaitTimeout回调将会被调用。例如,点击一个按钮之后,waitTimeout将被超出。

现在,您可以启动casper实例并将其指向我们希望爬取的页面。

 
  1. casper.start(); 
  2. casper.open("http://techmeme.com"); 

Casper使用一个可靠地框架来帮助您一步一步地运行所有任务。对于第一步,您将希望使用then函数。

 
  1. casper.then(function() { 
  2.   //logic here 
  3. }); 
  4. //start your script 
  5. casper.run(); 

为了使Casper打开网页并按您的想法运行,您需要调用run函数。

检查网页以获取想要的元素

当抓取到一个网页,您可以假设它具有特定的结构。在您编写脚本之前,可能已经浏览过了网页的源代码,或者已经使用开发者工具观察了页面对特定行为的变化。

所以,让我们开始于一个简单地逻辑,使用CasperJS维护系统确保一个特定的元素在继续之前处于合适的位置。如果元素不存在,脚本将会停止,但 是至少您将会知道其为何停止。这个维护行为对于观察您之前抓取页面的变化是无价的,但是可能会与您之前见到的页面具有不一样的结构。

如果您检查了Techmeme首页的元素,您将会注意到头条新闻部分在一个id为,topcol1的div中。

让我们使用维护功能确保这个元素存在:

 
  1. casper.then(function() { 
  2. this.test.assertExists("#topcol1"); 

如果这个元素不存在,测试(例如我们的脚本)将会停止,否则它将继续运行。

您还可以使用waitForSelector函数来获得更为细致的结果:

 
  1. this.waitForSelector("#topcol1"
  2.     function pass () { 
  3.        console.log("Continue"); 
  4.     }, 
  5.     function fail () { 
  6.         this.die("Did not load element... something is wrong"); 
  7.     } 
  8. ); 

使用这个函数的优点就是它允许页面加载元素并一直等待到执行。您在初始配置中指定的waitTimeout将会被用于确定失败前等待多久。

注意:有时,使用CasperJS查找元素可能会出问题。使用capture()函数截取一个CasperJS看到的页面的截图。

this.capture(‘screener.png’);

从页面中提取内容

下面,让我们看看怎样从页面中找出标题。首先,找到包含您需要的内容的元素,在我们的例子中,为class=ii的div。

CasperJS自带一个evaluate函数,可以让您在页面中运行JavaScript,并且您还可以让函数返回一个值以供进一步处理。

这个JavaScript写起来并没有什么不同,您可能注意到,在本例中,我使用的是原始的纯DOM方法,而不是jQuery,同样,如果您愿意,您也可以在evaluate函数中使用jQuery;

 
  1. var links = this.evaluate(function(){ 
  2. var results = [];  
  3. var elts = document.getElementsByClassName("ii"); 
  4. for(var i = 0; i < elts.length; i++){ 
  5. var link = elts[i].getElementsByTagName("a")[0].getAttribute("href"); 
  6. var headline = elts[i].firstChild.textContent; 
  7. results.push({link: link, headline: headline}); 
  8. return results;  
  9. }); 

如果您在evaluate函数中使用console.log语句,它们将会通过remote.message句柄打印到您的控制台,这将会在下一节中详细介绍。

一旦运行结束,结果将会返回给您。您可以将它们写入文件系统,或者将它们打印到屏幕上:

 
  1. console.log("There were "  + links.length + " stories"); 
  2. for(var i = 0; i < links.length; i++){ 
  3. console.log(links[i].headline); 

输出的结果如:

抓取中的错误处理

有时,您运行的JavaScript中可能存在错误,或者其对您抓取的页面的处理存在问题。这些情况中,您可以捕获错误并使用remote.message和page.error事件将其打印到控制台:

 
  1. casper.on('remote.message', function(msg) { 
  2. this.echo('remote message caught: ' + msg); 
  3. }); 
  4.  
  5. casper.on('page.error', function(msg, trace) { 
  6. this.echo('Error: ' + msg, 'ERROR'); 
  7. }); 
  8.  
  9. 您同样还能观察到即将请求的资源,这些资源的加载使用的是resource.error和resource.received事件: 
  10.  
  11. casper.on('resource.error', function(msg) { 
  12. this.echo('resource error: ' + msg); 
  13. }); 
  14.  
  15. casper.on('resource.received', function(resource) { 
  16.     console.log(resource.url); 
  17. }); 

了解更多

本文只写了点关于使用CasperJS你所能做到的皮毛的东西。该项目的文档是完美的,所以要确保查看过 API ,看看你还可以用它来做些什么。

在本系列的下一篇文章中,我回来看看如何从网页上下载图片,而且我也会讨论下如何使用构建到CasperJS中的文件系统函数,其使用会受到比Node.js更多的限制。


来源:51CTO

相关文章
|
15天前
|
编解码 前端开发 JavaScript
构建高效响应式Web界面:现代前端框架的比较
【4月更文挑战第9天】在移动设备和多样屏幕尺寸盛行的时代,构建能够适应不同视口的响应式Web界面变得至关重要。本文深入探讨了几种流行的前端框架——Bootstrap、Foundation和Tailwind CSS,分析它们在创建响应式设计中的优势与局限。通过对比这些框架的栅格系统、组件库和定制化能力,开发者可以更好地理解如何选择合适的工具来优化前端开发流程,并最终实现高性能、跨平台兼容的用户界面。
|
16天前
|
前端开发 JavaScript 关系型数据库
从前端到后端:构建现代化Web应用的技术探索
在当今互联网时代,Web应用的开发已成为了各行各业不可或缺的一部分。从前端到后端,这篇文章将带你深入探索如何构建现代化的Web应用。我们将介绍多种技术,包括前端开发、后端开发以及各种编程语言(如Java、Python、C、PHP、Go)和数据库,帮助你了解如何利用这些技术构建出高效、安全和可扩展的Web应用。
|
10天前
|
数据采集 API 数据安全/隐私保护
畅游网络:构建C++网络爬虫的指南
本文介绍如何使用C++和cpprestsdk库构建高效网络爬虫,以抓取知乎热点信息。通过亿牛云爬虫代理服务解决IP限制问题,利用多线程提升数据采集速度。示例代码展示如何配置代理、发送HTTP请求及处理响应,实现多线程抓取。注意替换有效代理服务器参数,并处理异常。
畅游网络:构建C++网络爬虫的指南
|
10天前
|
数据库 开发者 Python
Python中使用Flask构建简单Web应用的例子
【4月更文挑战第15天】Flask是一个轻量级的Python Web框架,它允许开发者快速搭建Web应用,同时保持代码的简洁和清晰。下面,我们将通过一个简单的例子来展示如何在Python中使用Flask创建一个基本的Web应用。
|
14天前
|
JavaScript 前端开发 API
Vue.js:构建高效且灵活的Web应用的利器
Vue.js:构建高效且灵活的Web应用的利器
|
14天前
|
数据采集 C# 数据安全/隐私保护
掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容
本文介绍了如何使用C#的HttpClient与爬虫代理IP技术抓取今日头条内容,以实现高效的数据采集。通过结合亿牛云爬虫代理,可以绕过IP限制,增强匿名性。文中提供了一个代码示例,展示如何设置代理服务器信息、请求头,并用正则表达式提取热点新闻标题。利用多线程技术,能提升爬虫采集效率,为市场分析等应用提供支持。
掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容
|
21天前
|
编解码 前端开发 开发者
构建响应式Web界面:Flexbox与Grid布局的深度对比
【4月更文挑战第4天】 在现代前端开发中,构建灵活且响应式的用户界面是至关重要的。随着移动设备浏览量的增加,能够适应不同屏幕尺寸和分辨率的布局技术变得必不可少。Flexbox和Grid是CSS提供的两种强大的布局机制,它们各自以独特的方式解决了响应式设计的挑战。本文将深入探讨Flexbox和Grid的核心概念、使用场景和性能考量,为开发者提供在面对不同布局需求时做出明智选择的依据。
|
1月前
|
编解码 前端开发 开发者
构建响应式Web界面:Flexbox的力量
【2月更文挑战第28天】 在现代网页设计中,创建能在不同设备上保持一致性和功能性的响应式界面是至关重要的。Flexbox,一个CSS布局模块,为前端开发者提供了强大工具来轻松实现灵活的布局设计。本文将深入探讨Flexbox的核心概念、使用场景以及如何通过它来优化响应式设计流程。
|
1月前
|
前端开发 开发者 UED
构建响应式Web界面:Flexbox与Grid布局的深度解析
【2月更文挑战第28天】 在现代前端开发中,打造灵活且适应不同屏幕尺寸的用户界面是至关重要的。随着移动设备的普及,响应式设计已经成为网页制作不可或缺的一部分。本文将深入探讨两种强大的CSS布局模块——Flexbox和Grid,它们如何简化布局创建过程,并赋予设计师更大的灵活性去构建动态和流畅的响应式界面。通过对这两种技术的比较、使用场景分析以及代码示例,读者将能够更好地理解何时以及如何使用这些工具来提升前端项目的质量和效率。
16 0
|
13天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。