python爬蟲學習:將異步傳輸的天氣數據寫入到excel表格

前言

純粹學習一下爬蟲,以後拿數據之類的保不準真的要用到,本篇聊作學習記錄。

1、網頁url查看

現在的網頁都是異步傳輸的網頁了,就是說地址欄的網址不變的情況下刷新網頁的一部分內容

所以從地址欄網址上根本看不出異步響應傳輸的信息,因此需要使用瀏覽器查看響應信息

以chrome爲例:

第一步:打開需要爬的網頁,按F12或者空白處右鍵,檢查

第二步:打開的檢查窗口最上方的NetWork標籤

第三步:在網頁上點擊異步響應的操作,比如選擇框選擇、按鈕重新第點按等

第四步:查看檢查窗口Network下左下方的Name,點擊最新的響應文件,查看RequestURL就可以看到每次異步操作的url了

第五步:根據異步響應的url判斷需要修改的參數是哪些

例如我在http://tianqi.2345.com/wea_history/59287.htm 重新選擇月份,獲得每個月的歷史天氣,根據三次響應的URL可以判斷年份和月份的位置

查看url

2、網站數據獲取與存儲

直接上代碼吧,話不多說,都在註釋裏面了:

import requests
import xlwt
from bs4 import BeautifulSoup as bs

# 實際得到的表格內部內容有一些多餘的要去除
def tagString(str):
    return str.get_text().strip().split("<")[0]


def get_tag(year, month):
    """
    requests使用:
        requests.get(url)獲取網址信息
        response.content獲取二進制數據,response.text獲取自動解碼數據
        但是自動解碼使用的方法可能無法得到正確的信息,因此採用對content的手動解碼
        response.content.decode('解碼方法') 直接使用utf8會出現某些信息還是unicode編碼格式,unicode_escape可以避免這種錯誤
        使用beautifulSoup獲取html頁面的信息,html.parser方法無需額外的語言庫,lxml方法需要額外的c語言庫
    beautifulSoup常用方法:
        soup.th:獲取的數據是bs4.element.Tag對象
        soup.span.attrs:獲取的數據是span的屬性,比如id、class、style等,爲字典類型
        soup.find_all(th):獲取到的數據是bs4.element.ResultSet對象,類似於list
        soup.find_all(th)[0].get_text():其中get_text()方法獲取標籤內部的文字,信息如果出現亂碼之類的還要自行處理一下
    """
    # 獲取網頁內容
    response = requests.get(
        "http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=59287&areaInfo%5BareaType%5D=2&date%5Byear%5D=" + year + "&date%5Bmonth%5D=" + month)
    soup = bs(response.content.decode("unicode_escape"), "html.parser")

    # 正則表達式常用方法:
    # 只獲得單一標籤數據的時候,也可以使用正則表達式
    # 正則表達式有很多教程,我這裏只寫一個 .* 指的是中間可以爲任意
    # 例如:reg = r'<td>.*</td>',可以找到所有<td></td>標籤的內容,但是同時會帶有<td>標籤,後續仍需處理
    # condition = re.compile(reg)
    # textlist = re.findall(condition, theContent)

    tr = soup.find("table").find_all("tr")  # 獲得table中的所有記錄行,th是字段行,tr是記錄行
    trlist = []
    for j in tr:
        td = j.find_all("td")  # 獲得一個tr中的所有td,學過前端的應該很好理解
        date = tagString(td[0])
        temp = tagString(td[1])
        weather = tagString(td[2])
        wind = tagString(td[3])
        air = tagString(td[4])
        trlist.append([date, temp, weather, wind, air])
    return trlist


if __name__ == "__main__":
    """
    xlwt 三步走:
        先workbook建立文件,後add_sheet建立工作簿
        sheet.write(行,列,label=內容)
        workbook.save("文件名稱.xls")保存文件
    """
    # 建立excel文件
    wb = xlwt.Workbook(encoding="utf-8")
    sheet1 = wb.add_sheet("sheet1")
    data = [["時間", "氣溫", "天氣", "風力", "空氣質量"]]  # 這裏是寫入excel的字段名稱,放在第一行
    
    # 獲取2018年到2020年5月份的廣州的天氣數據
    for year in range(2018, 2021):  # 左閉區間[2018,2021)
        maxMonth = (13 if year < 2020 else 6)
        for month in range(1, maxMonth):
            print(year, month)
            data += get_tag(str(year), str(month))
            
    # 寫入excel,注意保存爲xls
    col = len(data[0])
    row = len(data)
    for i in range(row):
        for j in range(col):
            sheet1.write(i, j, label=data[i][j])
    wb.save("天氣.xls")

參考:

爬蟲學習:https://blog.csdn.net/weixin_43488742/article/details/90742453

beautifulSoup介紹:http://www.jsphp.net/python/show-24-214-1.html

歷史天氣查詢網址:http://tianqi.2345.com/wea_history/59287.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章