用python3爬虫抓新闻,并推送至邮箱

爬取每天要看的新闻

我每天都会在21财经的app里面去看当天的晨报精选,但是,这个晨报精选在app里里面藏的比较深,每次得点好几下才能到达。是的,我忍受不了了,所以决定自己写一个爬虫。先看一下我们要爬取的入口页面 http://www.21jingji.com/channel/investment/morningnews/每天的早新闻大概是在7点前会发布

爬虫要实现的功能:

1. 爬取当天的新闻链接,新闻标题,新闻内容
2. 将爬取的信息发送到我的邮箱
另外再将脚本放在linux服务器上,每天定时早上7点执行。 这样我的邮箱里每天都会收到当天的新闻。邮箱收到的新闻效果如下。 我可以直接在邮箱里看,或者点击链接查看。

直接上代码,里面注释已经很详细了。

import re
import urllib.request
import time
from mail_wangyi import send_email

"""爬取当天21财经早新闻,发送到我的邮箱。 """


def get_news():
    # 抓取整个页面内容
    web_url = 'http://www.21jingji.com/channel/investment/morningnews/'
    response = urllib.request.urlopen(web_url)      # 返回的可能是string,也可能是bytes或者file,所以要注意区分情况
    html = response.read().decode()             # decode默认参数是utf-8 相当于decode('utf-8'),这样将bytes类型转换诚列string

    # 从页面内容中抓取我们需要的新闻链接和标题
    pattern = re.compile(r'<div class="Tlist">.*?<a href="(.*?)" class="listTit" title="(.*?)" target="_blank" >', re.S)
    data = re.search(pattern, html)             # 这里的html需要的是一个string,而不能是bytes,所以上面需要做decode转换
    news_link = data.group(1)
    news_title = data.group(2)

    # 注意到新闻标题都是以X日早新闻开头
    # 抓取标题中日期的数字(1, 2, 3 ...31),以便后面和今天的日期进行对比
    date_match_patten = re.compile(r'(\d\d?)日')
    news_date = re.match(date_match_patten, news_title).group(1)
    return news_link, news_title, news_date

def get_news_body(url):
    """根据爬到的新闻链接,抓取具体新闻内容"""
    response = urllib.request.urlopen(url)
    html = response.read().decode()
    pattern = re.compile(r'(<div class="txtContent".*?) <!--文章打赏-->', re.S)
    data = re.search(pattern, html)
    return data.group(1)


# 判断是今天的新闻,则将新闻标题,链接,内容都发送到邮箱,否则等半小时再取一次
# 因为程序执行的时候,新闻可能还没更新,那么等待半小时再取一次
for i in range(1, 5):
    news_link, news_title, news_date = get_news()
    # 提取今天的日期,不要前导0
    today = int(time.strftime("%d"))  # 用int的方式去掉日期前面的前导0, 比如将05变成5
    today = str(today)

    if news_date == today:
        send_email(news_link + get_news_body(news_link), ["165584943@qq.com", ], news_title)
        print(time.strftime("%b %d %Y %H:%M:%S") + " Email send successfully")
        break
    else:
        now = time.strftime("%b %d %Y %H:%M:%S")
        print(now + " No news updated yet")  # 每周六没有新闻
        i += 1
        time.sleep(1800)

发邮件模块的代码如下, 邮箱配置部分改成你们自己的邮箱

import smtplib
from email.mime.text import MIMEText
mail_host = 'smtp.163.com'
mail_port = 25
mail_user = 'somemail@163.com'
mail_pwd = 'yourpass'

def send_email(mail_content, receiver_list, mail_title):
msg=MIMEText(mail_content, _subtype='html', _charset='utf-8')
msg['From'] = mail_user
msg['Subject'] = mail_title
msg['To'] = ",".join(receiver_list)
try:
s = smtplib.SMTP(mail_host, mail_port)
s.set_debuglevel(1)
s.starttls()
s.ehlo()
s.login(mail_user, mail_pwd)
s.sendmail(mail_user, receiver_list, msg.as_string())
s.quit()
except Exception as e:
print('Wan Exception:', e)

转载请注明出处:狂踩三百公里的blog » 用python3爬虫抓新闻,并推送至邮箱

赞 (2) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏