看题目 ,需要实现三部分工作,第一部分为爬取网页小故事,第二部分为发送至指定邮箱,第三部分为定时启动程序。爬取网页内容可以使用BeautifulSoup库实现,发送邮件可以使用smtplib库实现,定时启动程序可以在Windows下设置任务计划程序实现。因此,本文主要包含了以下三部分内容:

文章目录

  • 一、爬取网页故事
    • 1. 思路分析
    • 2. 示例代码
  • 二、Python发送邮件
  • 三、Windows设置任务计划程序
  • 四、完整代码
  • 本文参考

一、爬取网页故事


1. 思路分析

爬取网页内容的思路一般是这样的:

  1. 规定一个或多个入口url
  2. 获取所有内容所在页面的url
  3. 请求目标页面url得到数据,解析数据得到文本内容

例如我们要爬取贝瓦故事http://story.beva.com/网站中的睡前所有睡前故事。通过分析我们知道了它的睡前故事列表所在的页面url结构都类似于http://story.beva.com/99/category/shui-qian/1了,随着页码的增加最后的数字也发生变化。那么我们可以使用一个循环遍历它的页码范围,构造出所有的故事列表所在页面的url,组成一个url列表,这些url列表也就是入口url



接着,我们请求每个入口url,解析该页面上故事列表的url,得到了每一则故事对应的url。打开开发者工具,通过分析网页结构我们了解到每一个故事页面的urlclasssll2span标签下的a标签的href属性中,而且从这个a标签title属性中我们还可以得到故事名称。

注意,a标签的href属性中内容并不是故事网页的完整url,点击进入故事页面我们可以发现故事页面的完整url应该是http://story.beva.com + a标签href内容。根据这个规律,我们先获取所有符合条件a标签的href,并且在href之前加上http://story.beva.com构成完整的故事页面url列表。



最后,我们就可以请求故事页面url,并且解析其中的内容啦。分析网页结构可以发现,故事正文内容在classstcontentdiv标签中,我们可以借助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模块是pythonsmtp(简单邮件传输协议)的客户端实现。我们可以使用smtplib模块,轻松的发送电子邮件。有关smtplib模块的介绍,可以参考http://www.cnblogs.com/babykick/archive/2011/03/28/1997587.html

smtplib发送邮件的过程比较简单:

  1. 连接邮件服务器
  2. 使用邮箱地址和授权码登录邮件服务器
  3. 构造邮件主题、正文等内容,发送邮件
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.exepythonw.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

【爬虫】每天定时爬取网页小故事并发送至指定邮箱相关推荐

  1. 如何使用PHP开发爬虫功能去爬取网页资讯

    如何使用PHP开发爬虫功能去爬取网页资讯 一.网页数据分析 A ) 爬取目标: 比如我们现在需要爬取网页https://brands.cnblogs.com/ 中资讯列表数据. 那我们现在应该怎么分析 ...

  2. Python爬虫:Xpath爬取网页信息(附代码)

    Python爬虫:Xpath爬取网页信息(附代码) 上一次分享了使用Python简单爬取网页信息的方法.但是仅仅对于单一网页的信息爬取一般无法满足我们的数据需求.对于一般的数据需求,我们通常需要从一个 ...

  3. 爬虫系列-jsoup爬取网页你需要了解的一切

    爬虫系列-jsoup爬取网页 概述 解析和遍历文档 文档的对象模型 加载HTML数据 从String解析文档 从String中加载解析片段 从URL加载文档 描述 从文件加载文档 描述 提取数据 使用 ...

  4. b站视频详情数据抓取,自动打包并发送到指定邮箱(单个或者群发)

    BiLiBiLi Time: 2020年11月6日19:44:58 Author: Yblackd BiLiBiLi BiLiBiLi 介绍 软件架构 安装教程 使用说明 源码下载 BiLiBiLi ...

  5. 网络爬虫学习2 - 爬取网页的通用代码框架、HTTP协议、Requests库的各种方法

    网络爬虫MOOC学习打卡 - 第二天 文章目录 网络爬虫MOOC学习打卡 - 第二天 一.爬取网页的通用代码框架 1.理解requests库的异常 2.Respones类提供了一个方法 -- r.ra ...

  6. python爬虫短片_Python爬虫练习:爬取全民小视频(附代码,过程)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本次目标 爬取全民小视频 https://quanmin.baidu.com ...

  7. Python实训day04am【爬虫介绍、爬取网页测试、Python第三方库】

    Python实训-15天-博客汇总表 目录 1.文本文件编程题 2.爬虫(Scrapy) 2.1.安装第三方库 2.2.爬取网页测试 2.2.1.样例1 2.2.2.样例2 3.PyCharm导入第三 ...

  8. python 爬小视频_Python爬虫练习:爬取全民小视频(附代码,过程)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本次目标 爬取全民小视频 https://quanmin.baidu.com ...

  9. (第一个java爬虫)java爬取网页文本并抽取中英文关键词

    问题引入 对于给定的任意一个网址,爬取这个网页上的所有文本信息,并抽取出文本的中文和英文关键词 搭建环境 首先需要具备eclipse开发环境.然后导入jsoup包,用来爬取网页,再到这个网址http: ...

最新文章

  1. petshop4.0 具体解释之中的一个(系统架构设计)
  2. float元素一定要闭合
  3. LeetCode Shell 194. 转置文件
  4. python基础一 day6 文件操作
  5. asp.net cookie操作-添加cookie,添加键值,移除cookie,移除键值
  6. 第1篇:Flowable简介
  7. 面试官系统精讲Java源码及大厂真题 - 47 工作实战:Socket 结合线程池的使用
  8. 生活在别处——“Samsung Cloud Print”云打印体验
  9. 情绪管理--不要总做“好脾气”的人。
  10. android三国2,三国演义安卓单机版
  11. C++11之final详解
  12. 下一跳配置的原则--ensp
  13. navicat导数据速度_快速解决mysql导数据时,格式不对、导入慢、丢数据的问题
  14. cv/nlp哪些小方向好发论文?
  15. 制作室内效果图必不可少的因素有哪些?
  16. 《联邦学习实战》杨强 读书笔记十七——联邦学习加速方法
  17. 前端开发面试问题及答案收录
  18. Elasticsearch-Sql+Mybatis+SpringBoot集成
  19. 搭建DNF台服之配置客户端
  20. 20180716 [AtCoder]CF697 EASY+SoundHound HARD【值得琢磨实现细节】

热门文章

  1. Android端2016年9月系统使用以及兼容测试
  2. 华为matepad鸿蒙系统,预装鸿蒙系统 华为MatePad Pro 2界面曝光
  3. 画出含有四个节点的所有二叉树形态
  4. 如何评估社交网络中信息内容的价值呢?
  5. ucsd大学音乐计算机,音乐留学│综合名校UCSD音乐制作专业详解!
  6. 怎么快速搜索linux的日志,如何快速查看Linux日志?
  7. 汉字转拼音函数 linux,oracle 汉字转拼音
  8. torch当中的MseLoss的reduction参数
  9. Fluent飞行器动导数计算方法
  10. linux(ubuntu)查看硬件设备命令