前言
学习Python爬虫也有段时间了,总想着搞点事做,但又不知道做啥。不知道什么时候突然就想到爬几个段子,然后加个定时发送(QQ邮箱),无聊时乐一乐,岂不快哉!(小白一枚,大佬请绕过!)
1. 库导入及介绍
工欲善其事,必先利其器!首先导入本次所需要的库或类,如下
"""
Python爬取糗事百科段子+定时实现QQ邮箱推送
"""
import requests
from pyquery import PyQuery as pq
from email.message import Message
import smtplib
from threading import Timer
这里导入的库(类)有:requests库,requests库是一个第三方强大的网页请求库,爬虫的小伙伴应该都不陌生;pyquery,也是一个第三方库,它的作用是将爬来的网页进行解析并提取需要的信息,当然像这样的库还有Xpath,Beautiful Soup;email库和smtplib库,一般一起使用,email初始化邮件的一些基本信息,smtplib实现连接和发送邮件;Timer类,timer中文名定时器,通过调用它可以实现定时任务的执行。
其中,第三方库都需要安装。上面的requests和pyquery都需要提前安装好,而其他三个是python自带的不需要安装,直接导入就行了
2. 获取网页源码
需要的库都导入了,接下来就是获取网页源码了,爬取的网址是:https://www.qiushibaike.com/text/
代码如下
def get_html():
#获取网页源码
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'cookie':'''_xsrf=2|793c6b4c|7dcbcb41525a269bc7497fee14c71df5|1595344183; __guid=157526588.3254422318539862000.1595344188923.262; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1595344189; gr_user_id=aa2e65e5-8ce5-488c-a6f6-7d2c21739617; ff2672c245bd193c6261e9ab2cd35865_gr_session_id=20c7152a-ee46-43ba-906a-a77a478d33df; _ga=GA1.2.751671251.1595344189; _gid=GA1.2.1094547349.1595344189; _qqq_uuid_="2|1:0|10:1595344184|10:_qqq_uuid_|56:Yjc0NTliMTI2YWIzYWMxOTcxYzZlZmRmZWNkMDU3NWU2ZmI2MTRhNg==|16783d46424ea29e24d2b1fe1b87c5262fec1c9cbc2292555e4571627de696c7"; ff2672c245bd193c6261e9ab2cd35865_gr_session_id_20c7152a-ee46-43ba-906a-a77a478d33df=true; grwng_uid=63b498f9-bb3f-4e85-a173-c1554639dc7c; __cur_art_index=4700; monitor_count=9; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1595344490'''
}
html = requests.get('https://www.qiushibaike.com/text/page/3/', headers=headers)
if html.status_code == 200:
print("网页获取成功...")
return html.text
else:
print("网页获取失败...")
html = get_html()
print(html)
值得一提的是这里必须添加User-Agent,它在这里的作用是伪造一个请求头里的User-Aagent,好让服务器响应(来自百度百科:User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计。)。
其次,这里要添加的还有cookie,它的作用是保持会话状态;有了User-Agent和cookie,这样就能获取到包含有热门话题信息的源码了,不然是无法获取有效源码的。
这里涉及了cookie和User-Agent的获取,详情可以参考这篇文章:
https://blog.csdn.net/qq_44690947/article/details/107469871
结果如下
3. 提取需要的信息
这个步骤主要是从爬下来的网页中提取段子的正文信息。首先来确定一下段子在源码的哪个标签里,如下
通过上图可以看到段子内容在class=’content‘的标签里,接下来直接用选择content,再调用text()就可以获取段子内容了,如下
def get_html_text():
#提前段子正文信息
html = get_html()
#初始化html
doc = pq(html)
#选择出段子所在的节点并使用items方法,使节点可遍历
content = doc('.content')
items = content.items()
#使用text()提前段子正文,并添加到列表count中
text = []
for item in items:
text.append(item.text())
return text
text = get_html_text()
print(text)
结果如下
4. 优化输出数据
这里主要对段子的输出格式进行优化,使其更具有可读性,如下
def deal_print_data():
#优化输出
text = get_html_text()
#给段子加上标号
data = []
for i in text:
index = text.index(i)
st = str(index+1) + ' ' + i
data.append(st)
#因为获取的有25个段子,这里取前15个
data = data[:16]
#在段子末尾加一些句子
data.append('\n\t\t----------看完了就早点睡觉吧,晚安喽!----------')
#因为下面需要使用str类型的字符串,因此用.join方法将text列表用换行符进行分割
finally_data = "\n".join(data)
return finally_data
data = deal_print_data()
print(data)
效果如下
5. 发送邮件
直接上代码
def send_email():
#发送邮件
data = deal_print_data()#data为要发送的信息
sender = '3512919120@qq.com'#发送者邮箱
password = '你的邮箱授权码'#授权码
receiver = '3512919120@qq.com'#接收者邮箱
#创建一个邮件对象
msg = Message()
# 邮件标题
msg['Subject'] = '睡前笑一笑,烦恼都去掉!'
# 邮件发送者
msg['From'] = sender
# 邮件接受者
msg['To'] = receiver
# 邮件正文
msg.set_payload(data,'utf-8')
try:
#smtp.xxx.com为邮箱服务类型,465是qq邮箱服务器的端口号
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
#登录
smtp.login(sender, password)
#发送
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
print("发送成功...")
except:
print("有bug噢!")
send_email()
这里涉及到qq邮箱授权码的获取,步骤如下
如果上面都没问题的话,会收到邮箱,内容如下
6. 实现定时发送
要实现定时推送其实很简单,如下
def run_task():
#定时发送
send_email()
#每隔3600秒后执run_tast()函数,即发生邮件
t = Timer(3600, run_task)
t.start()
rin_task()
其中时间间隔可以自己设置,我这里设置的是一个小时,即3600秒。运行程序后每隔一个小时就会收到一封主题为“睡前笑一笑,烦恼都去掉!”邮件。到此,我们就实现了段子爬取到定时发送的全部功能了。注意:程序运行期间不能关闭电脑!
看完后如果有哪里不理解,可以参考以下文章:
7. 源码
"""
Python爬取糗事百科段子+定时实现QQ邮箱推送
"""
import requests
from pyquery import PyQuery as pq
from email.message import Message
import smtplib
from threading import Timer
def get_html():
#获取网页源码
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'cookie':'''_xsrf=2|793c6b4c|7dcbcb41525a269bc7497fee14c71df5|1595344183; __guid=157526588.3254422318539862000.1595344188923.262; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1595344189; gr_user_id=aa2e65e5-8ce5-488c-a6f6-7d2c21739617; ff2672c245bd193c6261e9ab2cd35865_gr_session_id=20c7152a-ee46-43ba-906a-a77a478d33df; _ga=GA1.2.751671251.1595344189; _gid=GA1.2.1094547349.1595344189; _qqq_uuid_="2|1:0|10:1595344184|10:_qqq_uuid_|56:Yjc0NTliMTI2YWIzYWMxOTcxYzZlZmRmZWNkMDU3NWU2ZmI2MTRhNg==|16783d46424ea29e24d2b1fe1b87c5262fec1c9cbc2292555e4571627de696c7"; ff2672c245bd193c6261e9ab2cd35865_gr_session_id_20c7152a-ee46-43ba-906a-a77a478d33df=true; grwng_uid=63b498f9-bb3f-4e85-a173-c1554639dc7c; __cur_art_index=4700; monitor_count=9; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1595344490'''
}
html = requests.get('https://www.qiushibaike.com/text/page/3/', headers=headers)
if html.status_code == 200:
print("网页获取成功...")
return html.text
else:
print("网页获取失败...")
def get_html_text():
#提前段子正文信息
html = get_html()
#初始化html
doc = pq(html)
#选择出段子所在的节点并使用items方法,使节点可遍历
content = doc('.content')
items = content.items()
#使用text()提前段子正文,并添加到列表count中
text = []
for item in items:
text.append(item.text())
return text
def deal_print_data():
#优化输出
text = get_html_text()
#给段子加上标号
data = []
for i in text:
index = text.index(i)
st = str(index+1) + ' ' + i
data.append(st)
#因为获取的有25个段子,这里取前15个
data = data[:16]
#在段子末尾加一些句子
data.append('\n\t\t----------看完了就早点睡觉吧,晚安喽!----------')
#因为下面需要使用str类型的字符串,因此用.join方法将text列表用换行符进行分割
finally_data = "\n".join(data)
return finally_data
def send_email():
#发送邮件
data = deal_print_data()#data为要发送的信息
sender = '3512919120@qq.com'#发送者邮箱
password = '你的qq邮箱授权码'#授权码
receiver = '3512919120@qq.com'#接收者邮箱
#创建一个邮件对象
msg = Message()
# 邮件标题
msg['Subject'] = '睡前笑一笑,烦恼都去掉!'
# 邮件发送者
msg['From'] = sender
# 邮件接受者
msg['To'] = receiver
# 邮件正文
msg.set_payload(data,'utf-8')
try:
#smtp.xxx.com为邮箱服务类型,25为STMP的端口
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
#登录
smtp.login(sender, password)
#发送
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
print("发送成功...")
except:
print("有bug噢!")
def run_task():
#定时发送
send_email()
#每隔3600秒后执run_tast()函数,即发生邮件;其中时间间隔可自己设置
t = Timer(3600, run_task)
t.start()
if __name__ == '__main__':
run_task()
如果有帮助到你的话,就点个赞吧!