喜欢用linux的TUI来打代码,但是突然想起来要上课去了,想看天气怎么办,切换GUI?太慢了吧,直接把天气信息爬取下来以文本形式展现就好了。
使用方式要简单,直接在bash输入tianqi hangzhou
就要可以获取到杭州的天气情况,要获取参数输入,需要用到sys
模块。
请求网站用request
模块,解析用HTMLParser
。
选择了 天气网
从域名格式可以看到,杭州的天气网址由“www.tianqi.com/”加“hangzhou”组成
也就是说只要把传入的参数1加到“www.tianqi.com/”后面就好了。这就是我们要的请求网址,目前这个网站没有反爬虫,毕竟天气网站都是要利民的嘛。
标签什么也很容易处理,就直接贴代码了,可以作为自己的天气查询命令。希望了解的小白请前往廖雪峰老师的python3教程
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from html.parser import HTMLParser
from urllib import request
import sys
class MyHTMLParser(HTMLParser):
flag=0
bflag=0
res=[]
is_get_data=0
def handle_starttag(self,tag,attrs):
if tag == 'div':
for attr in attrs:
if attr[1] == 'left':
if self.flag == 0 :
self.flag = 1
if ( tag == 'h2' or tag == 'h5' or tag == 'h6' ) and self.flag == 1:
self.is_get_data += 1
if tag == 'dd' and self.flag == 1:
for attr in attrs:
if attr[1] == 'week':
self.is_get_data += 1
elif attr[1] == 'shidu':
self.bflag = 1
if tag == 'span' and self.flag == 1:
self.bflag = 1
self.is_get_data += 1
if ( tag == 'b' or tag == 'br' ) and self.bflag == 1 and self.flag == 1:
self.is_get_data += 1
def handle_endtag(self,tag):
if tag == 'div' and self.flag == 1:
self.flag = -1
self.is_get_data = 0
if ( tag == 'span' or tag == 'dd' ) and self.flag == 1:
self.bflag = 0
def handle_data(self,data):
if self.is_get_data > 0 and self.flag == 1:
print(data)
self.is_get_data -= 1
weather_url='https://www.tianqi.com/'
if len(sys.argv) < 2 :
weather_url += 'hangzhou/'
else :
weather_url += sys.argv[1] + '/'
with request.urlopen(weather_url) as f:
data = f.read().decode('utf-8')
parser=MyHTMLParser()
parser.feed(data)
for item in MyHTMLParser.res:
print(item)
hhh,开学快乐。