使用selenium webdriver爬取动态网页数据及过程中遇到的问题总结

本文介绍了使用selenium webdriver登录网站并爬取动态网页数据的过程,包括登录、切换iframe、解析HTML代码。通过正则、BeautifulSoup和lxml三种方式提取信息,并将数据写入csv文件。还提到了动态加载导致的元素隐藏问题及其解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整个过程为登录一个网站,然后从网站中爬取结构化的信息,写入csv文件的过程。

没有写明网址,实际上哪个网站不重要,重要的是此过程中使用的方法,它们都是想通的,理解整个过程,然后灵活使用即可。

文中有使用三种方式来解析网页,以下为整个过程代码(使用的是python3.7):

 

#!/usr/bin/python

# -*- coding: utf-8 -*-

 

import csv
import re
import time
from selenium import webdriver
from bs4 import BeautifulSoup
from lxml import etree


def login(driver, url):

    ‘’‘
       登录网站
    “”“
    driver.get(url)  # 进入网站登录页面
    driver.implicitly_wait(30)  # 智能等待元素加载完成
    # 需要特别说明的是:
    #    隐性等待对整个driver的周期都起作用,所以只要设置一次即可,
    #    我曾看到有人把隐性等待当成了sleep在用,走哪儿都来一下…
    #    (没发现这句话前,我也是这莫干的...)
    
    time.sleep(2)
    driver.find_element_by_xpath('//*[@id="dl"]/input[1]').send_keys('你的用户名')
    driver.find_element_by_id('password').click()
    
    # 因为密码框中有js的存在,不能直接输入密码,所以需要通过执行js代码来输入密码
    driver.execute_script('document.getElementById("password").value="你的密码"')
    # 或者通过jquery的方式:
    # driver.execute_script("$('#password').val('你的密码')")
    time.sleep(1.5)
    driver.find_element_by_xpath('//*[@id="dl"]/input[4]').submit()
    driver.find_element_by_xpath('//*[@id="apDiv33"]/a').click

为了使用 Selenium 爬取股票的实时动态数据,需要结合浏览器自动化工具与数据解析逻辑。Selenium 能够模拟真实用户操作浏览器的行为,例如点击、滚动和输入文本,并且能够加载由 JavaScript 动态生成的内容,这对于抓取现代网页上的实时数据非常关键。 ### 设置环境 首先确保安装了以下依赖: - Python - Selenium 库:`pip install selenium` - 浏览器驱动程序(如 ChromeDriver 或 GeckoDriver) - 可选:Pandas 用于处理数据 `pip install pandas` ### 获取实时股票数据的基本流程 1. **初始化浏览器实例** 使用 Selenium 创建一个无头模式(Headless)的浏览器会话以提高效率并减少资源占用[^2]。 ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options import time chrome_options = Options() chrome_options.add_argument("--headless") # 启用无头模式 driver = webdriver.Chrome(options=chrome_options) ``` 2. **访问目标网站** 打开提供实时股票数据的网站,例如 Yahoo Finance 或 Google Finance。 ```python driver.get("https://finance.yahoo.com/quote/AAPL?p=AAPL") ``` 3. **等待页面加载完成** 因为许多金融网站通过 JavaScript 异步加载数据,因此需要短暂休眠或使用显式等待来确保数据渲染完毕[^2]。 ```python time.sleep(5) # 简单等待5秒,根据实际情况调整时间 ``` 4. **提取所需数据** 使用 CSS 选择器或 XPath 定位包含股票价格或其他信息的 HTML 元素。 ```python stock_price_element = driver.find_element("css selector", ".D\(b\).Fz\(36px\)") stock_price = stock_price_element.text print(f"当前股价: {stock_price}") ``` 5. **关闭浏览器** 数据采集完成后关闭浏览器实例以释放资源。 ```python driver.quit() ``` ### 处理反爬机制 由于越来越多的网站采用复杂的反爬虫技术,包括但不限于 CAPTCHA 和行为分析[^4],可以采取如下策略: - 使用代理 IP 池轮换请求来源 - 随机化请求间隔时间 - 模拟用户行为(如随机移动鼠标、滚动页面) ### 示例整合代码 将上述步骤整合为一个完整的脚本示例: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options import time import pandas as pd def fetch_stock_data(): chrome_options = Options() chrome_options.add_argument("--headless") driver = webdriver.Chrome(options=chrome_options) try: driver.get("https://finance.yahoo.com/quote/AAPL?p=AAPL") time.sleep(5) # 等待页面加载 price_element = driver.find_element("css selector", ".D\(b\).Fz\(36px\)") change_element = driver.find_element("css selector", ".TrendIndicator-and-chart-text-container .Fz\(s\)") data = { "Stock Price": [price_element.text], "Change": [change_element.text] } df = pd.DataFrame(data) print(df) finally: driver.quit() if __name__ == "__main__": fetch_stock_data() ``` ### 注意事项 - 确保遵守目标网站的服务条款,避免非法抓取。 - 对于频繁更新的数据,考虑设置定时任务定期运行脚本。 - 如果遇到复杂的前端交互问题,可参考 Docker 构建 Python Web 应用的最佳实践[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值