爬虫(3)——基于爬虫的天气报警器

基于爬虫的天气预报器

	今天小编就来带大家做一个目前网上比较火的天气预报器,我们先使用我们小脑袋里装着的爬
虫知识,将需要的地区的天气爬取下来,然后使用python自动化将天气数据发送到对象的邮箱里去
(如果没有对象怎么办?没有对象,那就自己给自己发!),小小举动暖她/他一整天,快给你的那个她
/他安排起来吧!

step 1

	确定爬取的地址: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的类,专门用于爬取天气数据。关于面向对象的一些
知识,小编就不再过多介绍,大家可以自行进行学习。(学习面向对象的编程语言,怎么能不会
面向对象呢!)。在类的初始化函数中,我们先定义一些需要用到的常量。

Step 2

	进行数据爬取:

在这里插入图片描述

	我们观察该包的标头中的请求标头,发现出现了类似: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的语法。这里小编爬取的当然的天气情况和空气质量。

在这里插入图片描述

Step 3

进行自动化的邮件发送。需引入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

侧试一下能否成功发送邮件:

在这里插入图片描述

Step 4

设置定时发送:
使用time模块中的localtime得到当前的时间。

在这里插入图片描述

其中tm_hour拿到当前是几点。
while True:
    hour = time.localtime().tm_hour  #获取当前是几点
    if int(hour) == 6:
        pass
    time.sleep(1)
设定每天6点钟发送邮件。

Step 5

合并所有代码,完成整个项目:
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()

Step 6

给小编点上关注!

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一顿魏不饱&杏任小饼干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值