6 月 17 日 22 分 25 分, 四川省宜宾市长宁县发生了 6.0 级地震, 成都高新减灾研究所与应急管理部门联合建设的大陆地震预警网成功预警本次地震, 提前 10 秒向宜宾市预警, 提前 61 秒向成都预警.
今天给大家分享一篇关于 Python 的爬虫知识, 没有用大家讨厌的正则表达式, 而是用一种新的方式解析库, 实现对 html 的解析和提取信息, 最后又用到前面项目用过的 wxpy 库, 实现了全部功能, 用 Python 获取地震信息, 然后微信实时推送给你的群组或你的朋友.
1. 前期准备
1. 爬虫基本知识, 比如 requests 库, 以及 lxml 库;
2. 利用 Xpath 进行 HTML 的解析;
之前写的一些简单项目, 提取页面信息时使用的是正则表达式, 但当项目复杂时, 用正则表达式比较烦琐, 万一有地方写错了, 可能导致匹配失败, 所以使用正则表达式提取页面信息多多少少还是有些不方便.
通过最近学习, 我知道了在网页中可以通过 Xpath 或 CSS 选择器来定位一个或多个节点, 再调用相应的方法获取它的正文内容或者属性, 可以很方便快捷的提取到我们想要的信息.
3. 要实现微信实时推送肯定需要用到 wxpy 库;
4. 本次项目从中国地震台网爬取地震信息, 链接为: http://news.ceic.ac.cn/index.html?time={int(time.time())}.
- 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)
来源: http://www.jianshu.com/p/214e5c26e9f4