本次项目是要通过爬虫获取到全国所有城市的当天的天气数据,然后进行进行保存整体思路分为以下几步:

(1)找到目标网站

(2)对所有城市的天气进行获取

(3)最终进行保存数据到本地

然后通过浏览器进行解锁,找到了一个会显示天气预报的网站,目标网址为ur=https://www.tianqi.com/,网站图片如下


首先对这个网站进行分析,随意输入几个城市的url如下:

(1)北京:https://www.tianqi.com/beijing/

(2)上海:https://www.tianqi.com/shanghai/

(3)广州:https://www.tianqi.com/guangzhou/

观察这几个网址会发现他能的组成是“https://www.tianqi.com/”+“城市拼音”+/
所以下一步的思路就是找到全国所有城市的名称,然后将其转换为拼音,从而实现对网页进行翻页。

接下来的任务就是获取到全国所有城市的名字,我找到一个json数据可以获得所有的城市名称网站如下:
url=https://img.weather.com.cn/newwebgis/fc/nation_fc24h_wea_2022010420.json
爬入代码如下

def main():    #爬取全国所有城市的名字
    url = 'https://img.weather.com.cn/newwebgis/fc/nation_fc24h_wea_2022010420.json'
    resp = requests.get(url).text[10:337263:]  # 对数据进行处理
    resp1 = json.loads(resp)['data']  # 将数据转换为json数据
    # print(type(resp1))
    # print(resp1)
    # print(resp)
    lis = []
    for i in resp1:
        lis.append(i['namecn'])
        # print(i['namecn'])
    #print(lis)
    #global lis
    name(lis)

此时已经获取到所有城市的名称,接下来就是将其转换为拼音,此时需要用到python中的pypinyin库,需要使用pip install pypinyin命令进行安装。
转换代码如下:

def name(lis):       #将所有的名字转换为拼音
    lis1 = []
    for i in lis:
        lis2=[]
        lis2.append(i)
        name = lazy_pinyin(i)
        # print(name)
        a=''
        for i in name:
            a+=i
        lis2.append(a)
        lis1.append(lis2)
    #print(lis1)
    fun2(lis1)

最终将获取到的所有城市名称转换为了拼音
最后就是将所有的城市数据进行爬取,其完整代码如下:

import requests
from bs4 import BeautifulSoup
import json
from pypinyin import lazy_pinyin
import time
import xlwt



f=open('python.txt','w',encoding='utf-8')          #创建一个文化

def main():    #爬取全国所有城市的名字
    url = 'https://img.weather.com.cn/newwebgis/fc/nation_fc24h_wea_2022010420.json'
    resp = requests.get(url).text[10:337263:]  # 对数据进行处理
    resp1 = json.loads(resp)['data']  # 将数据转换为json数据
    # print(type(resp1))
    # print(resp1)
    # print(resp)
    lis = []
    for i in resp1:
        lis.append(i['namecn'])
        # print(i['namecn'])
    #print(lis)
    #global lis
    name(lis)
    pass

def name(lis):       #将所有的名字转换为拼音
    lis1 = []
    for i in lis:
        lis2=[]
        lis2.append(i)
        name = lazy_pinyin(i)
        # print(name)
        a=''
        for i in name:
            a+=i
        lis2.append(a)
        lis1.append(lis2)
    #print(lis1)
    fun2(lis1)
    pass

def fun2(lis1):                   #爬取天气预报网站获取该网站原代码
    for i in lis1:
        time.sleep(1)
        url = f'https://www.tianqi.com/{i[1]}/'
        print(url)
        headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'
            ,
            'cookie': 'Hm_lvt_ab6a683aa97a52202eab5b3a9042a8d2=1661411951; Hm_lvt_30606b57e40fddacb2c26d2b789efbcb=1661413345; Hm_lpvt_3060'
                      '6b57e40fddacb2c26d2b789efbcb=1661414297; cs_prov=04; cs_city=0401; ccity=101040100; Hm_lpvt_ab6a683aa97a52202eab5b3a9'
                      '042a8d2=1661414326'
        }
        resp = requests.get(url=url, headers=headers).text
        # print(resp)
        fun3(resp,i)
        # print(resp)

def fun3(resp,i):            #对天气预报网站的数据进行解析
    try:
        html = BeautifulSoup(resp, 'html.parser')
        html1 = html.find('div', class_="weatherbox").find("dl", class_="weather_info").find("dd",
                                                                                             class_="week").text  # 获取当天时间
        html2 = html.find('div', class_="weatherbox").find("dl", class_="weather_info").find('dd',
                                                                                             class_="weather").find(
            'span').text  # 获取当天温度
        html3 = html.find('div', class_="weatherbox").find("dl", class_="weather_info").find('dd',
                                                                                             class_="shidu").text  # 湿度,风度紫外线
        html4 = html.find('div', class_="weatherbox").find("dl", class_="weather_info").find('dd',
                                                                                             class_="kongqi").text  # 空气质量
        print(i[0], html1, html2, html3, html4)
        lis = []
        lis.append(html1)
        lis.append(html2)
        lis.append(html3)
        lis.append(html4)
        fun4(lis)
    except Exception as e :
        print(e)
    '''html=BeautifulSoup(resp,'html.parser')
    html1=html.find('div', class_="weatherbox").find("dl", class_="weather_info").find("dd", class_="week").text    #获取当天时间
    html2=html.find('div', class_="weatherbox").find("dl", class_="weather_info").find('dd', class_="weather").find('span').text   #获取当天温度
    html3=html.find('div', class_="weatherbox").find("dl", class_="weather_info").find('dd', class_="shidu").text    #湿度,风度紫外线
    html4=html.find('div', class_="weatherbox").find("dl", class_="weather_info").find('dd', class_="kongqi").text   #空气质量
    print(i[0],html1,html2,html3,html4)
    lis=[]
    lis.append(html1)
    lis.append(html2)
    lis.append(html3)
    lis.append(html4)
    fun4(lis)'''

def fun4(lis):       #数据存储
    '''lis=['当天时间','当天温度','湿度,分度紫外线','空气质量']
    book=xlwt.Workbook(encoding='utf-8')
    shell=book.add_sheet('天气数据',cell_overwrite_ok=True)'''
    f.write(str(lis) + '\n')
    print(f'存储')


    pass

if __name__ == '__main__':
    main()

最终得到的数据如下:

基于天气预报的多维数据分析 天气预报数据收集_python