使用jQuery和YQL进行网页抓取

网页抓取在网络开发中通常被视为一种负面行为,但在某些情况下,它却非常重要。本文将提供一个使用jQuery和YQL进行网页抓取的基本概述。为了展示数据,还使用了Mustache作为HTML模板,因此,也会在这里提供Mustache.js的简短概述。

如果熟悉HTML,那么将很容易理解本文。简单的JavaScript和AJAX基础知识就足够了。不用担心,添加了一些有用的链接以帮助理解。

YQL概述

YQL是一种类似于SQL的语法,可以用于处理不同的API。YQL因其快速响应而受欢迎。可以在这里找到详细的概述。为了从页面上获取HTML,YQL有称为‘Tables’的不同方法。下面将给出一些示例:

  • html
  • Data.html.cssselect
  • Htmlstring

在简单项目中,将使用HTML表格。

使用YQL控制台查询

现在,让熟悉YQL控制台。在以下示例中,将从gsmarena.com抓取数据。将使用手机制造商的名称在gsmarena上进行搜索并抓取结果。所以,让去gsmarena.com并查看即将获取的数据,如下所示:

使用任何手机制造商的名称进行搜索,例如‘nokia’。得到了搜索结果页面。复制页面的URL(http://www.gsmarena.com/results.php3?sQuickSearch=yes&sName=nokia)。

现在,让去YQL控制台并运行查询以获取提到的URL的结果。(需要登录Yahoo!)

进入YQL控制台。在文本框中编写查询“select * from html where url="http://www.gsmarena.com/results.php3?sQuickSearch=yes&sName=nokia"”。要获取JSON格式的数据,请选择JSON并按下‘TEST’按钮。

就这样,结果在结果框中。如果不理解结果,不用担心,它已经以JSON格式抓取了整个页面(http://www.gsmarena.com/results.php3?sQuickSearch=yes&sName=nokia)。

但不需要整个页面,只需要搜索生成的结果。为此,需要结果div的XPATH。要获取XPATH,请右键单击页面(http://www.gsmarena.com/results.php3?sQuickSearch=yes&sName=nokia)并复制XPATH,如下图所示。

现在去YQL控制台并再次运行带有XPATH的查询。现在结果只包含搜索结果的div。要了解更多关于XPATH的信息,可以按照这个w3schools教程。

最后,要使用ajax访问YQL API,需要‘REST QUERY’。简单地复制‘REST QUERY’。

如果仔细看看‘REST QUERY’,将找到三个部分:

  • 访问YQL API的URL(http://query.yahooapis.com/v1/public/yql?)
  • 完整查询。这里它是编码的,因为URI不应包含任何空格。
  • 数据格式和其他组件(&format=json&diagnostics=true&callback=)

需求

Jquery:在这个项目中,Jquery用于两个目的...运行ajax请求以从YQL获取数据。要使用JqueyCycle显示数据。为此,请添加此脚本:

<script src="http://www.codeproject.com/cdnjs.cloudflare.com/ajax/libs/jquery.cycle/2.9999.8/jquery.cycle.all.min.js" type="text/javascript"></script>

对于这两个目的,使用了jquery-v1.9.1。可以从jQuery下载任何最新版本。

Json2.js:非常重要的一点是,从YQL使用ajax以JSON格式获取数据。Json2.js对于处理此JSON数据非常有帮助。从这里下载Json2.js并包含在项目中。要了解更多关于JSON的信息,可以在这里查看jsonpath-0.8.0.js:当想要从接收到的JSON数据中获取特定结果时,重要的是要查询div、表格等。jsonpath为此目的而存在。从这里获取任何最新版本的jsonpath并包含在项目中。

mustache.js:这个项目运行的最后一个要求是mustache.js。Mustache是一个“无逻辑”的模板语法。它对于将HTML标记与数据分离非常有用。Mustache在不同的语言中实现:Ruby、JavaScript、Python、PHP、Perl、Objective-C、Java、.NET、Android、C++、Go、Lua、Scala等。Mustache.js是JavaScript实现。从这里获取mustache.js,这个教程对mustache很有帮助。

使用代码

现在环境已经准备好了。如果遇到任何麻烦,请按照以下方式重新排列:

<script src="scripts/jquery-1.9.1.min.js" type="text/javascript"></script> <!-- jquery cycle库滑动结果 --> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery.cycle/2.9999.8/jquery.cycle.all.min.js" type="text/javascript"></script> <!-- mustache.js模板用于javascript --> <script src="scripts/mustache.js" type="text/javascript"></script> <!-- json2.js用于处理json数据 --> <script src="scripts/json2.js" type="text/javascript"></script> <!-- jsonpath有助于查询json数据 --> <script src="scripts/jsonpath-0.8.0.js" type="text/javascript"></script>

因此,任务很简单。将采取制造商的名称作为用户输入,使用YQL API从www.gsmarena.com抓取结果,并执行AJAX请求以接收结果。

所以,让开始吧...为了获取输入,需要一个文本框。按钮点击事件将触发一个名为GetResult()的JavaScript函数。同时,一个div用于保存整个结果。因此,HTML标记如下:

<body> <input id="valueText" type="text"/> <button type="button" onclick="GetResult()">获取结果</button> <div id="speakerbox" style="float:left"> <a href="#" id="prev_btn">«</a> <a href="#" id="next_btn">»</a> <div id="carousel"> </div> </div> </body>

JavaScript的GetResult()函数使用AJAX获取抓取的数据。从文本框获取用户输入。

var item = $('#valueText').val(); // 构建查询,首先检查查询,用户输入附加如下所示 var query = "SELECT * FROM html WHERE url=" + "'" + "http://www.gsmarena.com/results.php3?sQuickSearch=yes&sName=" + item + "'" + "and xpath='/html/body/div/div[2]/div[2]/div/div[2]/div[2]'"; // 现在,将忽略cacheBuster以简化。AJAX URL的其余查询是: var url = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent(query) + '&format=json&_nocache=' + cacheBuster; // 现在,可以使用AJAX访问YQL API。所以,运行AJAX请求并获取抓取的数据。 window['wxCallback'] = function(data) { console.log(data); ParseData(data); // 显示结果 }; $.ajax({ url: url, dataType: 'jsonp', cache: true, jsonpCallback: 'wxCallback' });

当AJAX请求成功执行时,需要调用ParseData(data)函数,并将数据作为其参数。这个函数简单地解析数据,并使用mustache模板在carousel中显示它。

function ParseData(data) { var result = jsonPath(data, "$.query.results[*].ul.li[*]"); $('#carousel').empty(); var html = ""; for (i = 0; i < result.length; i++) { var template = $('#speakerstpl').html(); html += Mustache.to_html(template, result[i]); } $('#carousel').append(html); $('#carousel').cycle({ fx: 'fade', pause: 1, next: '#next_btn', prev: '#prev_btn', speed: 500, timeout: 10000 }); }

在这里,jsonPath使用提供的查询找到了包含数据的特定‘li’。

现在,运行应用程序并查看carousel中的抓取结果。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485