最近,某可爱要求我忙完之后给她每晚睡前讲讲小故事,我想了下,网络上应该有各种资源,小故事也都能搜得到,但是数量比较少,而且格式不够统一,提取比较困难。转念一想,面向儿童的睡前故事可能也比较适用,于是我准备从儿童睡前故事中取材,搜索之后发现有一个适合提取睡前故事的网址:
http://www.tom61.com/ertongwenxue/shuiqiangushi/
一共有700则小故事,嗯,一天一则数量可以满足,html格式也比较统一,就决定是它了!
查看网页源代码,ctrl+F输入查询关键字幸福王国,定位到相关信息:
发现其故事链接包含在dl标签中的a标签中的href属性,
/ertongwenxue/shuiqiangushi/2018-02-25/106432.html,点击后得到完整网址
http://www.tom61.com/ertongwenxue/shuiqiangushi/2018-02-25/106432.html,接下来要做的就是提取出该链接:
模拟浏览器访问网页,利用requests库请求访问
代码实现:
-
def getHTMLText(url,headers):
-
try:
-
r=requests.get(url,headers=headers,timeout=
30)
-
r.raise_for_status()
-
r.encoding=r.apparent_encoding
-
#print(r.text)
-
return r.text
-
-
except:
-
return
"爬取失败"
简单地使用BeautifulSoup库,解析html页面
找到dl标签的内容后在查找a标签中的内容,将提取的链接与原网页头进行拼接:
-
def parsehtml(namelist,urllist,html):
-
url=
'http://www.tom61.com/'
-
soup=BeautifulSoup(html,
'html.parser')
-
t=soup.find(
'dl',attrs={
'class':
'txt_box'})
-
#print(t)
-
i=t.find_all(
'a')
-
#print(i)
-
for link
in i:
-
urllist.append(url+link.get(
'href'))
-
namelist.append(link.get(
'title'))
得到所有网页链接地址之后,访问该网页
查看网页源代码
重新对该网页进行页面解析,提取出所有p标签中的内容
由于下面需要使用str类型的字符串,因此用.join方法将text列表用换行符进行分割
-
def parsehtml2(html):
-
text=[]
-
soup=BeautifulSoup(html,
'html.parser')
-
t=soup.find(
'div',class_=
't_news_txt')
-
for i
in t.findAll(
'p'):
-
text.append(i.text)
-
#print(text)
-
return
"\n".join(text)
将爬取的小故事发送到邮箱
-
def sendemail(url,headers):
-
-
msg_from=
'870407139@qq.com'
#发送方邮箱
-
passwd=
''
#填入发送方邮箱的授权码
-
receivers=[
' , ']
#收件人邮箱
-
-
subject=
'今日份的睡前小故事'
#主题
-
html=getHTMLText(url,headers)
-
content=parsehtml2(html)
#正文
-
msg = MIMEText(content)
-
msg[
'Subject'] = subject
-
msg[
'From'] = msg_from
-
msg[
'To'] =
','.join(receivers)
-
try:
-
s=smtplib.SMTP_SSL(
"smtp.qq.com",
465)
#邮件服务器及端口号
-
s.login(msg_from, passwd)
-
s.sendmail(msg_from, msg[
'To'].split(
','), msg.as_string())
-
print(
"发送成功")
-
except:
-
print(
"发送失败")
-
finally:
-
s.quit()
简单地利用smtp协议通过QQmail发送邮件给目标邮箱,端口号为465,正文内容为爬取的小故事
实现定时发送功能
在windows的环境中,在cmd中输入compmgmt.msc,将该脚本文件加入任务计划程序库,设置运行时间和频率
这样就能实现每晚九点定时发送睡前小故事啦!
完整代码戳:https://github.com/librauee/