使用Selenium爬取Power BI Dashboard时列数据提取不全问题求助
PowerBI仪表板表格爬取数据不完整问题
使用Selenium爬取PowerBI仪表板中的表格数据时,仅首列(Job Name)能提取到全部362条数据,其余列数据均不完整:State列仅获取150条,Licensed列仅返回62条。无需点击操作,仅需滚动页面加载全部数据,且页面HTML结构一致。以下是我的代码,求找出问题所在:
import time from selenium.webdriver import Chrome, ChromeOptions 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 import webdriver option = webdriver.ChromeOptions() option.add_argument("--start-maximized") driver = webdriver.Chrome(options=option) wait = WebDriverWait(driver, 10) # Load the page driver.get("https://app.powerbi.com/view?r=eyJrIjoiNzA0MGM4NGMtN2E5Ny00NDU3LWJiNzMtOWFlMGIyMDczZjg2IiwidCI6IjM4MmZiOGIwLTRkYzMtNDEwNy04MGJkLTM1OTViMjQzMmZhZSIsImMiOjZ9&pageName=ReportSection") job_name_data_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Job Name"]'))) # Scroll down to the bottom of the page to load all the data while True: # Scroll down using JavaScript driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(1) # Adjust sleep time according to your page load speed # Check if we have reached the bottom of the page if driver.execute_script("return window.innerHeight + window.scrollY") >= driver.execute_script("return document.body.scrollHeight"): break # Extract the text from the Job Name data element after scrolling job_name_data = job_name_data_element.text ## state state_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="State"]'))) # Scroll down to the bottom of the page to load all the data while True: # Scroll down using JavaScript driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(1) # Adjust sleep time according to your page load speed # Check if we have reached the bottom of the page if driver.execute_script("return window.innerHeight + window.scrollY") >= driver.execute_script("return document.body.scrollHeight"): break state_data = state_column_element.text ## license licensed_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Licensed"]'))) while True: # Scroll down using JavaScript driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(1) # Adjust sleep time according to your page load speed # Check if we have reached the bottom of the page if driver.execute_script("return window.innerHeight + window.scrollY") >= driver.execute_script("return document.body.scrollHeight"): break licensed_data = licensed_column_element.text len(licensed_data) ## education education_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Education Requirement"]'))) while True: # Scroll down using JavaScript driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(1) # Adjust sleep time according to your page load speed # Check if we have reached the bottom of the page if driver.execute_script("return window.innerHeight + window.scrollY") >= driver.execute_script("return document.body.scrollHeight"): break education_data = education_column_element.text ## training training_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Amount of Training Required [In Hours]"]'))) training_data = training_column_element.text ## experience experience_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Amount of Experience Required"]'))) experience_data = experience_column_element.text ## pro exam exam_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Professional Exam"]'))) exam_data = exam_column_element.text ## renewal time renewal_time_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Required Time of License Renewal (In Years)"]'))) renewal_time_data = renewal_time_column_element.text ## continious education continious_education_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Continuing Education Requirement"]'))) continious_education_column_element_data = continious_education_column_element.text ## additional exams additional_exams_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Additional Required Exams"]'))) additional_exams_column_element_data = additional_exams_column_element.text ## continious education cost_of_licensure_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Cost of Initial Licensure (In Dollars)"]'))) cost_of_licensure_column_element_data = cost_of_licensure_column_element.text ## license renewal license_renewal_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Cost of License Renewal (In Dollars)"]'))) license_renewal_column_element_data = license_renewal_column_element.text ## reciprocity reciprocity_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Reciprocity or Endorsement"]'))) reciprocity_column_element_data = reciprocity_column_element.text ## character character_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Good Moral Character Requirement"]'))) character_column_element_data = character_column_element.text ## blanket ban ban_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Blanket Ban for Ex-Offenders"]'))) ban_column_element_data = ban_column_element.text ## rehab rehab_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Rehabilitation Requirement"]'))) rehab_column_element_data = rehab_column_element.text ## rehab rehab_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Rehabilitation Requirement"]'))) rehab_column_element_data = rehab_column_element.text ## relationship relationship_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Relationship between Offense and Occupation"]'))) relationship_column_element_data = relationship_column_element.text ## Limitations limitations_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Limitations on Scope of Inquiry"]'))) limitations_column_element_data = limitations_column_element.text ## age age_column_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[aria-label="Minimum Age (In Years)"]'))) age_column_element_data = age_column_element.text
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

