『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 11869|回复: 19

[经验分享] 【油价】萌新探索之四:第一个自制脚本爬取简单的HTML信息

[复制链接]

26

主题

553

帖子

2728

积分

金牌会员

Rank: 6Rank: 6

积分
2728
金钱
2150
HASS币
100

教程狂人

发表于 2018-4-10 05:15:10 | 显示全部楼层 |阅读模式
本帖最后由 Mirukuteii 于 2018-4-10 05:23 编辑

拜读了@lidicn大大的帖子油价油费【restfulSensor】【抓包】,又学到很多。


今天,萌新我的第四个探索决定也发一篇关于【油价】信息收集的帖子,
不同于Lidicn大大的REST API 和抓包大法。
萌新我的方法比较简单,不需要API-key和抓包,
但是需要通过HA自带的命令行组件【Sensor.command_line】,
并运行自制的脚本oilprice.py来获得油价信息。



注意:或许因为98号汽油为国V编外标准,所以没有油价信息提取。
反正屌丝我也没加过98号汽油,土豪请另找办法。


UC截图20180410051804.png
这是萌新我第一次用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】提取该值,并进行拆分;
⑧最后输出每种油的价格。

详细解读:
等有空再补上




评分

参与人数 4金钱 +35 收起 理由
eric + 2 谢谢分享!真棒!谢谢你!
marble.k + 5 又如滚滚黄河之水,一发不可收拾…….
+ 18 专门注册账号来顶你!
咸味土豆 + 10 赠人玫瑰,手留余香!

查看全部评分

回复

使用道具 举报

75

主题

1976

帖子

8181

积分

元老级技术达人

积分
8181
金钱
6155
HASS币
430

活跃会员教程狂人

发表于 2018-4-10 06:43:54 | 显示全部楼层
抢个前排先,坛子里又多一个大神。
所有过往,皆为序章。
回复

使用道具 举报

6

主题

743

帖子

5958

积分

论坛元老

Rank: 8Rank: 8

积分
5958
金钱
5210
HASS币
20
发表于 2018-4-10 07:03:28 | 显示全部楼层
不错,谢谢楼主分享。
回复

使用道具 举报

5

主题

115

帖子

624

积分

高级会员

Rank: 4

积分
624
金钱
509
HASS币
0
发表于 2018-4-10 07:36:27 | 显示全部楼层
谢谢分享
回复

使用道具 举报

2

主题

240

帖子

1715

积分

金牌会员

Rank: 6Rank: 6

积分
1715
金钱
1475
HASS币
0
发表于 2018-4-10 08:07:28 | 显示全部楼层
谢谢分享
回复

使用道具 举报

123

主题

4661

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16410
金钱
11664
HASS币
45
发表于 2018-4-10 08:56:32 | 显示全部楼层
楼主其实可以考虑写插件了!会省不少劲!
回复

使用道具 举报

219

主题

1287

帖子

7945

积分

超级版主

Rank: 8Rank: 8

积分
7945
金钱
6628
HASS币
86

教程狂人论坛风云人物突出贡献

发表于 2018-4-10 09:40:25 | 显示全部楼层
本帖最后由 lidicn 于 2018-4-10 09:44 编辑

其实油价不需要api的只要有url就可以了,那个油耗费用才需要。
https://t.weimeihuo.com/oil/today
直接写插件更方便吧。
另外,不太推荐爬取网页,一改版就会失效。还是找json格式的比较适合。

回复

使用道具 举报

26

主题

553

帖子

2728

积分

金牌会员

Rank: 6Rank: 6

积分
2728
金钱
2150
HASS币
100

教程狂人

 楼主| 发表于 2018-4-10 15:42:36 | 显示全部楼层
Jones 发表于 2018-4-10 08:56
楼主其实可以考虑写插件了!会省不少劲!

谢谢管理员大大,我也想和各位大大一样写自己的插件,
但是我还是一个只学了1个月不到的萌新啊。
对萌新来说,写插件好比打开一扇新世界的门,
而HA的组件其实很丰富,而且版本不过0.6X,
萌新还是更应该重在基础阶段的积累吧,
毕竟缺乏的主要就是各种知识和经验,
这么一段脚本就让我学了半天的正则表达式。
回复

使用道具 举报

26

主题

553

帖子

2728

积分

金牌会员

Rank: 6Rank: 6

积分
2728
金钱
2150
HASS币
100

教程狂人

 楼主| 发表于 2018-4-10 15:49:49 | 显示全部楼层
lidicn 发表于 2018-4-10 09:40
其实油价不需要api的只要有url就可以了,那个油耗费用才需要。
https://t.weimeihuo.com/oil/today
直接写 ...

谢谢J大的回复,地址已收下,不过这个城市怎么确定的呀?

是的,油价是不需要api的,油费才需要,爬HTML也不如爬json,不过这不是在向您致敬和学习嘛。
写插件的话,等萌新我再成熟点吧,作为交通出行的车辆信息这一块整合起来写感觉会更好。
回复

使用道具 举报

12

主题

545

帖子

2037

积分

金牌会员

Rank: 6Rank: 6

积分
2037
金钱
1492
HASS币
0
发表于 2018-4-10 16:15:33 来自手机 | 显示全部楼层
牛b ,思路学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 21:38 , Processed in 0.095731 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表