今天美国大选,为了实时获取懂王和睡王的选票数量,我决定写一个简单的 Python 爬虫。
用 Python 获取某新闻网站选票数据
这里要用到 requests 和 bs4 包,具体代码如下:
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 酱 实现通知也很简单,只需要执行以代码即可:
requests.get("https://sc.ftqq.com/[你自己的SCkey].send?text=[blablablabla]")
Server 酱可以接受两个参数:
- text:消息标题,最长为 256,必填。
- desp:消息内容,最长 64Kb,可空,支持 MarkDown。
把要推送的信息放在 text 或者 desp 里即可。
腾讯云函数实现定时查询和变动提醒(失败尝试)
上面的部分仅能够快速执行代码并获取通知,每隔一会儿我就试一次,在接受过好多次「拜登 238:川普 213」之后,我决定让它每五分钟爬一次,数据有变化再提醒我。
有以下几种选择:
- 在自己的电脑上设置定时任务,需要一直开机+联网,不太现实。
- 在自己的服务器上设置定时任务。效果应该很好,不过我的服务器已经到期了。
- 选择某些云服务商提供的云函数。
我采用了腾讯云函数,看了看每日免费调用次数是妥妥的够用。
(一直在用腾讯云函数进行每日的 WPS 自动签到)
下面是完整的云函数文件:
# -*- 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
,用户可以在执行代码时对该空间进行一些读写操作,也可以创建子目录,但这部分数据在函数执行完成后不会保留。
而后我又尝试了同类产品阿里函数计算,依然不允许对文件进行写操作。
基本上要放弃了。
发现可以通过七牛云的对象存储进行「曲线救国」(真折腾人啊)。
有空了试一试。(为什么云函数这么多限制啊……还是自己的服务器好)