现学现用:追女朋友必不可少的Python技能

简介:

编者有言:多喝热水太敷衍,日常坚持不断的嘘寒问暖反而显得温馨。程序员怎么用自己最擅长的事追到女神?本文将给你一些实用建议。
一、背景

上班的日子总是3点一线——家里,公司和上班的路径,对于我这样一个特别懒的人来说,经常遇到上班路上下雨了,而我却没带伞,多么痛的领悟。

最近对Python有一种狂热的学习热情,写了4年多的C++代码,对于Python我不能说简单,但是它做东西确实太快了,现有的第三方资源真的炒鸡多,用的我也是不亦乐乎。

除了上班忘记带伞,每天重复性的工作还有很多,比如上下班打卡、每个礼拜的周报,还有如果有关心的女神,也可以做定时发送心里话,或者定时提醒等各种服务。

有时候我就会想,如果有一个人能按时提醒我就好了,不过这种想法也就停留了那么几分钟,然后就被自己pass掉了,因为别人也可能忘记啊……

那么这件事是不是可以交给程序来做呢?毕竟程序可是会老老实实的做重复性的工作,而且乐此不疲。

上述问题的场景大多都是需要程序在指定时间、或者指定场合提醒我们该干什么了,本篇文章就定时天气提醒服务来做开篇,讲述使用Python怎么完成这样一个任务,既然这样,那我们就开始构思我们的程序吧。

二、构思

看过背景中的需求描述,要实现这个功能,我们需要解决以下这么几个问题:

1、爬取天气信息

2、动态获取指定城市天气

3、发送天气信息给指定微信好友

4、定时触发爬取动作

5、怎么关联微信账号

下面我们将一步一步解决上述几个问题,并实现我们的需求。

三、爬取天气信息

我们解决问题的顺序不是简单的按照12345这样,而是会按照思考的顺序来。

首先来解决问题1:

对于使用过爬虫的同学来说,爬取天气信息并不难,之前也了解过一些爬取web信息的代码,简单的爬虫无非就是那么几步:

确定爬取的url,使用浏览器打开

F12查看网页布局信息

使用xpath或者bs4进行节点定位

拿到页面信息

自己拼接爬取到的信息

写文件、写数据库、发送网络等等

这里贴下我之前写的几个简单爬虫:

Python-爬取校花网视频(单线程和多线程版本)

https://www.cnblogs.com/swarmbees/p/10017073.html

Python-爬取妹子图(单线程和多线程版本)

https://www.cnblogs.com/swarmbees/p/10016919.html

Python爬虫Scrapy(一)-我爬了boss数据

https://www.cnblogs.com/swarmbees/p/10011898.html

下面是爬取城市天气的python方法,需要注意一点的是getWeath接口的参数city_code,这是一个全国城市编码,每个城市都是唯一的,这个表格我已经整理成了一个txt文档,后续放源码的时候会一并提供。

image
上述方法可以获取一个城市的天气信息,并储存在一个字典中,我们要发送给好友,还需要对其进行字符串处理,处理代码如下:
image
全国城市编码如下图所示,每个城市的编码都是一个9位的数字组成,获取天气信息时是通过指定该编码进行查询。

image

四、发送给指定好友

解决问题3:发送消息给好友。

解决问题5:怎么关联微信账号,使用wechat_sender库。

我们自己爬取到的天气信息怎么和微信能扯上关系呢?

可以看看我以前提到的《微信聊天机器人-存储好友分享消息》,简单来说就是登陆一个web版本的微信账号,在我们的电脑上,做这么一个机器人使用了库wxpy,要想和这个机器人勾搭上,那我们就需要请出我们今天的重磅嘉宾wechat_sender。

《微信聊天机器人-存储好友分享消息》

https://www.cnblogs.com/swarmbees/p/9996547.html

wxpy

https://wxpy.readthedocs.io/zh/latest/index.html

https://github.com/youfou/wxpy

wechat_sender是基于wxpy和tornado实现的一个可以将你的网站、爬虫、脚本等其他应用中各种消息(日志、报警、运行结果等)发送到微信的工具包,有了它,我们的消息就可以顺利的发送到我们的微信账户了。

wechat_sender

https://wechat-sender.readthedocs.io/zh_CN/latest/index.html

tornado

https://github.com/tornadoweb/tornado

image

交互流程

如上图所示,首先使用wxpy登陆微信机器人,当然这个机器人使用的是我们自己的微信账号。

这里需要特别注意一点,《微信聊天机器人-存储好友分享消息》中讲述的机器人进入命令状态是使用的embed()方法,在这里我们不能使用该接口了,我们需要换成上述交互流程的很关键的一步,使用listen接口进行监听,这样我们的web工具才能发送消息给机器人,建议仔细阅读一遍wechat_sender说明文档,内容不多。
image
登陆微信机器人

爬取到天气信息以后,使用wechat_sender中的Sender类直接发送消息给微信机器人,下属代码中尝试是用了多种发送消息的方式,代码中都有详细注释,可自行阅读。
image
登陆微信机器人,下边代码中第12行非常关键,这一行就是用来监听外部程序发送消息的。
image
五、城市编码
解决问题2:根据配置的城市名称动态获取城市编码,然后请求数据。

由于没有接口可以直接获取城市编码,因此这里我们自己封装了一个类来进行管理城市名称和城市编码,拉取城市天气时,只要输入城市名称,那么城市编码即可通过该类获取到,具体代码如下:

image

六、定时任务

解决问题4:定时发送任务

我们的需求是每日定时拉取天气信息,并发送给指定好友,Python有一个APScheduler库,支持定时任务,具体使用比较复杂,我也没有仔细研究。这里我们只是需要使用一个定时任务,其他不做介绍,有兴趣的同学可自行研究。

在研究定时任务的过程中,一直没有找到BackgroundScheduler类add_job时,回调函数怎么传递参数,因此这里我封装了一个类,让定时任务和任务回调处于一个域内,这样参数就可以放在类的成员变量未知,不需要传递了,哪位大神如果会操作,可以评论区指出,非常感谢。
image

后期出现不同类型任务时,我们就需要再封装新的类。

上述MyJob类有2个接口,一个是任务调度器回调接口,不需要我们调用,另一个是加载任务接口,这个任务参数是一个标准的json串,由任务触发时间和具体的任务列表组成,任务触发时间主要是给调度器使用,任务列表就是调度器触发时的回调函数需要执行的任务数量。

image

如上述任务json串来说,我们的任务id为my_jobs,在每天的6:30和17:30,我们需要执行items列表所指出的任务,任务列表是一个列表,列表中存储的是具体任务,receivers代表任务执行完毕需要发送的好友,city是爬取的天气名称,测试效果如下图所示:
image
image

由于任务调度器不是一个阻塞性的程序,如果我们不在主线程进行阻塞程序,那么程序就会直接退出;如果阻塞了主线程,那么任务调度程序也将会被阻塞。

因此这里在添加任务调度后,我们开启了一个子线程,主要就是为了不让主线程退出,这样做其实不合理,但是我们这里仅仅是为了演示,对这些问题的进一步处理我们之后会有文章来详细分析。
image

喜欢的同学可以自己尝试完成下这个小程序,或者选择一个类似的场景进行处理,本篇文章中还有几个需要优化的地方,由于篇幅问题,我们之后再进行讲解:

1、定时任务做成windows服务,这样更优雅,随开机启动

2、发送消息给微信好友换成发送邮件给指定邮箱

原文发布时间为:2018-12-9
本文作者: 朝十晚八
本文来自云栖社区合作伙伴“ DBAplus社群”,了解相关信息可以关注“dbaplus”微信公众号

相关文章
|
21天前
|
安全 Python
Python并发编程必备技能:掌握threading模块,让你的代码跑得更快!
【8月更文挑战第22天】Python并发编程采用多线程技术实现任务的同时执行。利用`threading`模块可轻松管理和创建线程。通过`Thread`类实例化线程并用`start()`方法启动。线程同步通过`Lock`确保资源访问互斥,或用`Semaphore`控制并发数量。线程间通信则可通过`Queue`安全传递数据,实现生产者-消费者模式等功能。这些工具有效避免了竞态条件,确保了程序的正确性和效率。
29 1
|
1月前
|
测试技术 持续交付 Apache
深度挖掘:Python性能测试中JMeter与Locust的隐藏技能🔍
【8月更文挑战第5天】随着软件规模扩大,性能测试对系统稳定性至关重要。Apache JMeter和Locust是两大主流工具,各有千秋。本文探索它们在Python环境下的进阶用法,挖掘更多性能测试潜力。JMeter功能强大,支持多种协议,可通过命令行模式执行复杂测试计划,并与Python集成实现动态测试数据生成。Locust基于Python,通过编写简洁脚本模拟HTTP请求,支持自定义请求及与Python库深度集成。掌握这些技巧可实现高度定制化测试场景,有效识别性能瓶颈,提升应用稳定性。
102 1
|
15天前
|
算法 关系型数据库 程序员
程序员必备技能)基于Python的鼠标与键盘控制实战扩展与源码
这篇文章是关于如何使用Python的`pyautogui`库来控制鼠标和键盘进行各种操作,包括移动、点击、滚轮控制以及键盘的按键和快捷键输出,并介绍了如何结合图像处理和计算机视觉技术来扩展其应用。
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
【7月更文挑战第31天】在数据驱动时代,Python凭借其简洁性与强大的库支持,成为数据分析与机器学习的首选语言。**数据分析基础**从Pandas和NumPy开始,Pandas简化了数据处理和清洗,NumPy支持高效的数学运算。例如,加载并清洗CSV数据、计算总销售额等。
44 2
|
2月前
|
数据采集 网络协议 数据挖掘
网络爬虫进阶之路:深入理解HTTP协议,用Python urllib解锁新技能
【7月更文挑战第30天】网络爬虫是数据分析和信息聚合的关键工具。深入理解HTTP协议及掌握Python的urllib库对于高效爬虫开发至关重要。HTTP协议采用请求/响应模型,具有无状态性、支持多种请求方法和内容协商等特点。
28 3
|
21天前
|
数据采集 数据挖掘 数据处理
解锁Python数据分析新技能!Pandas实战学习,让你的数据处理能力瞬间飙升!
【8月更文挑战第22天】Python中的Pandas库简化了数据分析工作。本文通过分析一个金融公司的投资数据文件“investment_data.csv”,介绍了Pandas的基础及高级功能。首先读取并检查数据,包括显示前几行、列名、形状和数据类型。随后进行数据清洗,移除缺失值与重复项。接着转换日期格式,并计算投资收益。最后通过分组计算平均投资回报率,展示了Pandas在数据处理与分析中的强大能力。
29 0
|
22天前
|
SQL 网络协议 数据库连接
"解锁数据连接新技能:Python携手SqlServer,轻松驾驭企业级数据库挑战!"
【8月更文挑战第21天】本文介绍如何在Python中连接SqlServer数据库。首先,需安装`pyodbc`库:`pip install pyodbc`。接着配置数据库详情如服务器地址、端口等。示例代码展示如何建立连接、执行查询及处理结果。务必确认TCP/IP已启用并使用合适ODBC驱动。了解这些步骤可助您更好地利用Python进行数据管理。
36 0
|
2月前
|
存储 大数据 索引
解锁Python隐藏技能:构建高效后缀树Suffix Tree,处理大数据游刃有余!
【7月更文挑战第19天】Suffix Tree 概述:** 为高效处理字符串搜索、匹配和大数据分析,后缀树是一种优化数据结构,可快速检索后缀、执行最长公共后缀查询及字符串排序。Python中虽无内置实现,但可通过第三方库或自建代码构造。应用于字符串搜索、生物信息学等领域,提升大数据处理效率。
34 3
|
2月前
|
算法 数据挖掘 计算机视觉
Python并查集实战宝典:从入门到精通,让你的数据结构技能无懈可击!
【7月更文挑战第17天】并查集,如同瑞士军刀,是解决元素分组问题的利器,应用于好友关系、像素聚类、碰撞检测和连通性分析等场景。本文从基础到实战,介绍并查集的初始化、查找与路径压缩、按秩合并,以及在Kruskal算法中的应用。通过并查集,实现高效动态集合操作,对比哈希表和平衡树,其在合并与查找上的性能尤为突出。学习并查集,提升算法解决复杂问题的能力。
57 5
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
职场新技能:Python数据分析,你掌握了吗?
职场新技能:Python数据分析,你掌握了吗?
29 0