天气预报爬取的python教程有很多,但时过境迁,教程上的有些办法已经不适用了。这里介绍我2020年6月29日爬取信息所用的代码。
天气预报的网址的获得
这里我爬取的目标网址为2345天气预报。
- 切换到历史天气选项卡,选择目标区域.
- F12打开开发者模式,找到Network选项卡。
- 在网页界面调整月份,开发者模式界面的Name对话框中会有一条新的记录,点开它。
- 打开“Headers”选项卡,记住(复制/保存)"Request URL: "后面的链接(这就是爬取数据所用的链接)。
获得链接中的所有内容
import requests
years = [2017, 2018, 2019, 2020] #所要爬取的年份
months = []
for year in years:
todo_urls = [f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=71920&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month+1}' # 刚刚保存的链接,将年和月的数字分别替换为“{year}”和“{year}”
for year in years
for month in range(12)]
datas = [] # 将所有的数据全部保存到datas中
for url in todo_urls:
r = requests.get(url)
if r.status_code != 200:
raise Exception()
data = r.text
datas.append(data)
数据的读取与保存
先用demjson把还是乱码的数据转化为能看懂的格式。
import demjson #使用demjson模块读取数据,没有的话pip install一下。
t = open("i.txt", "w") #将所有信息写入到txt中,方便整理。
for data in datas:
i = demjson.decode(data)
j = str(i) #将字典转化为文本
j = j.replace("</tr>", "\n") #原文本中的“\n”似乎在txt中不起作用,重新手动构建一些换行符。
t.write(j)
t.close()
数据的整理
因为不知道有什么好用的模块,所以只好选择手动整理,看起来很麻烦,但是如果熟练掌握复制粘贴也花费不了太多时间。
text = open("i.txt", "r")
tab = open("i.csv", "w")
tab.write("日期")
tab.write(",")
tab.write("最高气温(℃)")
tab.write(",")
tab.write("最低气温(℃)")
tab.write(",")
tab.write("天气")
tab.write(",")
tab.write("风")
tab.write(",")
tab.write("空气指数")
tab.write(",")
tab.write("空气质量")
for line in text.readlines():
line = str(line)
if "周" in line:
tab.write("\n")
a, b, c = line.partition("<td>")
a, b, e = c.partition(" 周")
tab.write(a)
tab.write(",")
a, b, c = e.partition(';\">')
a, b, e = c.partition("°")
tab.write(a)
tab.write(",")
a, b, c = e.partition(" >")
a, b, e = c.partition("°")
tab.write(a)
tab.write(",")
a, b, c = e.partition("<td>")
a, b, e = c.partition("</td>")
tab.write(a)
tab.write(",")
a, b, c = e.partition("<td>")
a, b, e = c.partition("</td>")
tab.write(a)
tab.write(",")
a, b, c = e.partition('">')
a, b, e = c.partition(" ")
tab.write(a)
tab.write(",")
a, b, c = e.partition('</span>')
tab.write(a)
tab.write(",")
tab.close()
text.close()
整理完毕,可以看一下整理的效果
因为我所关注的地区没有2017年4月23日及之前的信息,所以记录是从4月24日开始的。
image.png
网友评论