python爬取天气(基础版)

用python实现抓取天气

第一步 发现API接口

经过分析发现,杭州天气API接口
是中国天气网的接口,其返回的数据如下图所示

下来我们分析一下

1. 前面是网页请求的地址,后面是请求的ID地址
2. 经过在中国天气网的查找,发现主要城市ID列表
cityList_main = [  # 全国主要城市
    # 北上广深
    {'code': "101010100", 'name': "北京"},
    {'code': "101020100", 'name': "上海"},
    {'code': "101280101", 'name': "广州"},
    {'code': "101280601", 'name': "深圳"},
    # 华北
    {'code': "101010100", 'name': "北京"},
    {'code': "101030100", 'name': "天津"},
    {'code': "101090101", 'name': "石家庄"},
    {'code': "101100101", 'name': "太原"},
    {'code': "101080101", 'name': "呼和浩特"},
    {'code': "101090201", 'name': "保定"},
    {'code': "101100201", 'name': "大同"},
    {'code': "101080201", 'name': "包头"},
    {'code': "101090402", 'name': "承德市"},
    {'code': "101100401", 'name': "晋中"},
    {'code': "101080501", 'name': "通辽"},
    {'code': "101091101", 'name': "秦皇岛"},
    # 东北
    {'code': "101050101", 'name': "哈尔滨"},
    {'code': "101060101", 'name': "长春"},
    {'code': "101070101", 'name': "沈阳"},
    {'code': "101050201", 'name': "齐齐哈尔"},
    {'code': "101060201", 'name': "吉林"},
    {'code': "101070201", 'name': "大连"},
    {'code': "101050301", 'name': "牡丹江"},
    {'code': "101060301", 'name': "延吉"},
    {'code': "101070301", 'name': "鞍山"},
    {'code': "101050501", 'name': "绥化"},
    {'code': "101060601", 'name': "白城"},
    {'code': "101071401", 'name': "葫芦岛"},
    # 华南
    {'code': "101280101", 'name': "广州"},
    {'code': "101300101", 'name': "南宁"},
    {'code': "101310101", 'name': "海口"},
    {'code': "101320101", 'name': "香港"},
    {'code': "101330101", 'name': "澳门"},
    {'code': "101280601", 'name': "深圳"},
    {'code': "101300501", 'name': "桂林"},
    {'code': "101310201", 'name': "三亚"},
    {'code': "101280701", 'name': "珠海"},
    {'code': "101281701", 'name': "中山"},
    {'code': "101301001", 'name': "百色"},
    {'code': "101310215", 'name': "万宁"},
    # 西北
    {'code': "101110101", 'name': "西安"},
    {'code': "101160101", 'name': "兰州"},
    {'code': "101150101", 'name': "西宁"},
    {'code': "101170101", 'name': "银川"},
    {'code': "101130101", 'name': "乌鲁木齐"},
    {'code': "101110300", 'name': "延安"},
    {'code': "101110901", 'name': "宝鸡"},
    {'code': "101160901", 'name': "天水"},
    {'code': "101170301", 'name': "吴忠"},
    {'code': "101130501", 'name': "吐鲁番"},
    {'code': "101160801", 'name': "酒泉"},
    {'code': "101170401", 'name': "固原"},
    # 西南
    {'code': "101040100", 'name': "重庆"},
    {'code': "101270101", 'name': "成都"},
    {'code': "101260101", 'name': "贵阳"},
    {'code': "101290101", 'name': "昆明"},
    {'code': "101140101", 'name': "拉萨"},
    {'code': "101270401", 'name': "绵阳"},
    {'code': "101260201", 'name': "遵义"},
    {'code': "101290201", 'name': "大理"},
    {'code': "101271401", 'name': "乐山"},
    {'code': "101260801", 'name': "六盘水"},
    {'code': "101291401", 'name': "丽江"},
    # 华东
    {'code': "101020100", 'name': "上海"},
    {'code': "101230101", 'name': "福州"},
    {'code': "101220101", 'name': "合肥"},
    {'code': "101240101", 'name': "南昌"},
    {'code': "101120101", 'name': "济南"},
    {'code': "101210301", 'name': "嘉兴"},
    {'code': "101190101", 'name': "南京"},
    {'code': "101210401", 'name': "宁波"},
    {'code': "101210101", 'name': "杭州"},
    {'code': "101190401", 'name': "苏州"},
    {'code': "101120201", 'name': "青岛"},
    {'code': "101230201", 'name': "厦门"},
    {'code': "101340101", 'name': "台北市"},
    # 华中
    {'code': "101180101", 'name': "郑州"},
    {'code': "101200101", 'name': "武汉"},
    {'code': "101250101", 'name': "长沙"},
    {'code': "101180201", 'name': "安阳"},
    {'code': "101200201", 'name': "襄阳"},
    {'code': "101250201", 'name': "湘潭"},
    {'code': "101250301", 'name': "株洲"},
    {'code': "101180401", 'name': "许昌"},
    {'code': "101250601", 'name': "常德"},
    {'code': "101251101", 'name': "张家界"},
    {'code': "101200401", 'name': "孝感"},
    {'code': "101201401", 'name': "荆门"}
]

第二步爬取相关数据

1.因为是做服务器相关的,要获取IP地址,而前段通过JS获取IP不是那么精确
2.所以可以用到web的相关信息,去获取网络请求的IP地址,

def check_ip_address():
    try:
        data = web.ctx.env
        ips = data.get('HTTP_X_FORWARDED_FOR', data.get('HTTP_REMOTEIP'))
        if ips:
            ip = ips.split(',')[-1]
            return ip
    except Exception as e:
        return '115.236.171.18'

===

1. 我们已经获取IP地址了,但是没有办法去获得城市名称,这是时候,应该想到怎么根据IP去查地址
2. 我们通过站长之家获取的工具去查询地区,获取相关是去,这样我们就知道地区名,下来就是通过地区名,去查天气了
def get_urls(html):
    pattern = re.compile('<span class="Whwtdhalf w50-0">(.*?)</span>')
    item = re.findall(pattern, html)
    return item


def ip_change_city(ip_address):
    ip_info = get_urls(get_html('http://ip.chinaz.com/' + ip_address))
    result = re.findall("省(.*)市.*", ip_info[1])
    back_info_city = None
    for x in result:
        if x is not None:
            back_info_city = x

    if back_info_city is None:
        result = re.findall("(.*)市.*", ip_info[1])
        for x in result:
            if x is not None:
                back_info_city = x
    return back_info_city

===

根据地址去查天气信息

# 通过城市代码获得天气信息并返回
def get_weather(d):
    url = 'http://www.weather.com.cn/data/cityinfo/' + d + '.html'
    # url = 'http://www.weather.com.cn/data/sk/' + d + '.html'
    weatherHtml = urllib2.urlopen(url).read()
    weatherJSON = json.JSONDecoder().decode(weatherHtml)
    weatherInfo = weatherJSON['weatherinfo']
    return weatherInfo


# 通过城市名获得城市代码,并调用get_weather获得天气信息
def city_weather_info(cityname):
    code = "101210101"
    for value in cityList_main:
        if value['name'] == cityname:
            code = value['code']
            break
    return get_weather(code)


# 打印某个城市的天气信息
def print_weather_info(cityname):
    city_name_temp = cityname[1:-1]
    info = city_weather_info(city_name_temp)
    return info
    
def get_html(url):
    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
    request = urllib2.Request(url, headers=header)
    response = urllib2.urlopen(request)
    text = response.read()
    return text
    

获取天气,返回相关数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335