起意
刚在简书写了第一篇文章,认真构思整理的文章总是希望能让更多的人看见,所以分外关注文章的阅读量评论量等等。刚好最近学了点爬虫,就想写个程序能定时发邮件跟我报告我的文章各个数据情况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邮箱 ,如下操作
网友评论