【问题标题】:Scrape Dynamic contents created by Javascript using Python使用 Python 抓取 Javascript 创建的动态内容
【发布时间】:2018-10-01 00:32:15
【问题描述】:

我想使用 python 脚本废弃由 javascript 函数创建的 DIV 内容。我已经尝试过使用 BS4 并且通过这样做我无法获得动态数据。相反,它只显示源代码。

示例代码:

import requests
from bs4 import BeautifulSoup

URL = "https://rawgit.com/skysoft999/tableauJS/master/example.html"
r = requests.get(URL)

soup = BeautifulSoup(r.content, 'html5lib')


for row in soup.findAll('div', attrs = {'class':'quote'}):
    print(row)


print(soup.prettify())

示例 HTML 源代码位于 Pastebin

要提取的样本数据:

【问题讨论】:

标签: python arrays python-3.x web-scraping beautifulsoup


【解决方案1】:

初始 HTML 不包含您要抓取的数据,这就是为什么仅使用 BeautifulSoup 是不够的。您可以使用Selenium 加载页面,然后抓取内容。

代码:

import json

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

html = None
url = 'http://demo-tableau.bitballoon.com/'
selector = '#dataTarget > div'
delay = 10  # seconds

browser = webdriver.Chrome()
browser.get(url)

try:
    # wait for button to be enabled
    WebDriverWait(browser, delay).until(
        EC.element_to_be_clickable((By.ID, 'getData'))
    )
    button = browser.find_element_by_id('getData')
    button.click()

    # wait for data to be loaded
    WebDriverWait(browser, delay).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, selector))
    )
except TimeoutException:
    print('Loading took too much time!')
else:
    html = browser.page_source
finally:
    browser.quit()

if html:
    soup = BeautifulSoup(html, 'lxml')
    raw_data = soup.select_one(selector).text
    data = json.loads(raw_data)

    import pprint
    pprint.pprint(data)

输出:

[[{'formattedValue': 'Atlantic', 'value': 'Atlantic'},
  {'formattedValue': '6/26/2010 3:00:00 AM', 'value': '2010-06-26 03:00:00'},
  {'formattedValue': 'ALEX', 'value': 'ALEX'},
  {'formattedValue': '16.70000', 'value': '16.7'},
  {'formattedValue': '-84.40000', 'value': '-84.4'},
  {'formattedValue': '30', 'value': '30'}],
  ...
]

代码假定按钮最初被禁用:<button id="getData" onclick="getUnderlyingData()" disabled>Get Data</button> 并且数据不会自动加载,而是由于单击了按钮。因此,您需要删除此行:setTimeout(function(){ getUnderlyingData(); }, 3000);

您可以在此处找到示例的工作演示:http://demo-tableau.bitballoon.com/

【讨论】:

  • 我收到的最有帮助的答案之一。你拯救了我的一天。感谢您的快速反应和技巧。
  • @Jatimir 如何解决问题中提到的相同问题,但该元素是由 PHP 脚本生成的。这是我的问题。 link
  • 有什么方法可以使用这个来抓取这个网站? tradingview.com/symbols/INDEX-MMTW
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2013-07-10
  • 2016-03-20
  • 2023-01-29
  • 2020-05-24
相关资源
最近更新 更多