使用python+微博进行远程关机

很长一段时间没有更新简书的内容了,打算把微博爬虫完善得差不多之后,再系统的把做微博爬虫的每个模块和阶段都记录下来。其中微博页面抓取和解析、用户页面抓取和分析等模块,都是可以复用的。现在还只是单机单线程,因为微博的反爬虫机制还没完全研究透,等找到抓取的阈值后再考虑分布式或者多进程。这里是微博扩散分析的项目地址,有兴趣的可以看看,喜欢的话不防点个star,如何?


这篇文章写的是基于模拟登陆微博的一个小工具。使用情况是人不在办公室,但是电脑没有关闭,需要远程关闭电脑。对模拟登陆微博有问题的同学,请移步我的这篇文章。下面进入正题。

思路

  • 定时模拟登陆(定时是因为微博cookie24小时失效),关于模拟登陆详细步骤可参考我的博文,代码可参考github项目
  • 定时(10分钟)获取最新一条微博,并把发布时间和系统时间做比较,如果相差在半个小时以内,我们就认为命令有效,那么就让系统执行关机命令

项目依赖

  • 模拟登陆+页面解析:
  • requests+pyexecjs+beautifulsoup
  • pip install requests
  • pip install bs4
  • pip install PyExecJS
  • 命令行解析docopt
  • pip install docopt
  • phantomjs
  • windows:在phantomjs官网下载它,并且把它的路径添加到环境变量
  • ubuntu:sudo apt-get install phantomjs 或者到官网下载并且添加到环境变量

各个模块和代码

login.py

该模块代码负责模拟登陆,之前已经详细讲过这部分代码了,在这里就不啰嗦了,最后返回的是session和uid(微博ID,用于拼凑主页URL)

** weibo_parser.py**

解析微博主页,并且返回最新一条微博和发布时间

具体代码如下
<pre>
def get_newest(session, uid):
# 获取只含有原创内容的个人主页
url = 'http://weibo.com/' + uid + '/profile?profile_ftype=1&is_ori=1#_0'
page = session.get(url).text

soup = BeautifulSoup(page, 'html.parser')    
scripts = soup.find_all('script')    

status = ' '    
for s in scripts:        
    if 'pl.content.homeFeed.index' in s.string:            
            status = s.string    
#用正则表达式获取微博原创内容
pattern = re.compile(r'FM.view\((.*)\)')    
rs = pattern.search(status)    
if rs:       
    cur_status = rs.group(1)        
    html = json.loads(cur_status).get('html')        
    soup = BeautifulSoup(html, 'html.parser') 
    # 获取最新一条微博所有信息       
    newest = soup.find(attrs={'action-type': 'feed_list_item'})        
    # 获取最新发布内容
    post_cont = newest.find(attrs={'node-type': 'feed_list_content'}).text.strip()     
    # 获取最新发布时间
    post_stamp = int(newest.find(attrs={'node-type': 'feed_list_item_date'}).get('date')[:-3])                            
    post_time = datetime.fromtimestamp(post_stamp)        
    now = datetime.now() 
    # 计算此刻和发布时间的时间差(单位为秒)       
    t = (now - post_time).total_seconds()        
    return post_cont, t    
else:        
    return None  

</pre>

这里面用到的知识包括beautifulsoup和正则表达式,它们的具体使用我就不细说了,关于正则表达式,search()函数我是用得最多的,beautifulsoup我用得最多的是find(attrs={key: value}),attrs这个参数真心好用!这个是beautifulsoup的官方文档:bs中文文档.关于页面解析,可能我会专门写一篇文章详细说,这里就略去了。

pc_shutdown.py
<pre>
"""Resolvewang

Usage:
pc_shutdow.py name <name> password <password>
pc_shutdow.py (-h | --help)
pc_shutdow.py --version

Options:
-h --help Show this screen.
--version Show version
"""
from login import get_cur_session
from weibo_parser import get_newest
from docopt import docopt
from os import system
import platform
import time

def shutdown(name, password):
session, uid = get_cur_session(name, password)
return get_newest(session, uid)

if name == 'main':
# 从命令行获取登陆账号和密码
args = docopt(doc, version='ShutdownMyPC 1.0')
login_name = args.get('<name>')
login_pass = args.get('<password>')
# 循环用于定时查看是否有新微博发布
while True:
# 获取发布内容和时间,内容用 " "隔开,比如“关机 10”
cont, ptdelta = shutdown(login_name, login_pass)
info = cont.split(' ')
# 判断是关机命令还是正常微博
if info[0] == '关机' and ptdelta < 30 * 60:
shut_time = 0
try:
shut_time = int(info[1])
except Exception:
print('马上自动关机')
else:
print('{time}分钟后自动关机'.format(time=info[1]))
finally:
# 判断操作系统平台,由于没有mac实验环境,所以这里没添加mac的相关判断
os_system = platform.system().lower()
if os_system == 'windows':
command = 'shutdown -s -t {shut_time}'.format(shut_time=shut_time60)
else:
command = 'shutdown -h {shut_time}'.format(shut_time=shut_time)
# 执行关机命令
system(command)
time.sleep(10
60)
</pre>

这段代码的逻辑基本都写在注释里了,其中有个docopt模块,是关于命令行参数的,如果有不清楚的同学可以看看这篇博客,也可以看看它的github,里面有很多例子


关于使用微博进行远程关机的讲解都完了,上述代码还有可以改进的地方,特别是pc_shutdown.py,比如

  • 使用定时器进行查看新微博
  • session复用直到24小时失效,这样就不用每隔十分钟就重新登陆一次了,可以通过多进程或者多线程共享变量实现
  • 可以把这个小工具修改成一个开机启动脚本(linux平台)或者服务(win平台)。

吾生也有涯,而知也无涯。大家加油,共勉!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容