爬虫:定时发邮件报告简书文章数据(新手向)

2020-02-27  本文已影响0人  netiii

起意

刚在简书写了第一篇文章,认真构思整理的文章总是希望能让更多的人看见,所以分外关注文章的阅读量评论量等等。刚好最近学了点爬虫,就想写个程序能定时发邮件跟我报告我的文章各个数据情况0 v 0 ,好 !开干!

tips:本文适合有点爬虫/python基础的新手!如果有地方不理解可以评论告诉我,我会进一步改进的,感谢!

一、前期准备

0、安装好python并配置好环境

1、需要安装库:

1)requests 2) beautifulsoup4 3) schedule 4) smtplib 5) email

2、如何安装库:

1)pycharm:文件->设置->project interpreter ->点击'+' ->输入想下载的库名下载即可

2)打开cmd->输入:python -m pip install 想下载的库名

二、爬虫分析

我们爬虫往往分为四个步骤,a、获取数据 b、解析数据 c、提取数据 d、存储数据。获取数据是指获取到包含我们想要数据的源代码,解析数据是将源代码解析成我们可以提取的对象,提取数据就是从对象中提取出我们想要的数据,最后存储这个数据。

下面我们的爬虫也按照这个思路展开。

A、获取数据

首先要确定我们想要数据在哪可以获取,以我的文章为例,我的个人主页是https://www.jianshu.com/u/1740a3278d36。可以看到,在个人主页上,就有文章的浏览量、评论量、喜欢的数据。

image

接下来要判断的是,想要的数据是否包含第一个请求源代码中。网页的加载是由多个请求依次加载构建成我们最后看到的完整网页。当我们用requests.get()获取网页源代码时,其实得到的只是第一个请求的源代码。故这里需要使用network来判断爬取数据是否包含在第一个请求中。

(1)打开network(右键->检查->点击network)

image

(2)点击刷新,在doc中寻找第一个请求

image

(3)确定第一个请求是否包含数据

image

以上我们确定了爬取数据就在第一个请求中,代码如下:


headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}

url = 'https://www.jianshu.com/u/1740a3278d36'

res = requests.get(url,headers=headers)  

B、解析、提取数据

(1)解析数据
解析数据是将源代码转换成可以提取数据的对象的过程,这里可以用BeatufulSoup来完成,将源代码的字符串转换为可以bs对象。

bs = BeautifulSoup(res.text,'html.parser')

解析完成后,这里的bs就是可以提取数据的bs对象了

(2)提取数据
在bs对象中寻找想要的数据得先用find()和find_all()来提取标签,find是返回符合括号条件的第一个标签,find_all()是返回符合括号条件的所有标签。
如find(‘div’,class_='note_list'),括号内条件为:是div标签,且类名为‘note_list’。这样就可以提取到我们想要的标签。

所有的文章列表包含在ul class=‘note-list’标签中,一篇文章在一个li标签中,用for循环可以提取出每篇文章。

找到文章

文章名在li中的a class='title'标签中div class=‘meta’中包含浏览,评论,喜欢数值,第一个a是浏览量,第二个a是评论,第二个span是喜欢

提取各个标签的完整代码如下:

    article_list = '' #存储数据
    list_ul = bs.find('ul',class_='note-list') #这个标签包含了所有文章内容
    list = list_ul.find_all('li') #提取出每篇文章
    for l in list: #对于每篇文章提取所要数据
        title = l.find('a',class_='title').text #文章标题
        meta = l.find('div',class_='meta') #meta标签包含了浏览、评论、喜欢,是它们共同的父标签
        a = meta.find_all('a') #找到其中两个a标签,第一个a就是浏览,第二个就是评论
        view = a[0].text[2:-1]  #.text即只保留下该标签的文本
        comment = a[1].text[2:-1]
        span = meta.find_all('span')
        like = span[1].text[1:]
        article_list = article_list + title + '浏览量:' + view + '评论量:' + comment + '喜欢:' + like + '\n'

C、存储数据

目前程序不需要把数据存储到本地,故此步只是简单把数据存储到article_list字符串中。

三、代码模块

1、爬虫获得文章数据

def getData():
    # ——————————第一步————————————————————
    #获取数据
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    }
    url = 'https://www.jianshu.com/u/1740a3278d36'
    res = requests.get(url,headers=headers)
    #解析数据
    bs = BeautifulSoup(res.text,'html.parser')

    #———————————第二、三步:提取数据—————————————————————
    article_list = ''
    list_ul = bs.find('ul',class_='note-list')
    list = list_ul.find_all('li')
    for l in list:
        title = l.find('a',class_='title').text
        meta = l.find('div',class_='meta')
        a = meta.find_all('a')
        view = a[0].text[2:-1]
        comment = a[1].text[2:-1]
        span = meta.find_all('span')
        like = span[1].text[1:]
        article_list = article_list + title + '浏览量:' + view + '评论量:' + comment + '喜欢:' + like + '\n'
    return article_list

2、发邮件

def send_email(article_list):
    mailhost='smtp.qq.com'
    qqmail = smtplib.SMTP()
    qqmail.connect(mailhost,25)
    qqmail.login(account,password)
    content= article_list
    message = MIMEText(content, 'plain', 'utf-8')
    subject = '简书文章浏览报告'
    message['Subject'] = Header(subject, 'utf-8')
    try:
        qqmail.sendmail(account, receiver, message.as_string())
        print ('邮件发送成功')
    except:
        print ('邮件发送失败')
    qqmail.quit()

3、定时执行

每天晚上7点执行job函数

def job():
    article_list= getData()
    send_email(article_list)

schedule.every().day.at('19:00').do(job)   #每天晚上7点执行job函数

4、引用模块及主函数

import requests
from bs4 import BeautifulSoup
import schedule
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
if __name__ == '__main__':

    account = input('请输入你的邮箱:')
    password = input('请输入你的密码:')
    receiver = input('请输入收件人的邮箱:')
    while True:
        schedule.run_pending()
        time.sleep(1)

注意:主函数中我们需要输入我们发送邮件的账号和密码,这里的密码并非我们邮箱登陆密码,找到这个密码还需要一点操作(另外:邮箱设置的是qq邮箱)

登陆qq邮箱 ,如下操作

开启服务
上一篇 下一篇

猜你喜欢

热点阅读