1. 程式人生 > >Python網路爬蟲--歷史天氣資料採集

Python網路爬蟲--歷史天氣資料採集

在很多機器學習應用中,天氣資料為重要的輔助特徵資料,故本文主要介紹如何利用Python獲取歷史天氣資料。

目標網站

資料爬取的目標網站為天氣網

這裡寫圖片描述

程式設計實現

匯入相關包

import requests  # 匯入requests
from bs4 import BeautifulSoup  # 匯入bs4中的BeautifulSoup
import os
import re
import csv
import pandas as pd
import numpy as np
import time
import json

下面以爬取北京市歷史天氣資料為例進行演示:

獲取所有月份URL

分析網頁原始碼可知,所有月份的URL在’tqtongji1’的div中。

這裡寫圖片描述

實現程式碼如下:

def get_url(request_url):
    html = requests.get(request_url).text
    Soup = BeautifulSoup(html, 'lxml') # 解析文件
    all_li = Soup.find('div', class_='tqtongji1').find_all('li')
    url_list = []
    for li in all_li:
        url_list.append([li.get_text(), li.find('a'
)['href']]) return url_list

獲取某月份的歷史天氣資料

獲取到月份URL後,分析月份的頁面原始碼可知,歷史天氣資料在’tqtongji2’的div中。

這裡寫圖片描述

原始碼如下:

def get_month_weather(request_url, year_number, month_number):
    # month_url = 'http://lishi.tianqi.com/beijing/201712.html'
    url_list = get_url(request_url)
    for i in range(len(url_list)-1
, -1, -1): year_split = int(url_list[i][0].encode('utf-8')[:4]) month_split = int(url_list[i][0].encode('utf-8')[7:9]) if year_split == year_number and month_split == month_number: month_url = url_list[i][1] html = requests.get(month_url).text Soup = BeautifulSoup(html, 'lxml') # 解析文件 all_ul = Soup.find('div', class_='tqtongji2').find_all('ul') month_weather = [] for i in range(1, len(all_ul)): ul = all_ul[i] li_list = [] for li in ul.find_all('li'): li_list.append(li.get_text().encode('utf-8')) month_weather.append(li_list) return month_weather

獲取某年的歷史天氣資料

將各月份的資料彙總即可得到年曆史天氣資料。

原始碼如下:

def get_year_weather(request_url, year_number):
    year_weather = []
    for i in range(12):
        month_weather = get_month_weather(request_url, year_number, i+1)
        year_weather.extend(month_weather)
        print '第%d月天氣資料採集完成,望您知悉!'%(i+1)
    col_name = ['Date', 'Max_Tem', 'Min_Tem', 'Weather', 'Wind', 'Wind_Level']
    result_df = pd.DataFrame(year_weather)
    result_df.columns = col_name
    # result_df.to_csv('year_weather.csv')
    return result_df

執行’result_df = get_year_weather(request_url, 2017)’,結果如下:

這裡寫圖片描述

廣告時間

這裡寫圖片描述

歡迎您掃一掃上面的二維碼,關注我的微信公眾號!