Python爬虫之每天给她发一个笑话

寒假在家真是无聊透顶,天气又冷,整天只能躺在床上睡觉、玩游戏。出于好玩,偶然间看到一篇有趣的博客“python实现自动定时给女朋友发手机短信,每天一个笑话!”

https://blog.csdn.net/qq_41841569/article/details/83111712

哈哈哈,有趣!

(建议先看这篇博客)。博主是个幽默风趣的大学生,受到他的感染,我打算自己动过手实现一下并完善一些内容,让大家了解的更加透彻,使代码能够直接用(这不,情人节到了,造福大家)。整个内容分为两个部分:爬取笑话、发送信息。

爬取笑话

这里主要是爬取“ZOL笑话大全”网页上的最新笑话

(http://xiaohua.zol.com.cn/new/),如下图:

该页面中分块显示了最近更新的笑话,通过点击“查看全文”即可查看完整的笑话。在开始爬取之前,最好仔细看看各链接URL的特征,这能很大程度简化爬取过程。像这个页面中,“查看全文”的链接分别如下:

http://xiaohua.zol.com.cn/detail60/59342.html

http://xiaohua.zol.com.cn/detail60/59341.html

http://xiaohua.zol.com.cn/detail60/59340.html

http://xiaohua.zol.com.cn/detail60/59339.html

···················

可以看到每个URL前面都是http://xiaohua.zol.com.cn/detail60/,后面接着序列号(如59342,依次递减)。所以我们爬取笑话是可以直接定位到这样的网页上来,极大地省去了很多繁琐的步骤(URL提取、筛选等)。找到对应目标页面后,还需进一步提取信息得到仅含笑话的文本文档。以http://xiaohua.zol.com.cn/detail60/59342.html这个网页为例,通过查看网页源代码,发现所有的笑话都在<div class=”article-text”>这个区块里,每个笑话之间用</p><p>分割,见下图:

值得注意的是,这个网站具有反爬虫机制,不能直接爬取(运行几次代码后就会报错),需要模拟成“人为的浏览网页”。对于无反爬虫机制的网页可以直接用html = urlopen(url)打开(url为网页链接),而爬取“ZOL笑话大全”这个网页时需要换一种方式(加上平台、浏览器等信息)如下:

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0;WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75Safari/537.36'}
req = Request(url=url, headers=headers)
html = urlopen(req)

小技巧:对于有反爬虫机制的网页来说,建议把要分析的网页保存在本地,爬取保存本地的网页。先把代码里面的爬取逻辑搞懂,代码弄通,然后再爬取浏览器上的网页。(像我这样的小白,写代码时会时不时运行调试,但这网页运行太频繁就会报错,自己还不知道原因,搞得焦头烂额。。。)

from urllib.request import urlopen,Request
from urllib.error 
import HTTPError
from bs4 import BeautifulSoupdef 
GetLink(url):
    try:
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'}  
        req = Request(url=url, headers=headers)  
        html = urlopen(req)    
    except HTTPError as e:       
        return None
    try:
        bsObj = BeautifulSoup(html.read(),"html.parser",from_encoding="GBK")
        title = bsObj.find("div",class_="article-commentbar articleCommentbar clearfix")        
        return title['data-id']    
    except AttributeError as e:        
        return None

def GetDownloadLink(url):
    list1 = []    
    try:
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'}  
        req = Request(url=url, headers=headers)  
        html = urlopen(req)    
    except HTTPError as e:        
        return None
    try:
        bsObj = BeautifulSoup(html.read(),"html.parser",from_encoding="GBK")
        title = bsObj.find("div",class_="article-text").find_all('p')
        for i in range(len(title)):
            title[i] = title[i].get_text().strip()            
            if len(title[i]) > 0:
                list1.append(str(title[i]))       
        return list1    
    except AttributeError as e:        
        return None
return None

if __name__ == '__main__':
    LinkNum = GetLink("http://xiaohua.zol.com.cn/new/")
    print(LinkNum)    
    if LinkNum == None:
        print("Link could not be found!")    
    else:
        Link = 'http://xiaohua.zol.com.cn/detail60/'+LinkNum+'.html'
        result = GetDownloadLink(Link)
        print(result)

爬取结果:

发送信息

我是运用Python调用第三方 SMTP 服务发送电子邮件(模仿那篇博客),这里我是调用163邮箱的SMTP服务(也可以用qq)。在写代码之前要做一些准备,要不然接二连三的bug会把你搞疯。(我是差点要摔电脑了 (灬ꈍ ꈍ灬))

①    开启SMTP服务

这可以参考这个,讲的很清楚:

https://jingyan.baidu.com/article/7f41ecec3e8d35593d095c93.html

值得注意的是,开启服务时,你会得到(设置)一个授权码,这个很重要,这就是Python调用163邮箱SMTP服务的密码!!!(记住!)

②    查看“网络和共享中心网络连接详细信息”中的“连接特定的 DNS 后缀”,确保为“HOST”

这可以参考下面这篇博客中的“常见错误汇总”,里面还讲了其他常见问题,很仔细!

python发送邮件详解

(https://blog.csdn.net/qq_32890891/article/details/80071512)

整个代码逻辑不难,但一疏忽就会出很多问题。 (我很想哭o(╥﹏╥)o)

# **************是自己要填的参数    
import smtplib  
from email.mime.text import MIMEText      

mail_host = "smtp.163.com"  # SMTP服务器    
mail_user = "**************"  # 用户名  
mail_pass = "**************"  # 密码,是那个授权码!!!    
sender = "**************"  # 发件人邮箱(最好写全, 不然会失败)   
receivers = ["**************"]  # 接收邮箱,可以写多个
content = "**************"#邮件内容 
title = "**************"  # 邮件主题    

message = MIMEText(content, 'plain', 'utf-8')  # 内容, 格式, 编码   
message['From'] = "{}".format(sender)   
message['To'] = ",".join(receivers) #将多个地址链接
message['Subject'] = title  
try:    
    smtpObj = smtplib.SMTP_SSL(mail_host, 465)  # 启用SSL发信  
    smtpObj.login(mail_user, mail_pass)  # 登录验证     
    smtpObj.sendmail(sender, receivers, message.as_string())  # 发送      
    print("mail has been send successfully.")   
except smtplib.SMTPException as e:  
    print(e)

在测试代码时,不要发内容重复的邮件,要不然代码可能会出错。这不是代码的问题,而是由于你频繁发送,第三方服务会判定你的邮件为垃圾邮件,从而拒绝你的发送申请,使邮件发不出去。最后测试结果如下:

接着就是定时发送了,这个呢,我们可以用电脑自带的定时任务,每天定时执行Python脚本,这样更加简单点,而且不用一直运行脚本。可以参考这篇博客:

“怎样在windows上定时执行python脚本”

https://www.cnblogs.com/zz0eyu/p/9584000.html


到现在,各部分的代码都搞定了,剩下的就是整合代码了。本想一口气把剩下的都弄出来的,但一想,我又没有女朋友!!! 搞出来不是刺激自己吗?(⊙o⊙)…剩下的其实很简单了,只需要稍微改一下代码就行。最后祝大家情人节玩的开心(*^▽^*)!!!

PS:(文章是自己早期写的,还蛮有趣的,哈哈哈,现在搬到CSDN上,乐一乐)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值