如何抓取网页数据(本例如何从网站下载数据中提供日常更新数据?)

优采云 发布时间: 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(&#x27;(?

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线