import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
url = "https://*****2345.com/Pc/GetHistory?areaInfo[areaId]=71731&areaInfo[areaType]=2&date[year]=2022&date[month]=3"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63',
'Host':'lishi.tianqi.com',
'Accept-Encoding': "gzip, deflate",
'Connection': "keep-alive",
'cache-control': "no-cache"}
可考虑将爬取的多个页面的数据存放在一个列表中,然后再进行遍历
r = requests.request('GET',url)
print(r.encoding)
print(r.apparent_encoding)
# r.encoding是根据http header推测出的编码方式,如果没有header,默认为ISO-8859-1。
# r.apparent_encoding是根据内容分析出来的编码方式,用这个代替r.encoding可以解析出中文。
# 可以在发送request请求前,先设置响应的编码方式。
# 如:r.encoding = "utf-8" 或"iso-8859-1"或"ascii"或"unicode-escape"
#encode()方法是字符串类型数据编码为字节型数据
#decode()方法是将字节型数据解码为字符型数据。
print(type(r.text))
print(type(r.content))
html_text = r.content.decode('unicode-escape')
html_text=html_text.replace("\/","/")
print(html_text)
soup = bs(html_text,'html.parser')
print(soup.prettify())
history_table=soup.find("table",{"class":"history-table"})
history_table
tr_all = history_table.find_all("tr")
print(tr_all[1])
2022-03-01 周二
7°
-2°
多云~晴
东北风1级
107 轻度
th_all=tr_all[0].find_all("th")
columns_name=list(thx.string for thx in th_all)
print(columns_name)
['日期', '最高温', '最低温', '天气', '风力风向', '空气质量指数']
td_all=tr_all[1].find_all('td')
td_all[5].text
'107 轻度'
data=[]
for trx in tr_all:
temp=[]
td_all=trx.find_all("td")
for tdx in td_all:
temp.append(tdx.text)
data.append(temp) if len(temp)>0 else 0
data[0:5]
[['2022-03-01 周二', '7°', '-2°', '多云~晴', '东北风1级', '107 轻度'],
['2022-03-02 周三', '9°', '0°', '多云', '东北风1级', '86 良'],
['2022-03-03 周四', '8°', '0°', '阴~多云', '东北风1级', '74 良'],
['2022-03-04 周五', '11°', '1°', '多云', '东北风1级', '69 良'],
['2022-03-05 周六', '10°', '1°', '阴~多云', '北风1级', '80 良']]
df=pd.DataFrame(data,columns=columns_name)
df.head()
日期 | 最高温 | 最低温 | 天气 | 风力风向 | 空气质量指数 | |
---|---|---|---|---|---|---|
0 | 2022-03-01 周二 | 7° | -2° | 多云~晴 | 东北风1级 | 107 轻度 |
1 | 2022-03-02 周三 | 9° | 0° | 多云 | 东北风1级 | 86 良 |
2 | 2022-03-03 周四 | 8° | 0° | 阴~多云 | 东北风1级 | 74 良 |
3 | 2022-03-04 周五 | 11° | 1° | 多云 | 东北风1级 | 69 良 |
4 | 2022-03-05 周六 | 10° | 1° | 阴~多云 | 北风1级 | 80 良 |
df.to_excel("./data/qianqi202203.xlsx",encoding='utf_8')