Python 爬虫之使用selenium自动打开浏览器,并且访问对应的网页获取网页表格数据
代码如下:
#!/usr/local/bin/python
# coding: utf-8
import configparser
import time
from selenium import webdriver
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.webdriver.chrome.options import Options
import pandas as pd
import warnings
warnings.filterwarnings('ignore', category=UserWarning)
warnings.filterwarnings('ignore', category=FutureWarning)
# 启动 Chrome 浏览器(需要安装 ChromeDriver)
driver = webdriver.Chrome()
url='https://cn.investing.com/equities/conoco-phillips-historical-data'
# 访问目标 URL
driver.get(url)
# 最小化浏览器
# driver.minimize_window()
driver.set_window_position(-10000, 0)
# 等待表格数据加载(这里需要根据实际情况设置等待条件)
# 假设表格有一个特定的 ID 或类名,你可以使用它作为等待条件
# 如果表格是通过 AJAX 加载的,你可能需要等待某个特定的元素出现
# 例如,等待表格的某个元素可见
# random_num = random.randint(30, 50)
random_num = 10
wait = WebDriverWait(driver, timeout=random_num)
css = '.freeze-column-w-1.w-full.overflow-x-auto.text-xs.leading-4'
element = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, css)))
# emelemt = wait.until()
# 假设你已经等待了足够长的时间,表格数据已经加载
# 使用 pandas 读取表格数据(这可能需要一些额外的 HTML 处理,因为 Selenium 返回的是页面的完整 HTML)
# 通常,你需要找到包含表格的特定元素,然后将其 HTML 传递给 pandas.read_html
# 这里只是一个示例,你需要根据实际情况调整
# table_html = driver.find_element(By.CLASS_NAME, 'freeze-column-w-1 w-full overflow-x-auto text-xs leading-4').get_attribute('outerHTML')
# 使用xpath选择元素
# table_html = driver.find_element(By.XPATH,"//table[@class='freeze-column-w-1 w-full overflow-x-auto text-xs leading-4']").get_attribute('outerHTML')
# /html/body/div[1]/div[2]/div[2]/div[2]/div[1]/div[3]/div[3]/table
# 使用 class_name选择
# table_html = driver.find_element(By.CLASS_NAME,
# "freeze-column-w-1").get_attribute(
# 'outerHTML')
# 使用cssselector选择元素
css = '.freeze-column-w-1.w-full.overflow-x-auto.text-xs.leading-4'
table_html = driver.find_element(By.CSS_SELECTOR,
value=css).get_attribute(
'outerHTML')
dfs = pd.read_html(str(table_html))
df = dfs[0] # 假设我们想要第一个表格
df.fillna(0, inplace=True)
# 关闭浏览器
driver.quit()
# 打印数据(如果成功获取)
print(df)