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

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