【问题标题】:Scraping Weather Data from multiple pages从多个页面抓取天气数据
【发布时间】:2019-11-27 06:42:04
【问题描述】:

我是python新手

我想从网站“http://www.estesparkweather.net/archive_reports.php?date=200901”抓取天气数据 我必须从 2009-01-01 到 2018-10-28 每天抓取所有可用的天气数据属性 我必须将抓取的数据表示为 pandas 数据框对象。

下面应该是 Dataframe 的具体细节

Expected column names (order dose not matter):

 ['Average temperature (°F)', 'Average humidity (%)',
 'Average dewpoint (°F)', 'Average barometer (in)',
 'Average windspeed (mph)', 'Average gustspeed (mph)',
 'Average direction (°deg)', 'Rainfall for month (in)',
 'Rainfall for year (in)', 'Maximum rain per minute',
 'Maximum temperature (°F)', 'Minimum temperature (°F)',
 'Maximum humidity (%)', 'Minimum humidity (%)', 'Maximum pressure',
 'Minimum pressure', 'Maximum windspeed (mph)',
 'Maximum gust speed (mph)', 'Maximum heat index (°F)']

Each record in the dataframe corresponds to weather details of a given day
The index column is date-time format (yyyy-mm-dd)
I need to perform necessary data cleaning and type cast each attributes to relevent data type

抓取后,我需要将数据框保存为名称为“dataframe.pk”的pickle文件

下面是我最初尝试使用 Beautifulsoup 阅读页面的代码,但是每月有多个页面,我不确定如何循环 2009 年 1 月到 2018 年 10 月的网址并将该内容放入汤中,有人可以帮忙吗:

***import bs4
from bs4 import BeautifulSoup
import csv
import requests
import time
import pandas as pd
import urllib
import re
import pickle
import numpy as np
url = "http://www.estesparkweather.net/archive_reports.php?date=200901"
page = requests.get(url)
soup=BeautifulSoup(page.content,"html.parser")
type(soup)
bs4.BeautifulSoup
# Get the title
title = soup.title
print(title)
# Print out the text
text = soup.get_text()
print(soup.text)

# Print the first 10 rows for sanity check
rows = soup.find_all('tr')
print(rows[:10])***

【问题讨论】:

  • 不同页面是如何实现的?您是否查看过该页面的来源?

标签: python pandas web-scraping beautifulsoup


【解决方案1】:

要阅读 2009-01-01 到 2018-10-28 时间范围内的信息,您必须了解 URL 模式

http://www.estesparkweather.net/archive_reports.php?date=YYYYMM

例子:

http://www.estesparkweather.net/archive_reports.php?date=201008

因此,您需要创建一个嵌套循环来读取每个年/月组合的数据。

类似:

URL_TEMPLATE = 'http://www.estesparkweather.net/archive_reports.php?date={}{}'
for year in range(2009,2018):
  for month in range(1,12):
     url = URL_TEMPLATE.format(year,month) 
     # TODO implement the actual scraping of a single page
     # Note that you will need to pad single digit month with zeros

【讨论】:

    【解决方案2】:

    我只是尝试使用您最初的问题陈述从头开始编写它,它对我来说效果很好

    range_date = pd.date_range(start = '1/1/2009',end = '11/01/2018',freq = 'M')
    
    dates = [str(i)[:4] + str(i)[5:7] for i in range_date]
    
    lst = []
    
    index = []
    
    for j in tqdm(range(len(dates))):
    
          url = "http://www.estesparkweather.net/archive_reports.php?date="+ 
          dates[j] 
    
          page = requests.get(url)
          soup = BeautifulSoup(page.content, 'html.parser')
          table = soup.find_all('table')
        
    
          data_parse = [row.text.splitlines() for row in table]
          data_parse = data_parse[:-9] 
    
    for k in range(len(data_parse)):
        data_parse[k] = data_parse[k][2:len(data_parse[k]):3]
    
    
    
    for l in range(len(data_parse)):
        str_l = [('.'.join(re.findall("\d+",str(data_parse[l][k].split()[:5])))) for k in range(len(parsed_data[l]))]
        lst.append(str_l)
        index.append(dates[j] + str_l[0])
    
    d1_index = [index[i] for i in range(len(index)) if len(index[i]) > 6]
    data = [lst[i][1:] for i in range(len(lst)) if len(lst[i][1:]) == 19]
    
    d2_index = [datetime.strptime(str(d1_index[i]), '%Y%m%d').strftime('%Y-%m-%d') for i in range(len(d1_index))]
    
    desired_df = pd.DataFrame(data, index = d2_index)
    

    这应该是您想要的数据框,您可以对此进行进一步的操作

    ** 你需要导入所需的模块 ** 这从 2009 年 0 月 1 日到 2018 年 10 月 31 日提取的数据。您可能需要删除最后 3 条记录才能获取到 2018 年 10 月 28 日

    【讨论】:

    • 请修复导入
    • @cards import html5lib from tqdm import tqdm from pandas_datareader import data,wb
    • 这是我用于报废的三个导入
    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 2017-02-15
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多