这个小教程为了抛砖引玉,在rainmeter中使用webparser.dll,得到网站的信息。我们很多人使用webparser获得RSS feeds或者其他数据,但是经常使用/调整其他人的代码,不用彻底了解代码是如何工作的,或者怎么创建那些从网页中得到提取信息核心的“RegExp=”声明。
这即不是详细的,也不是去得到XML文件格式,或者他们怎么使用RSS 摘要。一旦你知道如何解析一个网站。寻找XML/RSS 标签会更加容易。
准备工作
首先下载我们这个教程中需要的zip文件,ini文件,还有其他text文件。还有一些你想要的图片。解压到你的皮肤文件夹。它会创建一个叫做“skins\iplookup”文件夹,你需要的东西都在里面。
如果你要加载这个皮肤和下面这些步骤,务必刷新rainmeter
Download HERE
你也要点这里Manual - WebParser,这里是完整的 webparser教程 也是我们下面这些的依据。
RegExp(正则表达式)
现在让我占用几分钟来讲一下代码的关键部分,这个“RegExp=”声明,webParser使用“Regular Expression”搜索你想要的信息,并且返回这个信息用2个立体“阵列”。第一维是“Index”数字,(阵列里面的数字,从1开始,到你要搜索的位置),第二个在RegExp基础上检索到的实际结果。
那么,我们怎么在rainmeter中建立一个神奇的“RegExp=”声明?让我们使用一个简单的格式模版:
RegExp="(?siU)Search1(.*)Search2.*"
在引号的封闭内,你有:
·
(?siU) – 这个是RegExp里面的“设置”命令,告诉它你想要它得到什么
·
Search1 – 这个是得到你想要的数据的一些文字。
·
(.*) – 你想要在阵列中得到的返回值,括号告诉它捕获在search1和search2中所有的东西.*
·
Search2 –使用这个告诉RegExp它什么时候停止搜索信息(Return1)
·
.* -这个包含在search/return声明 和下一个 之间的网站的数据 。如果你没有用括号关闭 .* ,它不会返回结果,也不会有StringIndex数量.
?siU 是什么
这个?S 告诉RegExp 在搜索的时候忽略换行符,这样的方法可以让你在搜索“Every good boy deserves favor”,即使它被分成2行也可以匹配。
这个 i 告诉搜索不区分大小写,无论大写和小写字母都会被匹配
这个 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和本地信息,
在新标签中打开这个链接:
高亮部分是我们要提取的信息
我们要创建的完整皮肤:(这个皮肤为了更简单的学习 WebParser ,不是一般的皮肤)
Let's Build It
首先我们要进入这个网页,右键,选择“查看网页源代码”,复制所有的东西,黏贴到一个text文本编辑器中,保存这个网页的源为text文件。(保存为txt,不是html,这样你可以轻松地使用文本编辑器编辑它)我把它保存为“WEBPAGE.TXT”
这个文件就在webparser_tutorial.zip文件中。
让我们看看要检索的第一个信息。
从得到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">
你会发现我们得到了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” :
现在让我们得到下一个信息,(牢记,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