【爬虫】每天定时爬取网页小故事并发送至指定邮箱
看题目 ,需要实现三部分工作,第一部分为爬取网页小故事,第二部分为发送至指定邮箱,第三部分为定时启动程序。爬取网页内容可以使用BeautifulSoup
库实现,发送邮件可以使用smtplib
库实现,定时启动程序可以在Windows
下设置任务计划程序实现。因此,本文主要包含了以下三部分内容:
文章目录
- 一、爬取网页故事
- 1. 思路分析
- 2. 示例代码
- 二、Python发送邮件
- 三、Windows设置任务计划程序
- 四、完整代码
- 本文参考
一、爬取网页故事
1. 思路分析
爬取网页内容的思路一般是这样的:
- 规定一个或多个入口url
- 获取所有内容所在页面的url
- 请求目标页面url得到数据,解析数据得到文本内容
例如我们要爬取贝瓦故事http://story.beva.com/
网站中的睡前所有睡前故事。通过分析我们知道了它的睡前故事列表所在的页面url结构都类似于http://story.beva.com/99/category/shui-qian/1
了,随着页码的增加最后的数字也发生变化。那么我们可以使用一个循环遍历它的页码范围,构造出所有的故事列表所在页面的url
,组成一个url
列表,这些url
列表也就是入口url
。
接着,我们请求每个入口url
,解析该页面上故事列表的url
,得到了每一则故事对应的url
。打开开发者工具,通过分析网页结构我们了解到每一个故事页面的url
在class
为sll2
的span
标签下的a
标签的href
属性中,而且从这个a
标签title
属性中我们还可以得到故事名称。
注意,a标签的href属性中内容并不是故事网页的完整url,点击进入故事页面我们可以发现故事页面的完整url应该是http://story.beva.com + a标签href内容
。根据这个规律,我们先获取所有符合条件a
标签的href
,并且在href之前加上http://story.beva.com
构成完整的故事页面url
列表。
最后,我们就可以请求故事页面url
,并且解析其中的内容啦。分析网页结构可以发现,故事正文内容在class
为stcontent
的div
标签中,我们可以借助BeautifulSoup
来解析文本内容。
2. 示例代码
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupdef getHtmlText(url, headers):"""请求url,返回HTML文本:param url: 页面url:return html: 页面HTML"""try:res = requests.get(url, headers = headers, timeout = 30) # headers伪造请求头,模拟浏览器,防止和谐res.raise_for_status() # 返回4XX、5XX时抛出异常res.encoding = res.apparent_encoding # 设置该html文档可能的编码return res.text # 返回网页HTML代码except:return "获取失败"def parseHtml(html, story_url_list, story_title_list):"""解析HTML文本,得到故事链接和故事名字列表:param html: 故事列表页面html"""base_url = 'http://story.beva.com'soup = BeautifulSoup(html, 'html.parser')spans = soup.find('span', attrs = {'class': 'sll2'}for span in spans:story_url = base_url + span.a.get('href')story_url_list.append(story_url)story_title_list.append(span.a.get('title'))def parseHtml2(html):"""解析故事页面HTMl文本,得到故事正文:param html: 故事页面html"""story_content = []soup = BeautifulSoup(html, 'html.parser')div = soup.find('div', class_ = 'stcontent')for p in div.findAll('p'):story_content.append(p.text)#print(story_content)return "\n".join(story_content)if __name__ == '__main__':headers = {'User-Agent':'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',}story_url_list = [] # 保存所有故事urlstory_title_list = [] # 保存所有故事titlefor i in range(22):story_list_url = 'http://story.beva.com/99/category/shui-qian/' + str(i + 1)print('正在爬取第%s页的故事链接:'%(i+1))print(story_list_url)html = getHtmlText(story_list_url, headers) # 请求故事列表页面urlparseHtml(html, story_url_list, story_title_list) # 得到故事页面的urlprint("爬取链接完成")'''for url in story_url_list:html = getHtmlText(url, headers) # 请求故事页面urlparseHtml2(html) # 得到故事正文'''
二、Python发送邮件
smtplib
模块是python
中smtp
(简单邮件传输协议)的客户端实现。我们可以使用smtplib
模块,轻松的发送电子邮件。有关smtplib
模块的介绍,可以参考http://www.cnblogs.com/babykick/archive/2011/03/28/1997587.html
。
smtplib发送邮件的过程比较简单:
- 连接邮件服务器
- 使用邮箱地址和授权码登录邮件服务器
- 构造邮件主题、正文等内容,发送邮件
from email.mime.text import MIMETextdef sendEmail(url, headers):msg_from = 'xxxxxxxx@foxmail.com' # 发送方邮箱pwd = 'xxxxxxxxxxxxxxxx' # 填入发送方邮箱的授权码receivers = ['xxxxxxxx@qq.com'] # 收件人邮箱subject = '今日份的睡前小故事' # 主题 html = getHTMLText(url, headers)content = parseHtml2(html) # 正文msg = MIMEText(content)msg['Subject'] = subjectmsg['From'] = msg_frommsg['To'] = ','.join(receivers)try:smtp=smtplib.SMTP_SSL("smtp.qq.com",465) # QQ邮箱邮件服务器及端口号smtp.login(msg_from, pwd)smtp.sendmail(msg_from, msg['To'].split(','), msg.as_string())print("发送成功")except:print("发送失败")finally:smtp.quit()
三、Windows设置任务计划程序
任务计划程序指的是那些在特定时刻,如开关机、每周或者每天特定时间执行的程序。在Windows10
系统中,可以通过右键单击此电脑,点击管理
进入设置任务计算程序。
1.右键单击任务计划程序库
,选择创建基本任务
。
2.在弹出的对话框中,先输入这个任务的名称和描述。
3.选择执行的频率,这里默认选择每天。
4.设置每天具体的执行时间点。
5.选择操作类型,这里选择启动程序。在命令行环境下,我们通常使用python filename.py
来执行一个python脚本,同样的,我们需要在启动程序对话框中设置类似的格式来启动我们的python脚本。程序或脚本输入框填写的是你机器上python
可执行文件所在的路径,python.exe
和pythonw.exe
的区别在于一个有对话框,一个是静默执行。添加参数输入框则为脚本文件所在路径。
这里需要注意一点,如果你机器上有多个python
环境时,你得先确认默认使用的是哪个python
环境,并将其可执行文件填入下图中的程序或脚本,否则没有效果。
接着就大公告成啦!!!
四、完整代码
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import smtplib
from email.mime.text import MIMEText
import random# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupdef getHtmlText(url, headers):"""请求url,返回HTML文本:param url: 页面url:return html: 页面HTML"""try:res = requests.get(url, headers = headers, timeout = 30) # headers伪造请求头,模拟浏览器,防止和谐res.raise_for_status() # 返回4XX、5XX时抛出异常res.encoding = res.apparent_encoding # 设置该html文档可能的编码return res.text # 返回网页HTML代码except:return "获取失败"def parseHtml(html, story_url_list, story_title_list):"""解析HTML文本,得到故事链接和故事名字列表:param html: 故事列表页面html"""base_url = 'http://story.beva.com'soup = BeautifulSoup(html, 'html.parser')spans = soup.find('span', attrs = {'class': 'sll2'}for span in spans:story_url = base_url + span.a.get('href')story_url_list.append(story_url)story_title_list.append(span.a.get('title'))def parseHtml2(html):"""解析故事页面HTMl文本,得到故事正文:param html: 故事页面html"""story_content = []soup = BeautifulSoup(html, 'html.parser')div = soup.find('div', class_ = 'stcontent')for p in div.findAll('p'):story_content.append(p.text)#print(story_content)return "\n".join(story_content)def sendEmail(url, headers):"""将故事正文发送右键"""msg_from = 'xxxxxxxx@foxmail.com' # 发送方邮箱pwd = 'xxxxxxxxxxxxxxxx' # 填入发送方邮箱的授权码receivers = ['xxxxxxxx@qq.com'] # 收件人邮箱subject = '今日份的睡前小故事' # 主题 html = getHTMLText(url, headers)content = parseHtml2(html) # 正文msg = MIMEText(content)msg['Subject'] = subjectmsg['From'] = msg_frommsg['To'] = ','.join(receivers)try:smtp=smtplib.SMTP_SSL("smtp.qq.com",465) # QQ邮箱邮件服务器及端口号smtp.login(msg_from, pwd)smtp.sendmail(msg_from, msg['To'].split(','), msg.as_string())print("发送成功")except:print("发送失败")finally:smtp.quit()def main()headers = {'User-Agent':'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',}story_url_list = [] # 保存所有故事urlstory_title_list = [] # 保存所有故事titlefor i in range(22):story_list_url = 'http://story.beva.com/99/category/shui-qian/' + str(i + 1)print('正在爬取第%s页的故事链接:'%(i+1))print(story_list_url)html = getHtmlText(story_list_url, headers) # 请求故事列表页面urlparseHtml(html, story_url_list, story_title_list) # 得到故事页面的urlprint("爬取链接完成")'''for url in story_url_list:html = getHtmlText(url, headers) # 请求故事页面urlparseHtml2(html) # 得到故事正文'''sendemail(random.choice(urllist),headers)if __name__ == '__main__':main()
本文参考
[1] https://blog.csdn.net/lyc44813418/article/details/88583021
【爬虫】每天定时爬取网页小故事并发送至指定邮箱相关推荐
- 如何使用PHP开发爬虫功能去爬取网页资讯
如何使用PHP开发爬虫功能去爬取网页资讯 一.网页数据分析 A ) 爬取目标: 比如我们现在需要爬取网页https://brands.cnblogs.com/ 中资讯列表数据. 那我们现在应该怎么分析 ...
- Python爬虫:Xpath爬取网页信息(附代码)
Python爬虫:Xpath爬取网页信息(附代码) 上一次分享了使用Python简单爬取网页信息的方法.但是仅仅对于单一网页的信息爬取一般无法满足我们的数据需求.对于一般的数据需求,我们通常需要从一个 ...
- 爬虫系列-jsoup爬取网页你需要了解的一切
爬虫系列-jsoup爬取网页 概述 解析和遍历文档 文档的对象模型 加载HTML数据 从String解析文档 从String中加载解析片段 从URL加载文档 描述 从文件加载文档 描述 提取数据 使用 ...
- b站视频详情数据抓取,自动打包并发送到指定邮箱(单个或者群发)
BiLiBiLi Time: 2020年11月6日19:44:58 Author: Yblackd BiLiBiLi BiLiBiLi 介绍 软件架构 安装教程 使用说明 源码下载 BiLiBiLi ...
- 网络爬虫学习2 - 爬取网页的通用代码框架、HTTP协议、Requests库的各种方法
网络爬虫MOOC学习打卡 - 第二天 文章目录 网络爬虫MOOC学习打卡 - 第二天 一.爬取网页的通用代码框架 1.理解requests库的异常 2.Respones类提供了一个方法 -- r.ra ...
- python爬虫短片_Python爬虫练习:爬取全民小视频(附代码,过程)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本次目标 爬取全民小视频 https://quanmin.baidu.com ...
- Python实训day04am【爬虫介绍、爬取网页测试、Python第三方库】
Python实训-15天-博客汇总表 目录 1.文本文件编程题 2.爬虫(Scrapy) 2.1.安装第三方库 2.2.爬取网页测试 2.2.1.样例1 2.2.2.样例2 3.PyCharm导入第三 ...
- python 爬小视频_Python爬虫练习:爬取全民小视频(附代码,过程)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本次目标 爬取全民小视频 https://quanmin.baidu.com ...
- (第一个java爬虫)java爬取网页文本并抽取中英文关键词
问题引入 对于给定的任意一个网址,爬取这个网页上的所有文本信息,并抽取出文本的中文和英文关键词 搭建环境 首先需要具备eclipse开发环境.然后导入jsoup包,用来爬取网页,再到这个网址http: ...
最新文章
- petshop4.0 具体解释之中的一个(系统架构设计)
- float元素一定要闭合
- LeetCode Shell 194. 转置文件
- python基础一 day6 文件操作
- asp.net cookie操作-添加cookie,添加键值,移除cookie,移除键值
- 第1篇:Flowable简介
- 面试官系统精讲Java源码及大厂真题 - 47 工作实战:Socket 结合线程池的使用
- 生活在别处——“Samsung Cloud Print”云打印体验
- 情绪管理--不要总做“好脾气”的人。
- android三国2,三国演义安卓单机版
- C++11之final详解
- 下一跳配置的原则--ensp
- navicat导数据速度_快速解决mysql导数据时,格式不对、导入慢、丢数据的问题
- cv/nlp哪些小方向好发论文?
- 制作室内效果图必不可少的因素有哪些?
- 《联邦学习实战》杨强 读书笔记十七——联邦学习加速方法
- 前端开发面试问题及答案收录
- Elasticsearch-Sql+Mybatis+SpringBoot集成
- 搭建DNF台服之配置客户端
- 20180716 [AtCoder]CF697 EASY+SoundHound HARD【值得琢磨实现细节】
热门文章
- Android端2016年9月系统使用以及兼容测试
- 华为matepad鸿蒙系统,预装鸿蒙系统 华为MatePad Pro 2界面曝光
- 画出含有四个节点的所有二叉树形态
- 如何评估社交网络中信息内容的价值呢?
- ucsd大学音乐计算机,音乐留学│综合名校UCSD音乐制作专业详解!
- 怎么快速搜索linux的日志,如何快速查看Linux日志?
- 汉字转拼音函数 linux,oracle 汉字转拼音
- torch当中的MseLoss的reduction参数
- Fluent飞行器动导数计算方法
- linux(ubuntu)查看硬件设备命令