作者 | Baldwin_KeepMind
出品 | CSDN博客
我的日记 4月23日 晴
你三天没回我的消息,在我孜孜不倦地骚扰下你终于舍得回我了,你说‘nmsl’我想这一定是有什么含义吧!噢!我恍然大悟,原来是尼美舒利颗粒。
她知道我关节炎,让我吃尼美舒利颗粒,她还是关心我的但是又不想显现的那么热情的。
天啊!她好高冷,我好像更喜欢她了呢!
你看,虽然女神经常不理我,但是还是会偷偷地关心我,虽然她不直说,但是我都懂。
唯一的问题就是,我最近很忙,忙到都没有时间去给女神发“早安”了。不可以!“早安”绝对不能断,这是我对女神诚挚的爱,女神虽然不会回复我,但是她肯定都记在心里,不回复我肯定是在考验我!
作为一名无所不能的程序猿,我立刻就想到为什么不用Python爬取情话,然后每天定时发送给她呢?
爬取情话
选取情话资源
首先我们需要去网上找到合适的情话资源,如果懒得自己找,可以用这个:http://www.1juzi.com/new/150542.html
分析网页资源
1. 定位情话资源
鼠标放在我们要爬取的情话上快速按下右键+检查(元素)。
先在就可以看到我们的情话在页面中是什么位置了。
2. 定位标签
在开发者工具中,我们轻松的旧定位到了我们的情话的标签,就是上图红框里的内容。
3. 分析请求方式
在刚才的界面(不要退出开发者模式)下刷新:
在Network栏目下找到我们请求的那个资源,在他的Headers中找到这个资源请求的方式,这里是GET。
使用urllib库获取资源
1、安装urllib库
这一步是怕你服务器里没有urllib2库,等会儿会造成麻烦才添加上的,如果你没有添加该库,请百度添加方法。
2、请求资源网站
代码:
import urllib.request
url = "http://www.1juzi.com/new/150542.html"
html = urllib.request.urlopen(url).read()
print(html)
结果:
......
ÿÌìÒ»¾äСÇé»°
news1();
1¡¢½«Äã·Å½øÎÒÐÄÀï×îÖØÒªµÄλÖã¬ÓÃÐÄÀ´¿ÌÄãµÄÃû×Ö¡£
2¡¢°®ÊÇÌ¤ÆÆºì³¾Íû´©ÇïË®£»°®ÊÇÒ»ÉúÒ»ÊÀÚ¤Ú¤Âֻأ»°®Ä㣬ÎÒ²»ÎÊÀíÓÉ¡£
3¡¢×§ÄãÈ뻳£¬ÓèÄãÒ»ÊÀÏà°é£¬ÓµÄãÈ뻳£¬»¤ÄãÒ»ÊÀƽ°²¡£
4¡¢ºÎÖ¹ÊÇÒ°ÐÄ£¬ÎÒԤıÁËÒ»±²×ÓµÄÄîÏ룬´ÓÓö¼ûÄ㿪ʼ£¬²»¼û»ÆÍÁ²»ËÀÐÄ¡£
5¡¢ÎÒºóÀ´ÏëÁËÏ룬ÎÒ²»µ¢ÎóÄ㣬»¹»áÓбðÈ˵¢ÎóÄ㣬ÄÇÎÒ²»¸ÊÐÄ£¬»¹ÊÇÎÒÀ´µ¢ÎóÄã°É¡£
6¡¢¼ûµ½ÄãµÄÄÇÒ»¿ÌÎҾͲ»ÖªËù´ë£¬ÓеÄÖ»ÊǵÄÐÄÌø£¬ÊÇÄã¸Ä±äÁËÎÒ£¬ÒÔǰÎÒ´Ó²»»áÕâÑùµÄ¡£¼ÙÈçÓÐÒ»¸öÈËÄÜÈÃÎÒÐĸÊÇéÔ¸µØ¸Ä±äÄǾÍÊÇÄã¡£
7¡¢ÅãÎÒµ½¿É¿ÉÎ÷ÀïÈ¥¿´º£²»ÒªÎ´À´Ö»ÒªÄãÀ´¡£
8¡¢Ã¿Ò»Ì춼ΪÄãÐÄÌø£¬Ã¿Ò»¿Ì¶¼±»Äã¸Ð¶¯£¬Ã¿Ò»Ã붼ΪÄãµ£ÐÄ¡£ÓÐÄãµÄ¸Ð¾õÕæºÃ¡£
9¡¢²»¸ÒÔÙÌýÇé¸è£¬µ±ÎÒ¸öÈË£¬ÒòΪÑÛÀáÖ¹²»×¡¡£
......小问号,你是否有很多朋友?
我们爬下来的都是乱码,发给女神一堆乱码,女神可能还会以为是我们给她发的暗语,说不定还要花时间去寻找解密方法,想想都累,不能这个样子!
其实出现乱码的原因主要网页的编码方式和我们爬取程序的编码方式不一样造成的,只要找到网页的编码方式就好。
3、设置解码类型
有3种方式:
1.从网页Content-Type中获取编码方式
2.第三方库智能识别编码,常用chardet等
3.猜测编码
我们这里其实在请求头的Content-Type里有编码类型,但是为了保险起见,也是为了能应用到更多的资源网站,这里演示以下chardet的用法,猜测编码的使用请自行百度。
chardet获取编码类型
代码:
import urllib.request
import chardet
url = "http://www.1juzi.com/new/150542.html"
html = urllib.request.urlopen(url).read()
print("html头中的charset:", chardet.detect(html))
结果:
/usr/bin/python3.7 /home/baldwin/PycharmProjects/IAmADog/spider/Spider.py
html头中的charset:{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
Process finished with exit code 0
Get!!!编码方式为GB2312!
设置解码
代码:
import urllib.request
import chardet
url = "http://www.1juzi.com/new/150542.html"
html = urllib.request.urlopen(url).read()
charset = chardet.detect(html).get("encoding")
htmlText = html.decode(charset,errors = 'ignore')
print(htmlText)
结果:
......
每天一句小情话
news1();
1、将你放进我心里最重要的位置,用心来刻你的名字。
2、爱是踏破红尘望穿秋水;爱是一生一世冥冥轮回;爱你,我不问理由。
3、拽你入怀,予你一世相伴,拥你入怀,护你一世平安。
4、何止是野心,我预谋了一辈子的念想,从遇见你开始,不见黄土不死心。
5、我后来想了想,我不耽误你,还会有别人耽误你,那我不甘心,还是我来耽误你吧。
6、见到你的那一刻我就不知所措,有的只是的心跳,是你改变了我,以前我从不会这样的。假如有一个人能让我心甘情愿地改变那就是你。
7、陪我到可可西里去看海不要未来只要你来。
8、每一天都为你心跳,每一刻都被你感动,每一秒都为你担心。有你的感觉真好。
......哦吼!搞定!
4、封装代码
刚才我们已经实现了资源的获取,但是这样的代码用起来太不方便了,我们把它封装在方法里:
......
import urllib.request
import chardet
def getHtml(url):
"""
获取网页html文本资源
:param url: 网页链接
:return: 网页文本资源
"""
html = urllib.request.urlopen(url).read()
charset = chardet.detect(html).get("encoding")
htmlText = html.decode(charset, errors='ignore')
return htmlText
解析网页资源
解析网页的话,需要第三方插件Beautiful Soup来提取 xml 和 HTML 中的数据。
获取content节点内容
我们想要的资源都在一个class为”content“的div节点下,我们现在先获取这个节点的所有内容。
部分代码:
soup = BeautifulSoup(htmlText,"html.parser")
"获取content节点的内容"
div_node = soup.find('div', class_='content')
print(div_node.get_text)
结果:
/usr/bin/python3.7 /home/baldwin/PycharmProjects/IAmADog/spider/Spider.py
= len(sentenceList):
# 用光了就短信通知我
Send.sendSMSMsg(SEND_TO_ME, MY_TEL)
# 跳出
break
# 给女神发短信
content = sentenceList[index] + MSG_SUFFIX
Send.sendSMSMsg(content, SEND_TO_TEL)
# 下标加一
index += 1
# 因为以秒定时,所以暂停2秒,使之不会在1秒内执行多次
time.sleep(2)
debug模式下的各项测试:
短信发送测试
在idea debug模式下可以对time_now参数进行设置,把它设置成我们在前面要发送短信的那个时间点,成功进行了短信发送:
管理员通知测试
同样的在debug模式下,设置index的值为len(sentenceList),程序进入通知管理员模块中,这里不再演示。
封装
from spider import Spider
from send import Send
import time
TIME_TO_DO = '08:30:00' # 发送时间点
MSG_SUFFIX = '\n来自你的小可爱——Baldwin' # 短信后缀
SOURCE_URL = 'http://www.1juzi.com/new/150542.html' # 情话资源地址
SEND_TO_TEL = '+8618436354553' # 女神的手机号
SEND_TO_ME = '舔狗,给女神发的短信已经用光了,快来更新!!!'
MY_TEL = '+8618436354553' # 舔狗手机号
def doSend():
index = 0 # 下一条短信的下标
sentenceList = Spider.getSentenceList(SOURCE_URL) # 情话列表
while True:
# 刷新
time_now = time.strftime("%H:%M:%S", time.localtime())
# 此处设置每天定时的时间
if time_now == TIME_TO_DO:
# 需要执行的动作
# 判断当前list有没有用光
if index >= len(sentenceList):
# 用光了就短信通知我
Send.sendSMSMsg(SEND_TO_ME, MY_TEL)
# 跳出
break
# 给女神发短信
content = sentenceList[index] + MSG_SUFFIX
Send.sendSMSMsg(content, SEND_TO_TEL)
# 下标加一
index += 1
# 因为以秒定时,所以暂停2秒,使之不会在1秒内执行多次
time.sleep(2)
# 主程序入口
if __name__ == '__main__':
doSend()
小总结
这部分主要用到的模块:time,然后记得要把前两个我们自己做的模块导入进来。
总结
这个程序相对来说还算是比较容易的,只要跟着文章一步步来基本上不互出问题。
最后只要运行我们最后一个模块中主程序入口就好了,你也可以按照自己需求修改配置达到不同的效果。
我现在就去告诉女神去。
嘿嘿!女神秒回的,开心!
项目地址:https://gitee.com/dikeywork/IAmADog
版权声明:本文为CSDN博主「Baldwin_KeepMind」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/shouchenchuan5253/article/details/105753596
今日福利
遇见大咖
由 CSDN 全新专为技术人打造的高端对话栏目《大咖来了》来啦!
CSDN 创始人&董事长、极客帮创投创始合伙人蒋涛携手京东集团技术副总裁、IEEE Fellow、京东人工智能研究院常务副院长、深度学习及语音和语言实验室负责人何晓冬,来也科技 CTO 胡一川,共话中国 AI 应用元年来了,开发者及企业的路径及发展方向!
戳链接或点击阅读原文,直达报名:https://t.csdnimg.cn/uZfQ