本帖最后由 Mirukuteii 于 2018-4-10 05:23 编辑
拜读了@lidicn大大的帖子油价油费【restfulSensor】【抓包】,又学到很多。
今天,萌新我的第四个探索决定也发一篇关于【油价】信息收集的帖子,
不同于Lidicn大大的REST API 和抓包大法。
萌新我的方法比较简单,不需要API-key和抓包,
但是需要通过HA自带的命令行组件【Sensor.command_line】,
并运行自制的脚本oilprice.py来获得油价信息。
注意:或许因为98号汽油为国V编外标准,所以没有油价信息提取。
反正屌丝我也没加过98号汽油,土豪请另找办法。
这是萌新我第一次用python3编写的脚本,所以专门发了一帖以示纪念。
同时也分享给准备尝试写第一个py脚本和学习爬取网页信息的群友们,希望你们从中得到一点借鉴和参考。
下面直接给出代码
(本萌新喜欢把代码发出来,不喜欢直接发文件,希望大家多看看代码多交流):
oilprice.yaml
(作为packages文件,请放在相应文件夹下,并修改groups.yaml,通过在你需要的位置添加- group.oilprice使组件显示到界面上):
sensor:
- platform: command_line
name: oilprice
command: "python3 /config/script/oilprice.py"
scan_interval: 6666 #6666秒刷新一次,我感觉油价2个小时刷1次就够了,你可以自己改。
- platform: template
sensors:
oilprice_q89:
icon_template: mdi:gas-station
friendly_name: "国V 89号汽油价格"
unit_of_measurement: '元/升'
value_template: "{% if states.sensor.oilprice %} {{ states.sensor.oilprice.state.split(',')[0] }} {% endif %}"
oilprice_q92:
icon_template: mdi:gas-station
friendly_name: "国V 92号汽油价格"
unit_of_measurement: '元/升'
value_template: "{% if states.sensor.oilprice %} {{ states.sensor.oilprice.state.split(',')[1] }} {% endif %}"
oilprice_q95:
icon_template: mdi:gas-station
friendly_name: "国V 95号汽油价格"
unit_of_measurement: '元/升'
value_template: "{% if states.sensor.oilprice %} {{ states.sensor.oilprice.state.split(',')[2] }} {% endif %}"
oilprice_ch0:
icon_template: mdi:gas-station
friendly_name: "国V 0号柴油价格"
unit_of_measurement: '元/升'
value_template: "{% if states.sensor.oilprice %} {{ states.sensor.oilprice.state.split(',')[3] }} {% endif %}"
group:
oilprice:
name: '本地油价信息'
view: no
entities:
- sensor.oilprice_q89
- sensor.oilprice_q92
- sensor.oilprice_q95
- sensor.oilprice_ch0
oilprice.py
(脚本文件,请在根目录新建script文件夹并放在里面,你也可以通过修改oilprice.yaml文件中的command: "python3 /config/script/oilprice.py"来改变存放位置,放好文件后,请注意更改local_province和local_city为你想要的省市,不然就是默认的江苏省无锡市,也可以到http://youjia.chemcp.com/上去查自己的省市名称)
import requests
import re
local_province = 'jiangsu'
local_city = 'wuxishi'
def get_html(url):
heads = {}
heads['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
req = requests.get(url, headers=heads)
req.encoding='gb2312'
html = req.text
return html
def get_oilprice(html):
regex_oilprice = r'<td bgcolor="#F2F7FC"><font color="red">(.+)元/升</font></td>'
oilpricelist = re.findall(regex_oilprice, html)
sumray = ','.join(oilpricelist)
print(sumray)
if __name__ == '__main__':
url = 'http://youjia.chemcp.com/'+local_province+'/'+local_city+'.html'
get_oilprice(get_html(url))
思路&套路:
①通过系统自带的组件【Sensor.command_line】运行命令行;
②命令为执行python3脚本文件;
③脚本文件通过库函数requests(请求)获取目标网页内容并进行文本转码;
④再通过库函数re(正则表达式)提取需要的油价信息并进行汇总;
⑤最后结果输出到命令行上;
⑥命令行组价把该结果作为sensor.oilprice的state值;
⑦通过系统自带的模板组件【Sensor.template】提取该值,并进行拆分;
⑧最后输出每种油的价格。
详细解读:
等有空再补上
|