专栏首页公众号:googpypython获取地震信息

python获取地震信息

阅读文本大概需要 5 分钟。

6月17日22分25分,四川省宜宾市长宁县发生了6.0级地震,成都高新减灾研究所与应急管理部门联合建设的大陆地震预警网成功预警本次地震,提前10秒向宜宾市预警,提前61秒向成都预警。

虽然自己还不能写出这么牛逼的系统,但是今天我想结合自己学到的Python知识,用Python获取地震信息,然后微信实时推送给你的群组或你的朋友。

1.前期准备

1.爬虫基本知识,比如requests库,以及lxml库;

2.利用Xpath进行HTML的解析;

之前写的一些简单项目,提取页面信息时使用的是正则表达式,但当项目复杂时,用正则表达式比较烦琐,万一有地方写错了,可能导致匹配失败,所以使用正则表达式提取页面信息多多少少还是有些不方便。

通过最近学习,我知道了在网页中可以通过Xpath或CSS选择器来定位一个或多个节点,再调用相应的方法获取它的正文内容或者属性,可以很方便快捷的提取到我们想要的信息。

3.要实现微信实时推送肯定需要用到wxpy库;

4.本次项目从中国地震台网爬取地震信息,链接为:http://news.ceic.ac.cn/index.html?time={int(time.time())}。

2.代码整合

import requests, time
from lxml import etree
from wxpy import *

# 微信登陆
bot = Bot()
# 查找好友
my_friend = bot.friends().search(u'stormwen')[0]  # 写自己的讨论组名称

with open('log.txt', 'r') as f:
    rember = f.readline()

headers = {
    'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    'cookie': 'Hm_lvt_e0025cd5d352165f8a646ccea5beb27d=1543211803; Hm_lpvt_e0025cd5d352165f8a646ccea5beb27d=1543211803',
}

while True:
    try:
        url = f'http://news.ceic.ac.cn/index.html?time={int(time.time())}'
        # 请求数据
        res = requests.get(url, headers=headers).text.encode('ISO-8859-1').decode('utf8')
        html_ele = etree.HTML(res)
        # 返回列表
        res = html_ele.xpath('//*[@id="news"]//td//text()')

        # 如果日志为空,发送最新的一条地震信息
        if rember == '':
            msg = f'北京时间:{res[1]},在纬度:{res[2]} ,经度{res[3]} 处发生了{res[0]}级地震,震源深度{res[4]}千米,参考位置:{res[5]}(5分钟更新一次)'
            # 发送信息
            my_friend.send(msg)
            print('日志为空,msg:', msg)

        # 如果日志非空,就判断是否是最新的,发送日志之后的所有新的数据
        else:
            i = res.index(rember)
            while i > 1:
                i -= 6
                msg = f'北京时间:{res[i]},在纬度:{res[i+1]} ,经度{res[i+2]} 处发生了{res[i-1]}级地震,震源深度{res[i+3]}千米,参考位置:{res[i+4]}(5分钟更新一次)'
                # 发送信息
                my_friend.send(msg)
                print('日志非空,msg:', msg)

        time.sleep(300)
        rember = res[1]
        # 更新日志(记录最新发送的地震信息)
        with open('log.txt', 'w') as f:
            f.write(res[1])
    except:
        time.sleep(60)

3.结果展示

4.总结

我一直认为语言只是工具,只有用它来做点具体的事,才体现出它的价值。今天这个项目用到了Python的爬虫知识,没有用大家讨厌的正则表达式,而是用一种新的方式解析库,实现对HTML的解析和提取信息,最后又用到前面项目用过的wxpy库,实现了全部功能。

本文分享自微信公众号 - googpy(googpy),作者:叫我小包总

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python练手题目(九)

    给定一个数字,写一个函数输出其反向数字。(例如,给出123答案是321),数字应该保留他们的标志,即反转时负数仍应为负数。

    stormwen
  • 爬虫里面的字符串编码的坑

    初学Python写爬虫程序,上手很快,但字符串的编码问题却一直困扰着我,我相信每一个学习爬虫的人都有过和我一样的困惑。一旦走上了编程之路,如果你不把编码问题搞清...

    stormwen
  • 连淘宝评价都不会爬,也敢说自己会爬虫

    自从上次写了一篇教师节送什么?Python教你挑选礼物,让我对淘宝的其他信息产生了产生了很大的兴趣,所以,利用中秋节假期研究了下怎么爬取淘宝商品评价。

    stormwen
  • 413. 反转整数从低到高逐位处理

    将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数)。 样例

    和蔼的zhxing
  • 第四届蓝桥杯决赛B组C/C++——填算式

    mathor
  • 【leetcode刷题】T152-N叉树的后序遍历

    https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/

    木又AI帮
  • 【leetcode刷题】T151-N叉树的前序遍历

    https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/

    木又AI帮
  • 设计模式——工厂模式

    定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法是一个类的实例化延迟到子类。工厂方法可以解耦,降低代码的重复性。

    小森啦啦啦
  • H3C 路由器的IPSEC ××× 配置

                                               H3C路由器的ipsec配置

    py3study
  • 1048 数字加密 (20 分)

    本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相...

    可爱见见

扫码关注云+社区

领取腾讯云代金券