帮粉丝写Python爬虫之【新浪微博热榜爬虫+邮箱定时发送】

402 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

梦想橡皮擦:接到一个新的小任务,爬取新浪微博热搜之后,定时发送到指定邮箱,还不错,不会耗费太长时间,感恩的心~

写在前面

微博热搜对于很多练习爬虫编写的人来说,都是必爬数据之一,毕竟热搜是我们每天谈资的主要来源地,而且页面也比较规矩,数据量也不大,没那么多的反爬手段。50条数据,每天早上爬取一遍,发送到指定邮箱即可~

image.png

当看到源码是表格的时候,我差点把pandas又给拿过来,不过想想还是算了,我们换个稍微新鲜那么一点的东西吧。

本文涉及到三个模块,第一个requests模块,爬取模块;第二个BeautifulSoup模块,网页解析;第三个smtplib邮件传输协议模块,除此之外还有一个和smtplib配合的模块--email模块,主要用于格式化邮件内容。

编码时间

抓取微博热搜并解析数据

对于网页的获取与解析,实现起来非常简单。注意下面写爬虫的一些小技巧: headers里面设置referer,假装是从百度搜索进入

def get_html():
    headers = {
        "User-Agent": "寻找自己的UA",
        "Referer": "https://www.baidu.com"
    }
    
    res = requests.get("https://s.weibo.com/top/summary", headers=headers)
    return res.text

def analy_html():
    html = get_html()
    soup = BeautifulSoup(html, 'lxml')
    data = soup.find(name="tbody")
    items = data.find_all(name='tr')  # 过滤到全部数据
    send_msgs = []
    for item in items:
        top = item.find(attrs={"class": "td-01"}).text  # 排序
        if top == "":
            top = 0
        title_content = item.find(attrs={"class": "td-02"}).contents
        title = "" # 获取标题
        readers = ""
        if len(title_content) > 3:
            title = title_content[1].text
            readers = title_content[3].text
        else:
            title = title_content[1].text
            readers = "0"
        
        level = item.find(attrs={"class": "td-03"}).text  # 热度标签
        send_msgs.append ((top,title,readers,level))
    return send_msgs

Python邮件发送实现

Python实现邮件发送,使用的python3内置的smtplib模块即可,使用方法很多地方都有涉及了,这里不再赘述,直接看代码即可,代码中有详细的注释。 重点注意密码位置,我在开启163邮箱的SMTP时,单独提供了一个密码,这里要保留好密码。 代码编写前需要导入几个模块

from email.mime.text import MIMEText   # 定义邮件内容
from email.header import Header # 定义邮件标题
import time
def send_email():
 
    rq = time.strftime("%Y-%m-%d") # 发送时间
    from_addr ="发送ID@163.com" # 发送的邮箱
    smtpserver="smtp.163.com" # 发送邮箱SMTP服务器地址
    password="邮箱密码"# 密码,填写自己的密码即可,163邮箱和网页登录的邮箱不同
    # 接收邮箱的账号
    to_addr ="接收ID@qq.com"
    to_addrs=["接收ID@qq.com",from_addr]

    # 邮件的标题
    subject=f"{rq} 微博热搜"
    # 邮件html内容,需要把热搜的爬取到的数据进行格式化
    data = analy_html()
    table = "<table>"
    for item in data:
        table +=f"<tr><td>{item[0]}:{item[1]}:{item[2]}:{item[3]}</td></tr>"
    table+="</table>"
    content = table
    msg=MIMEText(content,'html','utf-8') # 邮件的正文
    msg['Subject']=Header(subject,'utf-8') # 邮件的标题
    msg['From']=from_addr # 邮件发送方
    msg['To']= to_addr # 邮件接收方,发送给一人
    # msg['To']=','.join(to_addrs)# 邮件接收方,发送给多人

    smtp=smtplib.SMTP_SSL(smtpserver,465)# SSL协议端口号要使用465
    smtp.helo(smtpserver)# helo向邮箱标识用户身份
    smtp.ehlo(smtpserver)# 服务器返回结果确认
    smtp.login(from_addr,password)# 登录邮箱服务器,输入自己的账号和密码
    print("热搜发送中...")
    # smtp.sendmail(user,to_addrs,msgroot.as_string())# 邮件发送多人
    smtp.sendmail(from_addr,to_addr,msg.as_string())# 发送给个人的邮件
    smtp.quit()
    print("发送完毕")

邮件发送发送成功

当控制台打印发送完毕,你就可以访问接收邮件的邮箱,查看是否邮件是否接收到,如下图所示。

Python爬虫入门教程 92-100 帮粉丝写Python爬虫之【新浪微博热榜爬虫+邮箱定时发送】

写在后面

等爬虫系列到达100篇之后,我把部分爬虫的源码搭建到服务器上,这样大家就可以直接订阅自取数据了,比如本篇博客输入你的邮箱之后,由我来给你每天发数据。

关于每日定时发送,该实现可以参照之前我写过的定时器代码,在你配置的服务器上设置一个定时任务即可。

广宣时间

如果你想跟博主建立亲密关系,可以关注 “梦想橡皮擦”,近距离接触一个逗趣的互联网高级网虫。 博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏。

【帮粉丝写爬虫】会成为这个系列的最后10篇内容,如果你有想要爬取的网站,在评论区告诉我吧