查询某网站某数据的简单实现

今天美国大选,为了实时获取懂王和睡王的选票数量,我决定写一个简单的 Python 爬虫。

用 Python 获取某新闻网站选票数据

这里要用到 requests 和 bs4 包,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
from bs4 import BeautifulSoup

# 获取该网站 html 的字节码
r = requests.get("https://www.foxnews.com/elections/2020/general-results")
text = r.text # bytes->str

# 用 BeautifulSoup 把该 html 文本转变为复杂的树型结构,便于后续提取特定网页元素
soup = BeautifulSoup(text, "html.parser")

# 获取选票数据,这里需要在浏览器中审查元素,使用目标数据的具体 class 等信息进行提取
biden = soup.select('.count')[0].text
trump = soup.select('.count')[1].text

print("当前选票 拜登 " + biden + ' : 川普 ' + trump)

使用 Alfred workflow 快捷运行并获取结果

macOS 上的著名的小黑帽——Alfred,前两天才开始使用。
同类型的还有国产的 utools,UI 更美观,已提供的功能插件也很丰富,但是开发插件需要前端知识,不太适合我这种前端小白。

workflow:

  • 设置启动热键。
  • 执行上面特定的 py 文件。
  • 执行结果通过 macOS 通知推送。

使用 Server酱 实现微信服务号通知

1、打开网站 Server酱,使用 Github 进行注册。
2、绑定自己的微信账号。
3、查看自己的 SCKey。

用 Server酱 实现通知也很简单,只需要执行以代码即可:

1
requests.get("https://sc.ftqq.com/[你自己的SCkey].send?text=[blablablabla]")

Server酱可以接受两个参数:

  • text:消息标题,最长为256,必填。
  • desp:消息内容,最长64Kb,可空,支持MarkDown。

把要推送的信息放在 text 或者 desp 里即可。

腾讯云函数实现定时查询和变动提醒(失败尝试)

上面的部分仅能够快速执行代码并获取通知,每隔一会儿我就试一次,在接受过好多次「拜登 238:川普 213」之后,我决定让它每五分钟爬一次,数据有变化再提醒我。

有以下几种选择:

  • 在自己的电脑上设置定时任务,需要一直开机+联网,不太现实。
  • 在自己的服务器上设置定时任务。效果应该很好,不过我的服务器已经到期了。
  • 选择某些云服务商提供的云函数。

我采用了腾讯云函数,看了看每日免费调用次数是妥妥的够用。
(一直在用腾讯云函数进行每日的 WPS 自动签到)

下面是完整的云函数文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# -*- coding: utf8 -*-
import requests
from bs4 import BeautifulSoup

def main_handler(arg1,arg2):
r = requests.get("https://www.foxnews.com/elections/2020/general-results")
text = r.text
soup = BeautifulSoup(text, "html.parser")
biden = soup.select('.count')[0].text
trump = soup.select('.count')[1].text
b = 0
t = 0
with open('data.txt', 'r') as f:
for line in f.readlines():
line = line.split(' ')
b = int(line[0])
t = int(line[1])
if b != biden or t != trump:
txt = "https://sc.ftqq.com/[我的SCKey].send?text=拜登" + biden + "川普" + trump
requests.get(txt)
with open('data.txt','w') as f:
f.write(str(biden) + ' ' + str(trump))
return "yes"
else:
return "no"

1、使用一个 data.txt  保存数据,只有发现数据更新时才会调用 Server酱推送提醒。
2、腾讯云函数内置了 requests 包,但没有 bs4 包,需要自己生成本地文件打包上传。

测试代码时报错,发现 data.txt 文件为只读。

到这里才发现一个重大问题:腾讯云函数环境内部没有可以长期存储的可读写空间!!

查了一下官方文档:

Q:环境内有可写空间吗?

A:有。云函数在执行过程中,都拥有一块500MB的临时磁盘空间 /tmp,用户可以在执行代码时对该空间进行一些读写操作,也可以创建子目录,但这部分数据在函数执行完成后不会保留。

说明:

  • 实例间的临时空间互相隔离,不共享,即每个实例均有独立的临时空间。
  • 运行环境内除 /tmp 目录下,_其他均限制为只读_。

而后我又尝试了同类产品阿里函数计算,依然不允许对文件进行写操作。

基本上要放弃了。
发现可以通过七牛云的对象存储进行「曲线救国」(真折腾人啊)。
有空了试一试。(为什么云函数这么多限制啊……还是自己的服务器好)