【问题标题】:Speed up BeautifulSoup parsing?加速 BeautifulSoup 解析?
【发布时间】:2019-08-14 18:19:24
【问题描述】:

我需要处理来自这个网站 (https://www.ftp.ncep.noaa.gov/data/nccf/com/gfs/prod/gfs.20190814/06/) 的天气数据,每个文件大约 300MB。下载文件后,我只需要读取其中的一个子集。我觉得下载会太慢,所以我打算用 BeautifulSoup 直接从网站读取数据,像这样

from bs4 import BeautifulSoup
import requests

url = 'https://www.ftp.ncep.noaa.gov/data/nccf/com/gfs/prod/gfs.20190814/06/gfs.t06z.pgrb2.0p25.f000'
response = requests.get(url)
soup = BeautifulSoup(response.content, features='lxml')

然后使用pygrib 库读取生成的 .grib(一种天气数据格式)文件的子集。 然而,这也被证明太慢了,每天需要完成 50 次的事情大约需要 5 分钟。有没有我没有想到的更快的替代方案?

【问题讨论】:

  • 你想获取什么数据,如果问题是下载文件,你必须在 noaa api 中缩小搜索范围。如果你不能这样做,你可能会被下载大文件所困。或者以完全不同的方式抓取数据。
  • 是的,信息是文件的一个子集,我可以使用 pygrib 命令解析该子集,但只有完整文件可用
  • 数据是否存在于 noaa 站点的某个位置?你能直接从网站上废弃它,而不是使用完整的文件吗?例如。导航到旧金山的天气并找到他们在页面上显示的温度。这样您就不必下载文件。否则,您可以参考这个问题,并可能获取您想要的文件的特定字节,假设数据位置没有改变:stackoverflow.com/questions/1798879/…

标签: python beautifulsoup


【解决方案1】:

您可以做的是下载匹配的.idx 文件,它会为您提供主文件中的偏移量和大小。然后,您可以识别您需要的文件部分,并使用已接受的Only download a part of the document using python requests 答案中提到的技术来获取这些位。

您可能需要做一些额外的处理才能使用pygrib 读取它,最简单的选项可能是下载文件头和您想要的位感兴趣并将它们组合成一个文件,并在您不感兴趣的地方进行填充。

顺便说一句,您根本不需要 Beautiful Soup 处理! requests.get 响应的 content 部分是您需要的数据。

附加信息:

来自 cmets:

对于将来遇到此问题的任何人,对于 grib 文件,这是我发现的这个概念的工作大纲:gist.github.com/blaylockbk/…P.V.

【讨论】:

  • 对于将来遇到此问题的任何人,对于 grib 文件,这是我发现的这个概念的工作大纲:gist.github.com/blaylockbk/…
  • @P.V.感谢添加到答案中,以便保留它。
猜你喜欢
  • 1970-01-01
  • 2017-04-24
  • 2015-05-23
  • 2014-10-21
  • 2016-09-23
  • 2017-09-08
  • 2016-09-13
  • 2012-01-26
  • 2014-05-19
相关资源
最近更新 更多