笨鸟编程-零基础入门Pyhton教程

 找回密码
 立即注册
查看: 34|回复: 0

水水水水水水水水水水

[复制链接]

新手上路

Rank: 1

积分
3
发表于 昨天 09:29 | 显示全部楼层 |阅读模式

Selenium 是一个用于自动化浏览器操作的工具,它支持多种编程语言(如 Python、Java、C#等)。通过 Selenium,我们可以模拟用户在浏览器中的行为(如点击按钮、填写表单、滚动页面等),从而实现对网页信息的抓取和分析。

与传统的 requests 和 BeautifulSoup 组合相比,Selenium 更适合处理动态加载的内容(如 JavaScript 渲染的页面)。因此,它是获取复杂 web 页面信息的重要工具。


2. 环境搭建

1. 安装 Python 和 Selenium

在开始之前,请确保你已经安装了 Python。然后,使用以下命令安装 Selenium:

[size=1em]
[size=1em]1

[size=1em][size=1em]pip install selenium




2. 下载 WebDriver

Selenium 需要与浏览器的 WebDriver 结合使用才能运行。以下是常见浏览器的 WebDriver 下载地址:

ChromeDriver: https://sites.google.com/chromium.org/driver/

GeckoDriver (Firefox): https://github.com/mozilla/geckodriver/releases

EdgeDriver: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

将下载好的 WebDriver 添加到系统环境变量中,或者在代码中指定其路径。

3. 示例:初始化浏览器

以下是一个简单的示例代码,展示了如何使用 Selenium 初始化 Chrome 浏览器:

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em][size=1em]from selenium import webdriver

[size=1em]# 初始化 Chrome 浏览器
[size=1em]driver = webdriver.Chrome(executable_path='path/to/chromedriver')

[size=1em]# 访问目标页面
[size=1em]driver.get('https://www.example.com')





3. Selenium 的基本用法

1. 访问网页

[size=1em]
[size=1em]1

[size=1em][size=1em]driver.get(url)




使用 get 方法可以访问指定的 URL。

2. 关闭浏览器

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em][size=1em]# 关闭当前标签页
[size=1em]driver.close()

[size=1em]# 完全退出浏览器
[size=1em]driver.quit()




3. 设置等待时间

在某些情况下,页面加载可能需要较长时间。可以通过设置隐式等待来解决这个问题:

[size=1em]
[size=1em]1

[size=1em][size=1em]driver.implicitly_wait(10)  # 等待 10 秒





4. 定位元素:选择器的使用

在 Selenium 中,定位元素是获取网页信息的核心步骤。Selenium 支持多种选择器方式:

1. ID 选择器

[size=1em]
[size=1em]1

[size=1em][size=1em]element = driver.find_element_by_id('element_id')




2. Name 选择器

[size=1em]
[size=1em]1

[size=1em][size=1em]element = driver.find_element_by_name('element_name')




3. Class 选择器

[size=1em]
[size=1em]1

[size=1em][size=1em]elements = driver.find_elements_by_class_name('class_name')  # 返回所有匹配元素




4. CSS 选择器

[size=1em]
[size=1em]1

[size=1em][size=1em]element = driver.find_element_by_css_selector('#id .class')  # 使用 CSS 选择器




5. XPath 选择器

XPath 是一种强大的选择器语言,适用于复杂场景:

[size=1em]
[size=1em]1

[size=1em][size=1em]element = driver.find_element_by_xpath('//*[@id="id"]/div[@class="class"]')




6. 组合使用

如果上述方法都无法定位元素,可以结合多种方式来实现。

示例:获取页面标题

[size=1em]
[size=1em]1

[size=1em]2

[size=1em][size=1em]title = driver.title
[size=1em]print(title)





5. 获取页面信息

1. 获取元素文本

[size=1em]
[size=1em]1

[size=1em]2

[size=1em][size=1em]text = element.text
[size=1em]print(text)




2. 获取元素属性

[size=1em]
[size=1em]1

[size=1em]2

[size=1em][size=1em]href = element.get_attribute('href')
[size=1em]print(href)




3. 处理多个元素

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em][size=1em]elements = driver.find_elements_by_css_selector('.class')  # 返回列表
[size=1em]for elem in elements:
[size=1em]    print(elem.text)




4. 提取页面源代码

[size=1em]
[size=1em]1

[size=1em]2

[size=1em][size=1em]page_source = driver.page_source
[size=1em]print(page_source)





6. 处理动态内容和等待

1. 显式等待

对于动态加载的内容,显式等待是更好的选择:

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em][size=1em]from selenium.webdriver.common.by import By
[size=1em]from selenium.webdriver.support.ui import WebDriverWait
[size=1em]from selenium.webdriver.support import expected_conditions as EC

[size=1em]# 等待元素出现
[size=1em]element = WebDriverWait(driver, 10).until(
[size=1em]    EC.presence_of_element_located((By.ID, 'element_id'))
[size=1em])




2. 隐式等待

隐式等待适用于全局,不会针对特定元素:

[size=1em]
[size=1em]1

[size=1em][size=1em]driver.implicitly_wait(10)  # 等待 10 秒




3. 处理动态内容加载

对于需要滚动或点击才能显示的内容,可以使用以下方法:

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em][size=1em]# 滚动到页面底部
[size=1em]driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

[size=1em]# 点击加载更多按钮
[size=1em]load_more = driver.find_element_by_css_selector('.load-more')
[size=1em]load_more.click()





7. 常见操作示例

示例 1:登录系统

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em][size=1em]from selenium import webdriver

[size=1em]driver = webdriver.Chrome(executable_path='path/to/chromedriver')

[size=1em]# 访问登录页面
[size=1em]driver.get('https://www.example.com/login')

[size=1em]# 输入用户名和密码
[size=1em]username = driver.find_element_by_id('username')
[size=1em]password = driver.find_element_by_id('password')

[size=1em]username.send_keys('your_username')
[size=1em]password.send_keys('your_password')

[size=1em]# 点击登录按钮
[size=1em]login_button = driver.find_element_by_css_selector('.login-btn')
[size=1em]login_button.click()

[size=1em]# 关闭浏览器
[size=1em]driver.quit()




示例 2:提交表单

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em][size=1em]from selenium import webdriver

[size=1em]driver = webdriver.Chrome(executable_path='path/to/chromedriver')

[size=1em]# 访问表单页面
[size=1em]driver.get('https://www.example.com/form')

[size=1em]# 填写表单
[size=1em]name = driver.find_element_by_name('name')
[size=1em]email = driver.find_element_by_name('email')

[size=1em]name.send_keys('John Doe')
[size=1em]email.send_keys('john.doe@example.com')

[size=1em]# 上传文件(如果需要)
[size=1em]file_input = driver.find_element_by_css_selector('#file-input')
[size=1em]file_input.send_keys('/path/to/file.txt')

[size=1em]# 提交表单
[size=1em]submit_button = driver.find_element_by_id('submit-btn')
[size=1em]submit_button.click()

[size=1em]driver.quit()




示例 3:获取页面信息并保存

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em][size=1em]from selenium import webdriver

[size=1em]driver = webdriver.Chrome(executable_path='path/to/chromedriver')

[size=1em]# 访问目标页面
[size=1em]driver.get('https://www.example.com')

[size=1em]# 获取所有链接
[size=1em]links = driver.find_elements_by_css_selector('a[href]')
[size=1em]for link in links:
[size=1em]    print(link.get_attribute('href'))

[size=1em]# 保存页面源代码到文件
[size=1em]with open('page_source.html', 'w', encoding='utf-8') as f:
[size=1em]    f.write(driver.page_source)

[size=1em]driver.quit()





8. 案例分析:从简单到复杂

案例 1:获取新闻标题

假设我们需要从一个新闻网站中提取所有新闻的标题:

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em][size=1em]from selenium import webdriver

[size=1em]driver = webdriver.Chrome(executable_path='path/to/chromedriver')
[size=1em]driver.get('https://www.news.com')

[size=1em]# 获取所有新闻标题
[size=1em]titles = driver.find_elements_by_css_selector('.news-title')
[size=1em]for title in titles:
[size=1em]    print(title.text)

[size=1em]driver.quit()




案例 2:处理分页

如果目标页面有分页,可以使用循环来逐页抓取数据:

[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em][size=1em]from selenium import webdriver

[size=1em]driver = webdriver.Chrome(executable_path='path/to/chromedriver')

[size=1em]for page in range(1, 6):  # 抓取前5页
[size=1em]    driver.get(f'https://www.example.com?page={page}')
[size=1em]     
[size=1em]    items = driver.find_elements_by_css_selector('.item')
[size=1em]    for item in items:
[size=1em]        print(item.text)
[size=1em]         
[size=1em]driver.quit()





9. 总结

通过以上示例和案例分析,我们可以看到 Selenium 在自动化测试和数据抓取中的强大能力。结合显式等待、动态内容处理等技术,可以应对各种复杂的场景。

当然,在实际应用中还需要注意以下几点:

遵守目标网站的 robots.txt 文件。

处理可能出现的异常(如元素未找到)。

使用代理 IP 和浏览器指纹伪装,以避免被反爬机制拦截。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2025-6-17 04:39 , Processed in 0.021857 second(s), 19 queries .

© 2001-2020

快速回复 返回顶部 返回列表