pre*_*edu 4 javascript python iframe web-scraping selenium-webdriver
我对网络抓取和Python还很陌生。我试图制作一个从http://finra-markets.morningstar.com/BondCenter/BondDetail.jsp?symbol=NFLX4333665&ticker=C647273获取最后交易价格的脚本,但当我用 python 请求时,某些内容似乎丢失了。我之前制作过从其他网站成功获取数据的脚本,但我似乎无法让我的代码在该网站上运行。
到目前为止,这是我的代码:
from bs4 import BeautifulSoup
import requests
r = requests.get("http://finra-markets.morningstar.com/BondCenter/BondDetail.jsp?symbol=NFLX4333665&ticker=C647273")
c = r.content
soup = BeautifulSoup(c, "html.parser")
all = soup.find_all("div", {"class": "gr_row_a5"})
print(soup)
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,大多数重要数据都丢失了。
任何帮助将非常感激。
小智 6
有些网页使用Javascript填充数据,看起来是页面内容的内容实际上并不是Beautiful Soup正在处理的HTML。这是其中一页。
这很令人困惑,因为如果您使用 Safari 或 Chrome 中的 Web 开发人员工具检查显示的页面,您会发现已渲染到 DOM 中的 HTML。然而,如果你查看页面源代码,你根本找不到它。
所以对于这个页面,你无法用Beautiful Soup解析出数据。一种替代方案是建立一个以更直接的方式为您提供数据的网站。另一种可能是尝试该requests-html库,它可以运行 Javascript,然后您可以从呈现的 HTML 中抓取数据。(注意:我自己从未尝试过requests-html,以这种方式运行 Javascript 时应该小心,但这是一种可行的方法。)还有一些项目,人们使用 Selenium 或类似的东西作为获取 HTML 的方法刮。但requests-html看起来是最简单的尝试。
小智 5
使用 iframe 时要小心
如果观察到div class="gr_row_a5"放置在iframe内。要在 iframe 内抓取数据,您需要进入该 iframe 内部,然后需要获取页面源。
from selenium import webdriver
import selenium
import httplib
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import WebDriverException
from datetime import datetime as dt
from bs4 import BeautifulSoup
browser = webdriver.Chrome()
browser.delete_all_cookies()
browser.get('http://finra-markets.morningstar.com/BondCenter/BondDetail.jsp?symbol=NFLX4333665&ticker=C647273')
iframe = browser.find_element_by_id('ms-bond-detail-iframe')
browser.switch_to_frame(iframe)
c = browser.page_source
soup = BeautifulSoup(c, "html.parser")
all = soup.find_all("div", {"class": "gr_row_a5"})
print(all)
Run Code Online (Sandbox Code Playgroud)
希望这能解决您的问题,如果没有请告诉我。谢谢