首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python抓取Javascript创建的动态内容

使用Python抓取Javascript创建的动态内容
EN

Stack Overflow用户
提问于 2018-04-20 18:04:45
回答 1查看 10.9K关注 0票数 3

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

示例代码:

代码语言:javascript
复制
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())

示例超文本标记语言源代码在Pastebin

要提取的样本数据:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-21 00:40:56

初始的超文本标记语言不包含您想要抓取的数据,这就是为什么只使用BeautifulSoup是不够的。您可以使用Selenium加载页面,然后抓取内容。

代码:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
[[{'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/

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49939123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档