首页 编程教程正文

爬取中国天气网数据

piaodoo 编程教程 2020-02-22 22:14:59 1502 0 python教程

本文来源吾爱破解论坛

本帖最后由 牵手丶若相惜 于 2019-11-27 19:34 编辑

中国天气网的robots协议 允许所有爬虫爬取数据
______________________
爬取中国气象网的每个地区七天的天气
但是我只爬取了每个城市的最低温度 没去爬取最高温度
最高温度留给你们  学习爬虫的可以试着添加一下
刚学习爬虫的可以参考一下 还可以优化
源码如下:

import requests
from bs4 import BeautifulSoup

# 浏览器代{过}{滤}理
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"
}


# 获取该url地址下的源码
def get_url(url):
    data = requests.get(url, headers=headers).content.decode("utf-8")
    # 使用html5lib 容错率较高
    soup = BeautifulSoup(data, "html5lib")
    return soup


# 通过网页源码匹配该地区的七天天气的html源码
def gain_data(soup):
    hanmls = soup.find("div", class_="hanml")
    # 匹配到存放所有天数温度的div标签下的数据
    conmidtabs = hanmls.find_all("div", class_="conMidtab")
    return conmidtabs


# 通过网页源码匹配是哪七天
def gain_day():
    url = "http://www.weather.com.cn/textFC/hb.shtml"
    soup = get_url(url)
    day = []
    days = list(soup.find("ul", class_="day_tabs").stripped_strings)
    for Current in days:
        day.append(Current)
    return day


# 获取每天的数据
def gain_table(conmidtab):
    tabs = conmidtab.find_all("table")
    # 用来存放遍历的数据
    y = {}
    # 遍历当天该地区的所有城市
    for tab in tabs:
        # 因为前两个是表头 所以从第三个获取每个省的城市的名字和温度
        trs = tab.find_all("tr")[2:]
        for tr in trs:
            # 提取城市name
            citys = list(tr.find("td", width="83").stripped_strings)[0]
            # 提取城市min_tmparetrue
            tmps = list(tr.find("td", width="86").stripped_strings)[0]
            # 把城市名作为key,温度作为value
            y[citys] = int(tmps)
            # 把字典y中的数据存放到该数组中
    return y


# 把数据到本地
def write_file(regions, lis1_index):
    lis1 = ["华北", "东北", "华东", "华中", "华南", "西北", "西南", "港澳台"]
    with open("d:/中国天气1.txt", "a", encoding="utf-8") as fp:
        # 把日期写到最前面
        fp.write(("地区:" + lis1[lis1_index] + "\n"))
        # 遍历regions,keys为当前日期,values是当前地区的所有市的名字和最低气温
        for keys, values in regions.items():
            fp.write((keys + "\n"))
            # 遍历values,key为城市名称,value为该城市的最低温度
            for key, value in values.items():
                fp.write((key + ":" + str(value) + "\t"))
            fp.write("\n\n")


if __name__ == '__main__':
    # 用来存放该地区七天的温度
    current_temperature = []
    partitions = ["hb", "db", "hd", "hz", "hn", "xb", "xn", "gat"]
    prefix = "http://www.weather.com.cn/textFC/"
    # 获取七天的日期 days是个列表
    days = gain_day()
    # 用来存放该地区每天的温度
    regions = {}
    # 用来作为write_file函数里的lis1的下标
    lis1_index = 0
    # 遍历 所有的地区 华北,华东等等
    for partition in partitions:
        url = prefix + partition + ".shtml"
        # 调用get_url获取源码
        soup = get_url(url)
        # 调用gain_data 获取到七天天气的源码
        conmidtabs = gain_data(soup)
        # 作为days数组的下标
        day_index = 0
        # 把七天的数据依次传递 获取每天的数据
        for conmidtab in conmidtabs:
            data = gain_table(conmidtab)
            # 日期为key 当前地区的所有城市和最低温度为value
            regions[days[day_index]] = data
            day_index += 1

        # 调用写入的函数把 regions 里的数据写到本地
        write_file(regions, lis1_index)
        # 每更换一个地区下标加1
        lis1_index +=
1

捕获.PNG (113.42 KB, 下载次数: 11)

下载附件  保存到相册

2019-11-21 12:47 上传

网站数据

网站数据

捕获.PNG (132.85 KB, 下载次数: 6)

下载附件  保存到相册

2019-11-21 12:53 上传

保存下来的数据

保存下来的数据

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7950.html

搜索