如何抓取网页数据(本例如何从网站下载数据中提供日常更新数据?)
优采云 发布时间: 2021-10-31 14:08如何抓取网页数据(本例如何从网站下载数据中提供日常更新数据?)
有时出于某种目的,我们可能需要从某些网站 获取一些数据。如果网站提供了下载选项,那么我们可以直接从网站下载。当然,有些网站可能只提供每日更新,但是如果没有提供下载选项,我们就得另辟蹊径了。
如果你只是想突然从某个网站获取数据,即使没有可用的下载,也只需复制粘贴即可。如果需要大量的数据,复制粘贴太费时,或者需要从某个网站中获取一些数据,那么就得考虑(code)do(substitute)方法(code )。
由于本人是气象学家,本例将以怀俄明大学提供的探测数据下载为例,谈谈如何从某个网站下载数据。
打开网站后,我们会看到一些选择区域、日期和站点的选项。
绘图类型提供了许多选项
但在这里我们只下载探测数据并选择默认选项 Text:List。而我们通常需要的是国内的探空数据,所以在Region项中选择*敏*感*词*。
在站点字段中输入 58238。如果您知道站点编号,则可以直接输入。如果不知道,可以直接在地图上点击站点编号。
然后按回车查看测深数据页面
因为我们只选了一次,所以探探信息只有一次。而且,从网页上给出的数据可以看出,给出的信息非常清晰,基本上只有测深数据和一些计算出来的指标。
在测深数据页面右击查看页面源码:
可以看出,我们可以使用的信息是H2、PRE、H3标签对应的信息,PRE标签对应的是sounding data、site信息和sounding index信息。
获取网页地址,然后就可以直接从网页下载数据了。
使用的库:BeautifulSoup4、requests
import requests
from bs4 import BeautifulSoup
url = 'http://weather.uwyo.edu/cgi-bin/sounding?region=seasia&TYPE=TEXT%3ALIST&YEAR=2017&MONTH=06&FROM=2112&TO=2112&STNM=58238'
# 使用requests 获取网页数据,然后用 BeautifulSoup 解析网页
data = BeautifulSoup(requests.request('get', url).text, 'lxml')
# 打印 站点信息
print(data.h2.string)
# 打印探空数据
print(data.pre.get_text())
# 保存探空数据到文件
uppair = open(r'F:\uppair.txt', 'w')
print(data.pre.get_text(), file = uppair)
# 一定要关闭
uppair.close()
于是下载了测深数据
-----------------------------------------------------------------------------
PRES HGHT TEMP DWPT RELH MIXR DRCT SKNT THTA THTE THTV
hPa m C C % g/kg deg knot K K K
-----------------------------------------------------------------------------
1000.0 7 26.0 22.7 82 17.72 115 6 299.1 351.1 302.3
925.0 720 21.4 18.4 83 14.62 150 16 301.2 344.4 303.8
850.0 1449 17.4 11.4 68 10.05 130 17 304.4 334.7 306.2
700.0 3084 9.2 -1.8 46 4.81 100 19 312.6 328.1 313.6
500.0 5790 -4.9 -12.9 53 2.85 280 17 327.0 336.9 327.6
400.0 7510 -16.5 -21.0 68 1.80 280 39 333.5 340.0 333.8
300.0 9600 -32.7 -43.7 33 0.27 260 62 339.2 340.3 339.2
250.0 10870 -40.3 -56.3 16 0.07 250 85 346.0 346.4 346.0
220.0 11724 -46.3 -61.7 16 0.04 245 91 349.7 349.9 349.7
200.0 12360 -50.7 -65.7 15 0.03 250 89 352.3 352.5 352.3
150.0 14180 -62.3 250 78 362.6 362.6
118.0 15633 -70.3 270 64 373.6 373.6
100.0 16620 -68.9 270 47 394.4 394.4
70.0 18750 -64.7 305 10 445.6 445.6
50.0 20820 -58.3 105 10 505.7 505.7
30.0 24060 -53.7 80 21 597.6 597.6
20.0 26700 -48.9 90 33 685.7 685.7
你认为代码现在结束了吗?如果每次都手动确定网页的网址,复制和粘贴有什么区别?为了以后节省很多时间,我们来看看网页网址的特点:
http://weather.uwyo.edu/cgi-bin/sounding?region=seasia&TYPE=TEXT%3ALIST&YEAR=2017&MONTH=06&FROM=2112&TO=2112&STNM=58238
URL中有region、TYPE、YEAR、MONTH、STNM,天的选择由FROM和TO控制。对应每个选项在选择网页时选择地区、日期、站点等信息。
*敏*感*词*的region值是seasia,北美的region值是naconf,但是在下载数据的时候,真正控制选择的探测数据的是站点和日期信息。区域信息并不重要。
因此,以后选择下载探测数据时,只需根据需要修改URL即可。例如,获取2017.6.20 8:00到2017.6.22 8:00的探测数据,URL应为:
http://weather.uwyo.edu/cgi-bin/sounding?region=naconf&TYPE=TEXT%3ALIST&YEAR=2017&MONTH=06&FROM=2000&TO=2200&STNM=58238
注:探测时间为UTC时间。同时注意region值是naconf,也可以得到正确的测深数据。2000对应的时间是日和小时,前两位对应的是天,后两位对应的是小时。
细心的你可能已经发现,上面打印PRE标签信息的时候,打印的是sounding信息,但是打印的时候没有指定index。这就是问题所在:如果有多个信息对应同一个标签,默认获取第一条信息。要获取所有信息,您可以使用 ing_all 方法。
print(data.find_all('pre')[1].string)
Station identifier: ZSNJ
Station number: 58238
Observation time: 170621/1200
Station latitude: 32.00
Station longitude: 118.80
Station elevation: 7.0
Showalter index: 4.27
Lifted index: -1.30
LIFT computed using virtual temperature: -1.80
SWEAT index: 276.75
K index: 22.70
Cross totals index: 16.30
Vertical totals index: 22.30
Totals totals index: 38.60
Convective Available Potential Energy: 637.33
CAPE using virtual temperature: 813.63
Convective Inhibition: -22.85
CINS using virtual temperature: -10.14
Equilibrum Level: 243.86
Equilibrum Level using virtual temperature: 243.14
Level of Free Convection: 829.33
LFCT using virtual temperature: 884.16
Bulk Richardson Number: 1946.17
Bulk Richardson Number using CAPV: 2484.53
Temp [K] of the Lifted Condensation Level: 293.58
Pres [hPa] of the Lifted Condensation Level: 928.82
Mean mixed layer potential temperature: 299.87
Mean mixed layer mixing ratio: 16.61
1000 hPa to 500 hPa thickness: 5783.00
Precipitable water [mm] for entire sounding: 44.52
如果要在获取台站信息和探测索引信息后获取相应的数值信息,则必须使用正则表达式。
使用的库:re
<p>import re
# 获取对流有效位能值
cape = re.findall('(?