用Python实现KickStarter跟踪器(1)

自从发现了HDMIPi KickStarter,我就经常关注KickStarter上其它的众筹项目。我现在就粉着4,5个项目。它们能实现目标吗?还是会失败呢?这很值得关注,但是密切关注1个或2个以上的项目是很浪费时间的。如果我能让一个小小的电脑和屏幕替我关注这些项目,比如,每分钟访问一次,然后再回馈它们的状态给我,不就很棒吗?

我知道一个非常赞的Python模块,urllib2。我以前就用它做过一些简单的事情。那么它到底有多难呢?答案是,真的不太难。我花了大概一个半小时用它来搭建基本框架,跟踪了1个项目。但是用了更多的时间来把其它的项目也添加进去,还有,把输出弄得好看一点(你也会这么做)。

所以怎么实现呢?

和所有程序一样,你只要把它分解为几个小部分就可以了。然后你就开始搬砖,记得每部分搬完之后要进行测试喔。其实基本上只要有个树莓派就够了…

  • 访问跟踪项目的Kickstarter页面
  • 在html中查找我们想要的数据
  • 把这些数据抓出来
  • 让它优雅地出现在屏幕上
  • 等一会儿
  • 再全部执行一次

所以我们需要做的第一件事情就是想办法在网页的html中找到我们想要的数据。这需要费一点手动研究的功夫。

查找数据

许多浏览器都能查看html源代码。你只要访问你想跟踪的那个项目的网页,然后让你的浏览器查看就行了。在Mac上使用Chrome的话,它的步骤是这样的:

View > Developer > View Source

programming a kickstarter1

在这段源代码中使用快捷键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文件中查找我们需要的源代码行,找到之后把它们打印出来。

这个结果是在…

programming a kickstarter2

现在我们要分离代码行啦

所以那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位小数。

结果就是这个样子滴

programming a kickstarter3

显然,你该在第4行的代码里换一个进行中的项目地址。

目前为止我们做了…

  • 加载一个网页
  • 查找数据所在的源代码行
  • 分离此行源代码然后将所需的数据切出来。
  • 把数据转化为我们能处理的东西(浮点数)
  • 只在屏幕上显示两位小数

这是一个很好的开端。下一部分,我们将继续完成…

  • 给输出结果“化个妆”
  • 添加更多项目
  • 每过一段时间将它们循环一次

用Python实现KickStarter跟踪器(1),首发于极客范 – GeekFan.net