携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
梦想橡皮擦:接到一个新的小任务,爬取新浪微博热搜之后,定时发送到指定邮箱,还不错,不会耗费太长时间,感恩的心~
写在前面
微博热搜对于很多练习爬虫编写的人来说,都是必爬数据之一,毕竟热搜是我们每天谈资的主要来源地,而且页面也比较规矩,数据量也不大,没那么多的反爬手段。50条数据,每天早上爬取一遍,发送到指定邮箱即可~
当看到源码是表格的时候,我差点把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("发送完毕")
邮件发送发送成功
当控制台打印发送完毕,你就可以访问接收邮件的邮箱,查看是否邮件是否接收到,如下图所示。
写在后面
等爬虫系列到达100篇之后,我把部分爬虫的源码搭建到服务器上,这样大家就可以直接订阅自取数据了,比如本篇博客输入你的邮箱之后,由我来给你每天发数据。
关于每日定时发送,该实现可以参照之前我写过的定时器代码,在你配置的服务器上设置一个定时任务即可。
广宣时间
如果你想跟博主建立亲密关系,可以关注 “
梦想橡皮擦”,近距离接触一个逗趣的互联网高级网虫。 博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏。
【帮粉丝写爬虫】会成为这个系列的最后10篇内容,如果你有想要爬取的网站,在评论区告诉我吧