结合之前学到的网络爬虫和发送电子邮件的知识,实现一个功能服务。本文用python代码实现,从某新闻网站爬取一个头条新闻,提取标题和url链接,然后把这些信息整合发送到指定邮箱上。
from crawl_info import get_info
from send_mail import send_mail
if __name__ == '__main__': #服务程序的入口
crawl_url = "https://news.sina.com.cn/" # 新浪网首页
content = get_info(crawl_url) #爬取信息
send_mail(content) #发送短信
#封装网络获取的信息
import requests
from bs4 import BeautifulSoup
import re
#解决网页编码问题
def getUrlCoding(data):
charset = 'utf-8'
if data.encoding.lower() == 'utf-8' or data.encoding == 'utf8':
return 'utf-8'
if data.encoding.lower() == 'gb2312':
return 'gb2312'
if data.encoding.lower() == 'gbk':
return 'gbk'
if data.encoding.lower() == 'gb18030':
return 'GB18030'
m = re.compile('<meta .*(http-equiv="?Content-Type"?.*)?charset="?([a-zA-Z0-9_-]+)"?', re.I).search(data.text)
if m and m.lastindex == 2:
charset = m.group(2).lower()
return charset
#获取网页的详细信息
#返回带有新闻地址和新闻标题的字符串
def get_info(url):
response = requests.get(url)
if response.status_code == 200:
response.encoding = getUrlCoding(response)
soup = BeautifulSoup(response.text, 'lxml')
big_news = soup.select('#syncad_1 > h1:nth-child(1) > a')[0].get_text() #标题内容
url = soup.select('#syncad_1 > h1:nth-child(1) > a')[0].get('href') #获取url
return "新闻标题:"+big_news+"\n新闻地址:"+url
#发送邮件到指定的邮箱
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def send_mail(text):
#配置信息以环境变量的形式保存
user_mail = '你本人的邮箱地址'
password = '你的邮箱密码'
send_mail = '收件人的邮箱地址'
smtp_server = '你所在邮箱的smtp服务器地址'
#填写邮件的正文、发件人信息、收件人信息、主题...
msg = MIMEText(text, 'plain', 'utf-8')
msg['From'] = _format_addr('XX 大新闻 <%s>' % user_mail)
msg['To'] = _format_addr('收件人 <%s>' % send_mail)
msg['Subject'] = Header('xx新闻提醒', 'utf-8').encode()
#发出邮件要执行的动作
server = smtplib.SMTP(smtp_server, 25) #执行邮局服务器的25端口
server.set_debuglevel(1) #
server.login(user_mail, password) #登录服务器
server.sendmail(user_mail, [send_mail], msg.as_string()) #发送信件到指定的地址
server.quit() #结束服务