# 用Python实现KickStarter跟踪器（1）

- URL: https://wuming.si/blog/812/
- Author: Aaron
- Published: 2014-11-07
- Language: zh-Hans
- Categories: Uncategorized
- Originally published at: http://blog.wo.ai/archives/812

自从发现了[HDMIPi KickStarter](https://www.kickstarter.com/projects/697708033/hdmipi-affordable-9-high-def-screen-for-the-raspbe)，我就经常关注KickStarter上其它的众筹项目。我现在就粉着4，5个项目。它们能实现目标吗？还是会失败呢？这很值得关注，但是密切关注1个或2个以上的项目是很浪费时间的。如果我能让一个小小的电脑和屏幕替我关注这些项目，比如，每分钟访问一次，然后再回馈它们的状态给我，不就很棒吗？

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

### **所以怎么实现呢？**

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

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

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

### **查找数据**

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

_View > Developer > View Source_

[![programming a kickstarter1](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/55769b666c_programming-a-kickstarter1.png)](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/55769b666c_programming-a-kickstarter1.png "用Python实现KickStarter跟踪器（1）")

在这段源代码中使用快捷键CMD+F(PC是CTRL+F)来查找字符串pledged，我找到了一行有3个有效数据的代码。这是[HDMIPi KickStarter page](https://www.kickstarter.com/projects/697708033/hdmipi-affordable-9-high-def-screen-for-the-raspbe)的第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官方文档](https://docs.python.org/2/howto/urllib2.html)里面发现了一个超棒的方法来完成。基本上，就是导入urllib2中所有需要的对象，然后把urlopen() 塞进 try: except: 中的空白就好了。这样的方法能够处理断网或者网页没有响应的情况。它不会退出程序，而是进入“Exception”，告诉你出什么错了，然后再运行一次。所以我刚才说它“野蛮”。

### **现在我们加入****URL****吧**

如果我们不给someurl 一个URL网页地址的话，这段代码就是一个花瓶。所以我们就在上面添加传递地址的代码，并且让程序在html文件中查找我们需要的源代码行，找到之后把它们打印出来。

这个结果是在…

_[![programming a kickstarter2](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/4da166be32_programming-a-kickstarter2-300x61.png)](http://fanyi.jobbole.com/images/sites/9/2014/10/programming-a-kickstarter2.png "用Python实现KickStarter跟踪器（1）")_

### **现在我们要分离代码行啦**

所以那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](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/2efadad855_programming-a-kickstarter3.png)  
](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/2efadad855_programming-a-kickstarter3.png "用Python实现KickStarter跟踪器（1）")_

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

### 目前为止我们做了…

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

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

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

[用Python实现KickStarter跟踪器（1）](http://www.geekfan.net/12881/)，首发于[极客范 – GeekFan.net](http://www.geekfan.net)。
