监控微博博主更新并发微信至好友

最近刚刚从腾讯云租了个vps,就搭了本博客,然而对于一个2g运存的服务器来说,只是搭一个目前没啥人(以后貌似也没啥人)访问的博客太大材小用了,不如在上面跑个脚本,物尽其用嘛~~~

看知乎上有人做过类似京东降价发邮件的,我也想尝试一下。但是目前没有什么买东西的意愿,就试试微博更新时给我发微信吧。

目前只是一个简单的想法,想要实现的话,大概需要selenium或者requests请求搜索博主,利用一个tmp记录博主上一次发博客时的时间,对比最近一条信息的时间,若时间不同,则发送信息给文件传输助手。发送微信的话应该可以用itchat或者wxpy实现,有待进一步验证。

2019-3-17更新

今天下午试了试上面的想法,结果成功了,记录一下吧

1.首先要解决的是获取微博内容

因为是要在服务器上跑,所以selenium并不打算考虑,只能用requests来模拟实现。这里我选择“翔翔大作战fly”这个博主作为目标,算是给他打个小广告吧~

首先获取博主的用户id,搜索到后看地址栏,weibo.com/u/6348485093,最后的一串数字就是博主的id,确定好链接可以进行下一个步骤

用requests读取该博主的主页

import requests

fly_url = 'https://www.weibo.com/u/6348485093'
sess = requests.Session()
res = sess.get(fly_url).content
print res

执行结果并没有我想要的内容,看样子应该是没有登录导致无法访问吧,但是微博的登录如何来实现呢?我尝试了一下在requests的headers中加入UA,cookie等字段模拟已登录的设备


header = {'Host': 'weibo.com','User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0','Cookie':cookie}
res = sess.get(fly_url,headers=header).content
print res

这回尝试一下看看返回什么

嗯,这回返回的是我们需要的了。那接下来如何判断是否有更新呢?

2.判断是否有更新,我们来看一下

其实每一个视频对应的都是一个很整齐的标签,而且都对应着一个专门的mid,我们可以根据mid来判断是否有新的更新。将当前页的所有mid记录到一个list中,判断最新的一个视频是否在该列表中,若不在则说明有更新,若在说明没有更新。

那么如何获得这些mid呢?原来我用的话可能会选择xpath或者beautifulsoap,但这个毕竟是服务器,能少装就少装吧,用re试试

pattern = r'<a name=(.*?) target'

fly_list=['4271572192285625', '4349442049785740', '4349094950549263', '4348370270939147', '4347645436459653', '4346558210494052', '4345470958729595', '4344746207867520', '4344398877200040', '4343659149382058', '4342934272811155', '4341847096985894', '4341122354488315', '4340397566255924', '4339672819628236']

rq = re.findall(pattern,res)
if rq[1] not in fly_list:
    有更新

其实最开始的pattern是 r'diss-data="" mid=(.*?)>',但是最后一直爬不到东西,不知道怎么回事,就从获取到的res中找相关内容。后来发现获取到的内容中并不是一个整个的标签,而是又拆分成了好多别的标签。所以根据原内容确定了如上的pattern

接着是列表,最开始初始化fly_list,然后判断新发表的微博mid是否在该列表里。这里要注意的一点是最上面的rq[0]是置顶微博,而不是最新微博。最新微博是rq[1]

这时就实现了判断是否有更新的功能

3.python 发送微信

昨天就查了一些相关的信息,说是用itchat或者wxpy,今天搜索相关信息进行尝试。

用 Python 玩微信:https://wxpy.readthedocs.io/zh/latest/index.html

from wxpy import *

bot = Bot(console_qr=True, cache_path=True)

my_friend = bot.friends().search(u'挚')[0]
message = u'翔翔大作战fly更新微博啦,快去看呀~~~'
my_friend.send(message)

运行后会在控制台输出二维码,扫码后直接登录执行接下来的命令,因为现在脚本正在运行,所以就不截图了。不然还得重新登录。

4.循环检测

因为要在服务器长期运行,所以要循环执行该任务。可是用while+sleep总感觉没那么高端,所以这次使用Apscheduler.

Python实现定时任务:https://www.jb51.net/article/104926.htm

如果执行的间隔太短,可能导致wx号被封,或者会导致微博封禁ip;执行间隔太长,可能会失去登录状态,进而无法发送信息,所以我设定的是30分钟检测一次,以保证程序的正常运行。

5.最后的组装

import requests
import re
from wxpy import *
from apscheduler.schedulers.blocking import BlockingScheduler
def my_job():
crawl_weibo()
def crawl_weibo():
url = 'https://m.weibo.cn/'
fly_url = 'https://www.weibo.com/u/6348485093'
sess = requests.Session()
header = {'Host': 'weibo.com','User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0','Cookie':cookie}
res = sess.get(fly_url,headers=header).content
#print res
pattern = r'<a name=(.*?) target'
fly_list=['4271572192285625', '4349442049785740', '4349094950549263', '4348370270939147', '4347645436459653', '4346558210494052', '4345470958729595', '4344746207867520', '4344398877200040', '4343659149382058', '4342934272811155', '4341847096985894', '4341122354488315', '4340397566255924', '4339672819628236']
rq = re.findall(pattern,res)
if rq[1] not in fly_list:
send_wx()

def send_wx():
my_friend = bot.friends().search(u'name')[0]
message = u'翔翔大作战fly更新微博啦,快去看呀~~~'
my_friend.send(message)

if name=='main':
bot = Bot(console_qr=True, cache_path=True)
sched = BlockingScheduler()
sched.add_job(my_job, 'interval', minutes=30)
sched.start()

6.更进一步的工作

当然,考虑到服务器的情况,如果是前台工作,那关闭连接时任务也就结束了,如何让程序在我们离线的时候也能工作呢?

这时可以利用nohup python crawel_weibo.py >log.txt &2>1 &指令进行后台的运行。

还有,可以增加分别对多个博主的检查判断,然后提醒的时候分别提醒。

未来还能干些啥呢,考虑了一下可能挂12306抢票软件,或者京东秒杀脚本之类的,有时间接着尝试。

参考网址:https://www.cnblogs.com/rkfeng/p/6338107.html

命令详解:https://blog.csdn.net/u010889390/article/details/50575345  

点赞

发表评论

[2;3Rer>