【问题标题】:Problems scraping data from a webpage that takes time to load从需要时间加载的网页中抓取数据的问题
【发布时间】:2020-11-01 11:36:09
【问题描述】:

作为练习的一部分,我正在尝试从网页中抓取数据,但网页的设置方式似乎让我的一些努力受挫。基本上,我认为网页需要一段时间来加载我感兴趣的功能,因此,当我运行代码来提取我想要的数据时,它会失败。这是网页:https://www.cbn.gov.ng/rates/ExchRateByCurrency.asp

我注意到即使检查源代码,表格部分也需要一段时间才能加载。

这是我的代码:

from bs4 import BeautifulSoup as bs
from requests import get

html = get("https://www.cbn.gov.ng/rates/ExchRateByCurrency.asp").text

html = bs(html,"lxml")
html = html.find("div",id="ContentTextinner")

现在如果我运行这个html.tbody,这是我的输出:

相比之下,网站本身在加载完成后,显然在该部分中有很多内容:

在打开检查视图的情况下重新加载网页后,我发现源代码本身直到一秒钟左右才完全加载。我想这可能就是为什么html.tbody 显示为空的原因,即使在完全加载的页面中,它充满了有价值的信息。我想请教一下如何解决这个问题?

【问题讨论】:

  • 我没用过bs4,但是你的代码中不能有一个函数等待,直到加载id为“exTable”的dom元素?然后做你想做的事?另外,检查 URL 是否使用 AJAX 呈现所需的表,它们在页面加载后延迟,以减少页面加载时间?
  • @anuraagt​​ummanapally 我不知道该怎么做。如果您能指出相关方向,我将不胜感激。

标签: python html web-scraping


【解决方案1】:

您可以使用像 selenium 这样的库来实现这一点。

例如:

from selenium import webdriver
from bs4 import BeautifulSoup as bs

driver = webdriver.Firefox()
driver.get("https://www.cbn.gov.ng/rates/ExchRateByCurrency.asp")

html = driver.page_source
print(html.find("div",id="ContentTextinner"))

driver.quit()

【讨论】:

  • 不幸的是我试过了,但它给了我这个错误:AttributeError: 'NoneType' object has no attribute 'page_source'。有什么想法吗?
  • @AbubakarPopoola 抱歉,我已经编辑了我的代码。你不应该再收到那个错误了。
【解决方案2】:

我想这就是你要找的东西:

import requests as r

res = r.get('https://www.cbn.gov.ng/rates/outputExchangeRateJSN.asp')
if res.status_code == 200:
    data = res.json()
    # Do something with the data
else:
    print(f"Error: {res.status_code}")

您将以JSON 的形式获取数据并从那里提取您需要的数据。

这是因为动态请求填充页面的主体,这就是为什么您无法找到最初的内容。

您也可以使用此链接将其下载为包含所有内容的CSV 文件:CSV_File

【讨论】:

  • 我试试看。谢谢。
  • 不客气。我邀请您也检查我的编辑。
  • @b14d35 我已经编辑了代码。 1) 检查 http 状态码 2) 我让请求为我构建字典
  • @balderman 我试过了。太棒了,但你怎么知道使用那种链接?毕竟和我的不一样。我也知道 csv 下载可用,但这更多是为了练习我的抓取和数据操作技能。我想以类似的方式抓取另一个网站,但我认为不存在这样的链接。即使它是我想知道如何在没有它的情况下解决这个问题。
  • 我通常在 chrome 控制台中打开网络选项卡并检查 XHR 请求并查看它发送什么样的数据以及它得到的结果,如果它是我正在寻找的,我会使用它。
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 2013-08-11
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2014-02-20
  • 1970-01-01
相关资源
最近更新 更多