今天小编就来带大家做一个目前网上比较火的天气预报器,我们先使用我们小脑袋里装着的爬 虫知识,将需要的地区的天气爬取下来,然后使用python自动化将天气数据发送到对象的邮箱里去 (如果没有对象怎么办?没有对象,那就自己给自己发!),小小举动暖她/他一整天,快给你的那个她 /他安排起来吧!
确定爬取的地址:https://tianqi.2345.com/xihu1d/71854.htm
首先选择一个可以查询天气的网站,小编选择的是杭州西湖区的天气情况,大家可以点击切换, 切换到大家想要爬取的城市。随后我们通过抓包工具,先选择文档,找到对应的网页源码的包,查看 它的响应,并在响应数据中Ctrl+F键,输入我们想要获取的数据,发现数据就在源代码中,因此, 我们排除数据是通过ajax请求得到的可能性,因此我们只需要吗,获取这个包的响应内容,并使用 xpath解析出我们想要的数据即可。
class WeatherSpider: #WeatherSpider类用于爬取天气信息
def __init__(self): #类的初始化函数
self.province = "浙江" #指定省份 self.city = "杭州" #指定城市 self.area = "西湖区" #指定区县 self.url = "https://tianqi.2345.com/xihu1d/71854.htm" #指定爬取的网址 self.headers={ #请求标头 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27' }
这里我们写一个名为WeatherSpider的类,专门用于爬取天气数据。关于面向对象的一些 知识,小编就不再过多介绍,大家可以自行进行学习。(学习面向对象的编程语言,怎么能不会 面向对象呢!)。在类的初始化函数中,我们先定义一些需要用到的常量。
进行数据爬取:
我们观察该包的标头中的请求标头,发现出现了类似:authority的请求头,但正常我们看到 的请求头一般为Authority,那这里为什么会变成:authority呢。这里小编分享一个知识,出现 类似:authority的请求头则可以说明该网站是基于http2.0协议来写的。而我们平时访问的网站 基本上都是基于http1.0协议写的。小编在前两篇文章中,都使用的是requests库,而该库在面对 http2.0协议的网站时,有可能会出错导致获取不到数据,因此在本次教学中小编推荐大家使用 httpx库,httpx库的使用方式和requests库基本一致,但其支持爬取httpx2.0协议的网站安装 方式如下,在cmd命令行中:
pip install –i https://pypi.tuna.tsinghua.edu.cn/simple httpx[http2]
import httpx from lxml import etree class WeatherSpider: #WeatherSpider类用于爬取天气信息
def __init__(self): #类的初始化函数
self.province = "浙江" #指定省份 self.city = "杭州" #指定城市 self.area = "西湖区" #指定区县 self.url = "https://tianqi.2345.com/xihu1d/71854.htm" #指定爬取的网址 self.headers={ #请求标头 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27' }
def getMessage(self): # 获取信息
response = httpx.get(url=self.url,headers=self.headers).text #获取网站源码数据 tree = etree.HTML(response) #生成etree.HTML对象的实例,使其可以进行xpath解析 wetherCondition = tree.xpath('//div[@class="real-today"]/span/text()')[0] #当天的天气情况 airCondition = tree.xpath('//div[@class="aqi-map-con"]/em/text()')[0]#空气质量 content = "{}省{}市{}区:\n{}\n空气质量:{}".format(self.province,self.city,self.area, wetherCondition,airCondition) return content
最后写完的WeatherSpider类如上,具体怎么使用xpath解析出相应的数据,大家可以看小编的上 一篇文章,学习一下xpath的语法。这里小编爬取的当然的天气情况和空气质量。
进行自动化的邮件发送。需引入python自带的几个库如下:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header w = WeatherSpider() #实例化一个WeatherSpider类的对象 content = w.getMessage() #调用getMessage方法获取天气数据 mailhost = 'smtp.qq.com' # qq邮箱的服务器地址 qqmail = smtplib.SMTP() # 实例化一个SMTP类 qqmail.connect(mailhost, 25) #连接到服务器 sender = "xxxxxxxx@qq.com" #发件人的邮箱地址 password = 'xxxxxxxx' #发件人的邮箱密码,注意不是真正的QQ密码,需要到QQ邮箱申领 qqmail.login(sender, password) #登录到邮箱 receiver = "xxxxxxxx@qq.com" #收件人的邮箱地址 message = MIMEMultipart() #实例化一个MIMEMultipart类的对象,存放邮件文本数据 message.attach(MIMEText(content, 'plain', 'utf-8')) subject = '今日份天气' message['Subject'] = Header(subject, 'utf-8') qqmail.sendmail(sender, receiver, message.as_string()) #发送对应的文本数据到收件人邮箱 qqmail.quit() #退出邮箱登录
注意代码中提到的QQ邮箱密码不是你的QQ密码,需要到QQ邮箱进行申请。申请方法和如何发送邮件,
可以参考博客:
https://blog.csdn.net/LOVEYSUXIN/article/details/124274549?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166239400316782244837458%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166239400316782244837458&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-124274549-null-null.142v46pc_rank_34_ecpm25&utm_term=python%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6&spm=1018.2226.3001.4187
侧试一下能否成功发送邮件:
设置定时发送: 使用time模块中的localtime得到当前的时间。
其中tm_hour拿到当前是几点。
while True: hour = time.localtime().tm_hour #获取当前是几点 if int(hour) == 6: pass time.sleep(1)
设定每天6点钟发送邮件。
合并所有代码,完成整个项目:
import httpx from lxml import etree import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header import time
class WeatherSpider: #WeatherSpider类用于爬取天气信息
def __init__(self): #类的初始化函数
self.province = "浙江" #指定省份 self.city = "杭州" #指定城市 self.area = "西湖区" #指定区县 self.url = "https://tianqi.2345.com/xihu1d/71854.htm" #指定爬取的网址 self.headers={ #请求标头 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27' }
def getMessage(self): # 获取信息
response = httpx.get(url=self.url,headers=self.headers).text #获取网站源码数据 tree = etree.HTML(response) #生成etree.HTML对象的实例,使其可以进行xpath解析 wetherCondition = tree.xpath('//div[@class="real-today"]/span/text()')[0] #当天的天气情况 airCondition = tree.xpath('//div[@class="aqi-map-con"]/em/text()')[0]#空气质量 content = "{}省{}市{}:\n{}\n空气质量:{}".format(self.province,self.city,self.area, wetherCondition,airCondition) return content
def main():
while True: hour = time.localtime().tm_hour #获取当前是几点 if int(hour) == 6: w = WeatherSpider() #实例化一个WeatherSpider类的对象 content = w.getMessage() #调用getMessage方法获取天气数据 mailhost = 'smtp.qq.com' # qq邮箱的服务器地址 qqmail = smtplib.SMTP() # 实例化一个SMTP类 qqmail.connect(mailhost, 25) #连接到服务器 sender = "xxxxxxxxxx@qq.com" #发件人的邮箱地址 password = 'xxxxxxxxxx' #发件人的邮箱密码,注意不是真正的QQ密码,需要到QQ邮箱申领 qqmail.login(sender, password) #登录到邮箱 message = MIMEMultipart() #实例化一个MIMEMultipart类的对象,存放邮件文本数据 message.attach(MIMEText(content, 'plain', 'utf-8')) subject = '今日份天气' message['Subject'] = Header(subject, 'utf-8') receiver = "xxxxxxxxxx@qq.com" # 收件人的邮箱地址 qqmail.sendmail(sender, receiver, message.as_string()) #发送对应的文本数据到收件人邮箱 qqmail.quit() time.sleep(1)
if __name__ == '__main__':
main()
给小编点上关注!
本文链接:http://so.lmcjl.com/news/19740/