【发布时间】:2019-07-30 11:44:19
【问题描述】:
我想抓取此页面(以及类似页面)的数据:https://cereals.ahdb.org.uk/market-data-centre/historical-data/feed-ingredients.aspx
此页面使用Power BI。不幸的是,找到一种刮取 Power BI 的方法很难,因为每个人都想刮取 使用/进入 Power BI,而不是从中。最接近的答案是this question。然而无关。
首先,我使用Apache tika,加载页面后很快我意识到表格数据正在加载。我需要页面的渲染版本。
因此,我使用了Selenium。一开始我想Select All(发送Ctrl+A组合键),但它不起作用。可能是受页面事件限制(我也尝试使用开发者工具删除所有事件,但Ctrl+A 仍然不起作用。
我也尝试阅读 HTML 内容,但 Power BI 使用 position:absolute 将 div 元素放在屏幕上,并且区分 div 在表格中的位置(行和列)是一项费力的活动。
由于 Power BI 使用 JSON,我尝试从那里读取数据。但是它太复杂了,我找不到规则。似乎它将关键字放在某处并在表中使用它们的索引。
注意:我意识到所有数据都没有加载,甚至没有同时显示。 div 类 scroll-bar-part-bar 负责充当滚动条,并移动它来加载/显示数据的其他部分。
我用来读取数据的代码如下。如前所述,生成数据的顺序与在浏览器上呈现的顺序不同:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
options = webdriver.ChromeOptions()
options.binary_location = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
driver = webdriver.Chrome(options=options, executable_path="C:/Drivers/chromedriver.exe")
driver.get("https://app.powerbi.com/view?r=eyJrIjoiYjVjM2MyNjItZDE1Mi00OWI1LWE5YWYtODY4M2FhYjU4ZDU1IiwidCI6ImExMmNlNTRiLTNkM2QtNDM0Ni05NWVmLWZmMTNjYTVkZDQ3ZCJ9")
parent = driver.find_element_by_xpath('//*[@id="pvExplorationHost"]/div/div/div/div[2]/div/div[2]/div[2]/visual-container[4]/div/div[3]/visual/div')
children = parent.find_elements_by_xpath('.//*')
values = [child.get_attribute('title') for child in children]
我很欣赏上述任何问题的解决方案。不过,对我来说最有趣的是以 JSON 格式存储 Power BI 数据的约定。
【问题讨论】:
-
@user308827 老实说,您可能应该为赏金创建自己的问题,从地图上抓取似乎是一个不同的过程。或者,您可以通过网络请求手动获取地图数据
-
仅供参考,它是 scrape 不是废品
标签: python selenium web-scraping powerbi