一、爬取单页信息
1. 导入必要的模块
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
import pandas as pd
selenium 模块:用于模拟浏览器操作,自动化处理网页交互。
webdriver:提供与浏览器交互的核心功能。
Service:管理 ChromeDriver 服务的类,指定驱动程序路径。
Options:用于设置 Chrome 浏览器的启动参数,例如无头模式等。
By:提供多种定位 HTML 元素的方法,例如通过 CSS_SELECTOR 或 TAG_NAME。
time:提供时间相关操作,这里用于设置延迟等待网页加载。pandas:用于数据处理和分析,将提取的数据存储为表格(DataFrame)格式,方便后续分析。
2. 设置 Chrome 浏览器选项
chrome_options = Options()
chrome_options.add_argument("--headless") # 如果不想显示浏览器窗口,可以加上这一行
chrome_options.add_argument("--disable-gpu") # 禁用GPU加速
chrome_options.add_argument("start-maximized") # 启动时最大化窗口
chrome_options.add_argument("--no-sandbox") # 取消沙箱模式
Options 对象:允许你为 Chrome 浏览器设置启动参数。
参数解释:
–headless:启用无头模式,不显示浏览器窗口。适用于后台运行。
–disable-gpu:禁用 GPU 加速,解决部分图形渲染问题。
start-maximized:以最大化窗口模式运行,确保网页布局不受窗口大小影响。
–no-sandbox:禁用沙箱模式,通常用于避免权限问题(Linux 系统常用)。
3. 配置 ChromeDriver 路径
driver_path = "C:\\chromedriver-win32\\chromedriver.exe" # 替换为下载的ChromeDriver路径
service = Service(driver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)
driver_path:指定 ChromeDriver 的路径,用于控制 Chrome 浏览器。
替换为你实际下载并解压的 chromedriver.exe 文件路径。
Service(driver_path):创建驱动服务实例。webdriver.Chrome:创建一个浏览器实例,启动 Chrome 浏览器。
4. 打开目标网站
url = "https://quote.stockstar.com/global/chinastock.htm"
driver.get(url)
driver.get(url):告诉浏览器打开目标网站。
这里使用的目标是 全景网国际股票页面,用于爬取中国股票的实时数据。
5. 等待页面加载
time.sleep(5) # 可以调整时间,确保页面完全加载
为什么要等待?
Selenium 是浏览器自动化工具,但很多网页内容是动态加载的(如通过 JavaScript 渲染)。
使用 time.sleep 强制等待页面加载完成,确保爬取的数据准确。
缺点:时间设置过短可能导致数据未加载完;时间过长会影响效率。
改进方法:可用 WebDriverWait 实现更智能的等待。
6. 获取表格数据
table = driver.find_element(By.CSS_SELECTOR, "table") # 根据实际的 HTML 元素选择表格
rows = table.find_elements(By.TAG_NAME, "tr") # 获取所有的行
find_element 和 find_elements 的区别:
find_element: 返回匹配的第一个元素。
find_elements: 返回所有匹配的元素(列表)。
定位表格:
By.CSS_SELECTOR: 用于通过 CSS 选择器定位 HTML 元素。
这里假设目标网页中的数据是以 [HTML_REMOVED] 元素展示的。
获取表格行:
find_elements(By.TAG_NAME, “tr”):提取 [HTML_REMOVED](行)元素,逐行处理表格数据。
7. 提取每行数据
data = []
for row in rows:
columns = row.find_elements(By.TAG_NAME, "td")
columns_data = [col.text for col in columns]
data.append(columns_data)
遍历每一行:
row.find_elements(By.TAG_NAME, “td”):获取该行中的所有列(单元格)。
提取单元格内容:
col.text:获取单元格中的文本内容。
将每行数据存入 data 列表
8. 关闭浏览器
driver.quit()
driver.quit():关闭浏览器并结束 Selenium 的所有进程,释放资源。
与 driver.close() 的区别:
quit():关闭所有窗口和驱动程序。
close():仅关闭当前窗口,但进程仍在运行。
9. 将数据转换为 DataFrame
df = pd.DataFrame(data)
print(df)
将提取的 data 列表转为 Pandas 的 DataFrame 格式,便于数据分析和处理。
输出表格内容。
使用场景
该代码适合以下场景:
自动化爬取网页中的表格数据(如股票、天气等)。
定期监控网页上的动态内容(如股票实时价格)。
将数据保存为本地文件或传入数据库中。
保存数据
# 保存 CSV 文件,防止中文乱码
df.to_csv("data.csv", index=False, encoding="utf-8-sig")
爬取的中文显示乱码是因为在保存为 CSV 文件时,默认编码可能不支持中文。一般情况下,默认编码为 utf-8 或系统的本地编码,而某些系统的 CSV 文件需要使用 utf-8-sig 编码才能正确显示中文,尤其是用 Excel 打开时。
10.完整代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
import pandas as pd
# 设置Chrome选项
chrome_options = Options()
chrome_options.add_argument("--headless") # 如果不想显示浏览器窗口,可以加上这一行
chrome_options.add_argument("--disable-gpu") # 禁用GPU加速
chrome_options.add_argument("start-maximized") # 启动时最大化窗口
chrome_options.add_argument("--no-sandbox") # 取消沙箱模式
# 设置 ChromeDriver 路径
driver_path = "C:\\chromedriver-win32\\chromedriver.exe" # 替换为你下载的ChromeDriver路径
service = Service(driver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)
# 打开目标网站
url = "https://quote.stockstar.com/global/chinastock.htm"
driver.get(url)
# 等待页面加载,确保数据可见
time.sleep(5) # 可以调整时间,确保页面完全加载
# 获取表格数据
table = driver.find_element(By.CSS_SELECTOR, "table") # 根据实际的 HTML 元素选择表格
rows = table.find_elements(By.TAG_NAME, "tr") # 获取所有的行
# 提取表格中的每一行数据
data = []
for row in rows:
columns = row.find_elements(By.TAG_NAME, "td")
columns_data = [col.text for col in columns]
data.append(columns_data)
# 关闭浏览器
driver.quit()
# 将数据转换为DataFrame并展示
df = pd.DataFrame(data)
print(df)
二、模拟翻页爬取全部信息
模块代码
# 设置爬取的页数(或直到没有“下一页”按钮)
for _ in range(10): # 假设爬取 10 页数据
time.sleep(3) # 等待页面加载,确保数据可见
# 获取当前页的表格数据
try:
table = driver.find_element(By.CSS_SELECTOR, "table") # 根据实际的 HTML 元素选择表格
rows = table.find_elements(By.TAG_NAME, "tr") # 获取所有的行
# 提取表格中的每一行数据
page_data = []
for row in rows:
columns = row.find_elements(By.TAG_NAME, "td")
columns_data = [col.text for col in columns]
page_data.append(columns_data)
all_data.extend(page_data) # 将当前页的数据添加到总数据列表中
except Exception as e:
print("未找到表格或数据获取失败:", e)
# 尝试点击“下一页”按钮
try:
next_button = driver.find_element(By.CSS_SELECTOR, "a.next") # 根据实际的 HTML 元素选择“下一页”按钮
next_button.click() # 点击“下一页”按钮
print("正在加载下一页...")
except Exception as e:
print("没有找到下一页按钮,停止爬取")
break # 如果找不到下一页按钮,停止爬取
完整代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
import pandas as pd
# 设置 ChromeDriver 路径和选项
chrome_options = Options()
chrome_options.add_argument("--headless") # 不显示浏览器窗口,后台运行
chrome_options.add_argument("--disable-gpu") # 禁用 GPU 加速
driver_path = "C:\\chromedriver-win32\\chromedriver.exe" # 替换为你的 ChromeDriver 路径
service = Service(driver_path)
# 启动浏览器
driver = webdriver.Chrome(service=service, options=chrome_options)
# 目标网站 URL
url = "http://example.com/data" # 替换为实际网站 URL
driver.get(url)
# 用于存储所有页的数据
all_data = []
# 设置爬取的页数(或直到没有“下一页”按钮)
for _ in range(10): # 假设爬取 10 页数据
time.sleep(3) # 等待页面加载,确保数据可见
# 获取当前页的表格数据
try:
table = driver.find_element(By.CSS_SELECTOR, "table") # 根据实际的 HTML 元素选择表格
rows = table.find_elements(By.TAG_NAME, "tr") # 获取所有的行
# 提取表格中的每一行数据
page_data = []
for row in rows:
columns = row.find_elements(By.TAG_NAME, "td")
columns_data = [col.text for col in columns]
page_data.append(columns_data)
all_data.extend(page_data) # 将当前页的数据添加到总数据列表中
except Exception as e:
print("未找到表格或数据获取失败:", e)
# 尝试点击“下一页”按钮
try:
next_button = driver.find_element(By.CSS_SELECTOR, "a.next") # 根据实际的 HTML 元素选择“下一页”按钮
next_button.click() # 点击“下一页”按钮
print("正在加载下一页...")
except Exception as e:
print("没有找到下一页按钮,停止爬取")
break # 如果找不到下一页按钮,停止爬取
# 关闭浏览器
driver.quit()
# 将所有数据存储为 DataFrame
df = pd.DataFrame(all_data)
df.to_csv("all_data.csv", index=False, encoding="utf-8-sig")
print("数据抓取完成,已保存到 all_data.csv")
备注
如果有广告遮挡时,使用 ActionChains 处理可能的广告遮挡
actions = ActionChains(driver)
actions.move_to_element(next_button).click().perform()