# Tips - WebParser Primer - Rainmeter官方文档 - 雨滴社区 - Powered by Discuz!
 找回密码
 点击注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5540|回复: 0

Tips - WebParser Primer

[复制链接]

签到天数: 265 天

[LV.8]以坛为家I

发表于 2012-5-27 15:04:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?点击注册

x


【版权声明】
   本文档翻译者:雨滴社区-相望无言
   本文档仅用于雨滴社区站内交流,禁止转载,由此引发的一切责任及版权纠纷由转载、传播本文档者负责。

WebParser Primer

这个小教程为了抛砖引玉,在rainmeter中使用webparser.dll,得到网站的信息。我们很多人使用webparser获得RSS feeds或者其他数据,但是经常使用/调整其他人的代码,不用彻底了解代码是如何工作的,或者怎么创建那些从网页中得到提取信息核心的“RegExp=”声明。

这即不是详细的,也不是去得到XML文件格式,或者他们怎么使用RSS 摘要。一旦你知道如何解析一个网站。寻找XML/RSS 标签会更加容易。

准备工作

首先下载我们这个教程中需要的zip文件,ini文件,还有其他text文件。还有一些你想要的图片。解压到你的皮肤文件夹。它会创建一个叫做“skins\iplookup”文件夹,你需要的东西都在里面。

如果你要加载这个皮肤和下面这些步骤,务必刷新rainmeter

6.png  Download HERE

你也要点这里Manual - WebParser,这里是完整的 webparser教程 也是我们下面这些的依据。

RegExp(正则表达式)

现在让我占用几分钟来讲一下代码的关键部分,这个“RegExp=”声明,webParser使用“Regular Expression”搜索你想要的信息,并且返回这个信息用2个立体“阵列”。第一维是“Index”数字,(阵列里面的数字,从1开始,到你要搜索的位置),第二个在RegExp基础上检索到的实际结果。

那么,我们怎么在rainmeter中建立一个神奇的“RegExp=”声明?让我们使用一个简单的格式模版:

RegExp="(?siU)Search1(.*)Search2.*"

在引号的封闭内,你有:

·          (?siU) 这个是RegExp里面的“设置”命令,告诉它你想要它得到什么

·         Search1 这个是得到你想要的数据的一些文字。

·         (.*) 你想要在阵列中得到的返回值,括号告诉它捕获在search1search2中所有的东西.*

·         Search2 使用这个告诉RegExp它什么时候停止搜索信息(Return1

·         .* -这个包含search/return声明 和下一个 之间的网站的数据 。如果你没有用括号关闭 .* ,它不会返回结果,也不会有StringIndex数量.

?siU 是什么

这个?S 告诉RegExp 在搜索的时候忽略换行符,这样的方法可以让你在搜索“Every good boy deserves favor”,即使它被分成2行也可以匹配。

这个告诉搜索不区分大小写,无论大写和小写字母都会被匹配

这个 U 告诉RegExp 非贪婪匹配,意味着它只会返回第一个匹配的字符串

我不知道什么事“stuff to return,我该怎么放在那里。

你有2个设置,你可以在正则表达式中假如更多的代码,只是抓住你想要排除的东西。或者你使用(.*,Search2结束,

告诉RegExp得到里面所有的东西。这个.*意味着“所有东西”,字面上意思是“任何字符-任何年代,零次或者多次-星号,重要的”(.*)”按照 STRINGINDEX”返回数据,按照”.*””跳过你不需要返回的数据。

一个例子:

你想要得到一个网页的“title”标签。这个 RegExp 你可能会需要:

RegExp="(?siU)<TITLE>(.*)</TITLE>"

 

这样我们告诉 RegExp 从"<TITLE>” 搜索,直到看到“</TITLE>”返回 stringindex1”数据组。

这个指南是简单和围绕”WebParser”重点的。不是"Regular Expressions"的完整指南。我会鼓励你不论现在还是稍后在浏览器新标签打开这个窗口:Perl Regular Expressions ,全方位的了解正则表达式。这是非常有用的工具。

我们的示例

今天要做的是解析一个网站 http://www.geobytes.com/IpLocator.htm?GetLocation ,在皮肤中得到我们的IP和本地信息,

在新标签中打开这个链接:

1.png

高亮部分是我们要提取的信息
2.png

我们要创建的完整皮肤:(这个皮肤为了更简单的学习 WebParser ,不是一般的皮肤)

3.png

Let's Build It

首先我们要进入这个网页,右键,选择“查看网页源代码”,复制所有的东西,黏贴到一个text文本编辑器中,保存这个网页的源为text文件。(保存为txt,不是html,这样你可以轻松地使用文本编辑器编辑它)我把它保存为“WEBPAGE.TXT

这个文件就在webparser_tutorial.zip文件中。

让我们看看要检索的第一个信息。

4.png

从得到ip开始,在这个页面中,这个在所有信息的顶部,并且有“IP Address to locate:”标签

打开webpage.txt(那个从站点输出的文件),搜索这个标签。你会看到下列选项:

<td>

<div align="left">

<form method="POST" action="IpLocator.htm?GetLocation">

 <input type="hidden" name="cid" value="0">

 <input type="hidden" name="c" value="0">

 <input type="hidden" name="Template" value="iplocator.htm">

 <h2>IP Address to locate:<input type="text" name="ipaddress" size="15"

     value="72.205.26.142"> <input type="submit" value="Submit">

 </h2>

我想我不用说这个实际的IP地址与你的IP是不同的,如果你对于这个很惊讶。请关闭浏览器,并且卸载rainmeter,然后重启浏览器,点击这个:LOLCATS

 

现在开始建立“MEASURE”和一个简单的“METER”输出

[MeasureIPAddress]

Measure=Plugin

Plugin=Plugins\WebParser.dll

UpdateRate=1800

Url="http://www.geobytes.com/IpLocator.htm?GetLocation"

RegExp="(?siU)<h2>IP Address to locate:<input type="text" name="ipaddress" size="15" value="(.*)">.*"

StringIndex=1

 

 

 

 

我们告诉 WebParser 了什么:

UpdateRate=1800 我们想每隔 在“RAINMETER”选项中“UPDATE=”声明的值 1800倍的时间 检查这个网站。Update默认是1000,就是1秒,我会将每隔30分钟运行一次webparser。,这是十分频繁的,如果你的IP信息不是经常更换,你可以每隔一小时或者更长,如果你经常访问这个网站,你会发现,被这个网站禁止了访问,自讨苦吃。

Url="http://www.geobytes.com/IpLocator.htm?GetLocation" 这个可以在“VARIABLES”选项设置一个变量,下次如果你想要更改它,就会很简单容易的找到它。

RegExp="(?siU)<h2>IP Address to locate:<input type="text" name="ipaddress" size="15" value="(.*)">" 

通过这句话你告诉 RegExp:

使用(?siU命令声明,(前面描述过了)搜索IP Address to locate:<input type="text" name="ipaddress" size="15" value="

当他看到  ">  时停止搜索,并且返回得到的所有值。

如果我们再看一遍我们输出的 webpage.txt 文件

<td>

<div align="left">

<form method="POST" action="IpLocator.htm?GetLocation">

 <input type="hidden" name="cid" value="0">

 <input type="hidden" name="c" value="0">

 <input type="hidden" name="Template" value="iplocator.htm">

 <h2>IP Address to locate:<input type="text" name="ipaddress" size="15"

     value="72.205.26.142"> <input type="submit" value="Submit">

 </h2>

你会发现我们得到了72.205.26.142 在序列1的位置。

现在,让我们通过“METER”显示这个结果

[MeterIPAddress]

MeasureName=MeasureIPAddress

Meter=STRING

X=2

Y=2

FontColor=0,0,0,255

FontSize=12

StringAlign=LEFT

FontFace=Tahoma

Antialias=1

Prefix="IP Address: "

这样就会在你的皮肤中像下面一样显示”IP Address: 72.205.26.142” :

5.png


现在让我们得到下一个信息,(牢记,RegExp度这个站点是从上到下的。所以,你需要使用正确的"RegExp="声明,你可以在皮肤中显示任何你用命令得到的信息)

下一个信息是“COUNTRY CODE

<tr>

<td align="right">Country Code</td>

<td align="right"><input name="ro-no_bots_pls12" value="US" size="20" readonly></td>

所以我们要增加“REGEXP=”声明,搜索 country code 然后在阵列中返回下一个序列的值。

RegExp="(?siU)<h2>IP Address to locate:<input type="text" name="ipaddress" size="15" value="(.*)">.*ro-no_bots_pls12" value="(.*)" size="20".*

 

所以第一对开始/停止搜索之后我们增加:

.*ro-no_bots_pls12" value="(.*)" size="20".*

这告诉 REGEXP 跳过任何结果知道碰到ro-no_bots_pls12" value=",然后返回任何结果知道看到size="20",然后写入 STRINGINDEX2,这个结果就是例子中的“US

我们需要另一个“MEASURE”来取回这个结果。并在另一个“METER”中显示结果。

[MeasureCountryCode]

Measure=Plugin

Plugin=Plugins\WebParser.dll

Url=[MeasureIPAddress]

StringIndex=2

注意:这个“URL”声明引用原"MeasureIPAddress" measure,拥有"RegExp="声明,代替这个网站的URL。这样你就不用每一次想要得到信息就用REGEXP声明连接一次网站。你把第一个measure"RegExp="声明得到的所有信息都引用到第二个measure中。所有的结果都是被第一个measure索引。你可以在后面的MEASURE/METER中用这个索引号码得到数据结合起来,不用再次访问网站。不仅快速的而且也也不会被网站封IP。频繁的访问网站会被认为是攻击 ==

增加另一个“METER”显示这个信息:

 [MeterCountryCode]

MeasureName=MeasureCountryCode

Meter=STRING

X=2

Y=17r

FontColor=0,0,0,255

FontSize=12

StringAlign=LEFT

FontFace=Tahoma

Antialias=1

Prefix="Country Code: "

好了,现在你只需要继续直到你从网站得到了你想要的数据,我不用把它放出来。但是你可以去看zip文件中的IPLOOKUP.INI

使用 "DEBUG" 使事情变得更简单

WEBPARSER 中使用“DEBUG=1”声明,可以输出序列号,并且关联信息到"Rainmeter.log" I,在你的rainmeter 文件夹中,在measure 中使用debug=1 开启这个功能:

[MeasureWebsite]

Measure=Plugin

Plugin=Plugins\WebParser.dll

UpdateRate=1800

Url=#URL#

RegExp="(?siU)Search1(Return1)Search2(Return2)"

Debug=1

重启rainmeter,右键点击皮肤,选择“显示日志文件”它会输出像:

DEBUG: (00:53:29.391) Refreshing (Name: "IPLookup" Ini: "IP.ini")

DEBUG: (00:53:29.469) WebParser: Fetching URL: http://www.geobytes.com/IpLocator.htm?GetLocation

DEBUG: (00:53:29.859) WebParser: Finished URL: http://www.geobytes.com/IpLocator.htm?GetLocation

DEBUG: (00:53:29.859) WebParser: (Index  1) 72.205.26.142

这是告诉你 数据"72.205.26.142" 序列为1,还会继续显示 REGEXP声明关联的所有index/data组合,对于指出为什么你的"RegExp="声明不起作用是非常有效地。

关闭 DEBUG,可从MEASURE中移除"Debug=1"声明,退出rainmeter,删除"Rainmeter.log"文件,重启rainmeter



我希望这个指南可以帮助你开始webparser,这是rainmeter中一个非常有用的功能.

我建议你:

·         rainmeter手册关于webparser的部分:HERE,或者中文连接

·         还有这个alex2539写的非常好的关于RSS READER 的皮肤HERE

·         点击这里学习更多关于正则表达式的内容HERE

 


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

快速回复 返回顶部 返回列表