这里采用一个简单的网站,儿童睡前小故事:
http://www.tom61.com/ertongwenxue/shuiqiangushi/index.html
内容如下:
一、爬取小故事的标题及详情链接,作为数据来源
使用xpath抓取所有的小故事标题及详情链接:
代码如下:
这里只爬取一页数据作为参考
import json
import requests
from lxml import etree
from fake_useragent import UserAgent
def request_html(url,headers,article_list=[]):
response = requests.get(url,headers=headers).content.decode('utf-8')
tree = etree.HTML(response)
dd_list = tree.xpath('//div[@id="Mhead2_0"]//dd')
# print(len(dd_list))
for dd in dd_list:
# 标题
title = dd.xpath('./a/text()')[0]
print(title)
# 详情url
title_url = dd.xpath('./a/@href')[0]
href = 'http://www.tom61.com' + title_url
article_list.append(
dict(title=title,title_url=href)
)
# 列表转化为json字符串
list_json = json.dumps(article_list,ensure_ascii=False)
with open('story.json','w',encoding='utf-8')as fp:
fp.write(list_json)
# print(article_list)
# print(href)
if __name__ == '__main__':
url = 'http://www.tom61.com/ertongwenxue/shuiqiangushi/index.html'
ua = UserAgent()
headers = {
'User-Agent': ua.random
}
request_html(url,headers)
# for i in range(2,72):
# url = f'http://www.tom61.com/ertongwenxue/shuiqiangushi/index_{i}.html'
# request_html(url,headers)
`
二、读取json文件获取到小故事详情url,得到故事内容
读取json文件,转为python类型,利用随机模块挑选一个故事作为定时发送的内容,获取到故事详情url
with open('story.json', 'r', encoding='utf-8')as fp:
content = fp.read()
# json字符串转化为python类型
content = json.loads(content)
# 随机取出一个故事
story = random.choice(content)
print(story)
name = story['title']
url = story['title_url']
定义请求函数,访问故事详情,使用xpath获取故事内容
import json
import random
import requests
from lxml import etree
from fake_useragent import UserAgent
def request_html(url,headers):
response = requests.get(url, headers=headers).content.decode('utf-8')
tree = etree.HTML(response)
# 抓取故事内容
content_list = tree.xpath('//div[@class="t_news_txt"]/p')
try:
for p in content_list:
result = p.xpath('./text()')[0].replace('\n','')
# result = ''.join(result)
print(result)
# with open('gushi.txt','a',encoding='utf-8')as fp:
# fp.write(result+'\n')
except:
pass
if __name__ == '__main__':
with open('story.json', 'r', encoding='utf-8')as fp:
content = fp.read()
# json字符串转化为python类型
content = json.loads(content)
# 随机取出一个故事
story = random.choice(content)
print(story)
name = story['title']
url = story['title_url']
ua = UserAgent()
headers = {
'User-Agent': ua.random
}
request_html(url,headers)
三、使用邮件模块定义邮件发送函数,并将获取的故事内容传入函数中当做邮件发送的内容,之前获取的标题作为邮件主题
import json
import random
import requests
from lxml import etree
from fake_useragent import UserAgent
import smtplib
from email.mime.text import MIMEText
def request_html(url,headers):
response = requests.get(url, headers=headers).content.decode('utf-8')
tree = etree.HTML(response)
# 抓取故事内容
# content_list = tree.xpath('//div[@class="t_news_txt"]/p')
content_list = tree.xpath('//div[@class="t_news_txt"]//text()')
# try:
# for p in content_list:
# result = p.xpath('./text()')[0].replace('\n','')
# # result = ''.join(result)
# print(result)
# # with open('gushi.txt','a',encoding='utf-8')as fp:
# # fp.write(result+'\n')
# except:
# pass
content = '\n'.join(content_list)
return content
# 邮件发送
def send_mail(name,content):
# 发送方邮箱
msg_from = '9*******7@qq.com'
# 授权码
password = 'my*******lbdcg'
# 收件人邮箱
receiver = '1*********2@163.com'
# 邮件主题
subject = name
# 创建邮件发送内容对象
msg = MIMEText(content,'plain','utf-8')
msg['Subject'] = subject
msg['From'] = msg_from
msg['To'] = receiver
# 发送邮件
try:
# 创建邮件服务器
smtp = smtplib.SMTP()
smtp.connect('smtp.qq.com')
smtp.login(msg_from,password)
smtp.sendmail(msg_from,msg['To'],msg.as_string())
print('发送成功')
except:
print('发送失败')
if __name__ == '__main__':
with open('story.json', 'r', encoding='utf-8')as fp:
content = fp.read()
# json字符串转化为python类型
content = json.loads(content)
# 随机取出一个故事
story = random.choice(content)
print(story)
name = story['title']
url = story['title_url']
ua = UserAgent()
headers = {
'User-Agent': ua.random
}
# 获取到随机的小故事内容
contents = request_html(url,headers)
# 发送邮件
send_mail(name,contents)
运行该脚本,测试邮件是否可以发送成功(前提必须开始邮件服务器,并获取到授权码)
四、将脚本在windows下设置为定时任务
现在将脚本在cmd下运行,测试是否成功,成功后再添加到windows定时任务中:(尽量还是将路径等改为英文路径)
实现定时发送功能:
在windows的环境中,在cmd中输入compmgmt.msc,将该脚本文件加入任务计划程序库,设置运行时间和频率
1、创建基本任务
2、创建定时任务名称
3、任务开始时间
更改脚本触发间隔:
至此,邮件定时发送儿童小故事就设置完成!