自从发现了HDMIPi KickStarter,我就经常关注KickStarter上其它的众筹项目。我现在就粉着4,5个项目。它们能实现目标吗?还是会失败呢?这很值得关注,但是密切关注1个或2个以上的项目是很浪费时间的。如果我能让一个小小的电脑和屏幕替我关注这些项目,比如,每分钟访问一次,然后再回馈它们的状态给我,不就很棒吗?
我知道一个非常赞的Python模块,urllib2。我以前就用它做过一些简单的事情。那么它到底有多难呢?答案是,真的不太难。我花了大概一个半小时用它来搭建基本框架,跟踪了1个项目。但是用了更多的时间来把其它的项目也添加进去,还有,把输出弄得好看一点(你也会这么做)。
所以怎么实现呢?
和所有程序一样,你只要把它分解为几个小部分就可以了。然后你就开始搬砖,记得每部分搬完之后要进行测试喔。其实基本上只要有个树莓派就够了…
- 访问跟踪项目的Kickstarter页面
- 在html中查找我们想要的数据
- 把这些数据抓出来
- 让它优雅地出现在屏幕上
- 等一会儿
- 再全部执行一次
所以我们需要做的第一件事情就是想办法在网页的html中找到我们想要的数据。这需要费一点手动研究的功夫。
查找数据
许多浏览器都能查看html源代码。你只要访问你想跟踪的那个项目的网页,然后让你的浏览器查看就行了。在Mac上使用Chrome的话,它的步骤是这样的:
View > Developer > View Source
在这段源代码中使用快捷键CMD+F(PC是CTRL+F)来查找字符串pledged,我找到了一行有3个有效数据的代码。这是HDMIPi KickStarter page的第842行。
我想要的大多数数据它都有,但我还想要知道项目的剩余时间。然后我在网页的上部找到了它。(HDMIPi page的第88行)
当然啦,进行中的项目所剩时间肯定和这个不一样的。(比如,16个小时或者24天什么的,而不是0秒)
所以我们就找到从2行HTML中抓有效信息的方法啦。
data-goal=”55000.0″ 告诉我们目标资金是多少(单位是英镑或者美元)
data-percent-raised=”4.750008363636363636363636364″ 这个数字乘以100就是现在已经达到目标的百分之几了。在程序里,我们会把它分为两个部分。
data-pledged=”261250.46″ 告诉我们现在已经筹集到多少钱了
twitter:text:time” content=”0 seconds” 告诉我们这个项目还剩多少时间。
现在我们要做的就是让电脑找到它们,把源代码分离出来,切出数据,然后用你喜欢的方式来把它显示出来。听起来是不是灰常简单呀:)
开始搬砖
所以要想知道如何找到数据,或者至少要知道它在哪一行的话,我必须要做点urllib2的功课了。我以前就知道它可以用来加载一个网页,只是方式比较野蛮。我在Python官方文档里面发现了一个超棒的方法来完成。基本上,就是导入urllib2中所有需要的对象,然后把urlopen() 塞进 try: except: 中的空白就好了。这样的方法能够处理断网或者网页没有响应的情况。它不会退出程序,而是进入“Exception”,告诉你出什么错了,然后再运行一次。所以我刚才说它“野蛮”。
现在我们加入URL吧
如果我们不给someurl 一个URL网页地址的话,这段代码就是一个花瓶。所以我们就在上面添加传递地址的代码,并且让程序在html文件中查找我们需要的源代码行,找到之后把它们打印出来。
这个结果是在…
现在我们要分离代码行啦
所以那2行源代码已经被我们找到了。现在我们要做的是将数据从源代码行中切出来。那这是怎么做到的呢?我们将用一个神器级函数, split() 来实现。
下面代码的第20行,我们写到
days_left=line.split(‘”‘)[3]
这是用 split() 来把整行源代码分离成…
<meta property=”twitter:text:time” content=”0 seconds”>
…N个字符串。每遇到字符 ” ,它就将前后字符串分离(并且删去 ” )。所以它就会把这行源代码分离成一个包含一下元素的变量列表:
<meta property=
twitter:text:time
content=
0 seconds
>
如果把 line.split(‘”‘) 打印出来的话,就是这个样子的…
[‘<meta property=’, ‘twitter:text:time’, ‘ content=’, ‘0 seconds’, ‘>’]
列表第一个元素的位置是0。这就是它的下标。我们要找的‘0 seconds’,这个数据的下标是3。所以我们用[3]来“切出”我们所需的元素。
days_left=line.split(‘”‘)[3] (这个[3] 叫做“切片标记”)
完整的代码来了…
26行到34行是进一步的分离和切片。在使用此数据进行计算处理之前,我们还需要把这些数据转化成浮点型。
print ‘target: %.2f’ % float(target[1]) 这行代码把‘target’的第2个元素转化成浮点数,然后用 .2f 来保证打印出来的数字只含有2位小数。
结果就是这个样子滴
显然,你该在第4行的代码里换一个进行中的项目地址。
目前为止我们做了…
- 加载一个网页
- 查找数据所在的源代码行
- 分离此行源代码然后将所需的数据切出来。
- 把数据转化为我们能处理的东西(浮点数)
- 只在屏幕上显示两位小数
这是一个很好的开端。下一部分,我们将继续完成…
- 给输出结果“化个妆”
- 添加更多项目
- 每过一段时间将它们循环一次