07selenium
selenium
动态网页爬虫:
- 分析接口,然后通过代码请求这个接口
- 使用
selenium+webdriver
模拟浏览器获取数据
1. selenium和webdriver
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接调用浏览器,它支持所有主流的浏览器。我们可以使用selenium很容易完成之前编写的爬虫。webdriver
可以理解它是浏览器的驱动。
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
-
pip install selenium==3.141.0
-
下载浏览器驱动程序:
卸载已经安装的模块:pip uninstall 模块名
2. 浏览器对象
get(url=url)
:地址栏输入url
地址并确认page_source
:查看网页源码(与element内容一致)maximize_window()
:浏览器窗口最大化quit()
:关闭浏览器
3. selenium定位元素
# 使用元素定位前需要导包
from selenium.webdriver.common.by import By
# find_element 找一个元素
# find_elements 找多个元素
find_element(By.ID, '根据标签id属性进行定位')
find_element(By.NAME, '根据标签name属性进行定位')
find_element(By.CLASS_NAME, '根据标签class属性进行定位')
find_element(By.XPATH, '根据xpath语法进行定位')
find_element(By.CSS_SELECTOR, '根据css语法进行定位')
find_element(By.LINK_TEXT, '根据标签文本内容进行定位')
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
url = 'https://www.maoyan.com/board/4?offset=0'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
def get_data():
"""获取一页的数据"""
dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')
for dd in dds:
# text属性:获取当前元素下的所有文字
print(dd.text.split("\n"))
print("-" * 100)
while True:
get_data()
try:
driver.find_element(By.LINK_TEXT, "下一页").click()
time.sleep(2)
except Exception as e:
print(e)
print('爬取完成')
driver.quit()
break
4.节点对象操作
- send_keys('') 搜索框发送内容
- click() 点击
- text 获取文本内容
- get_attribute('src') 获取属性值
- find('') 查找响应中的字符串
5. 无界面模式
from selenium import webdriver
options = webdriver.ChromeOptions()
# 添加无界面参数
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)
6. 打开新窗口和切换页面
-
selenium中没有专门的打开新窗口的方法,是通过
execute_script()
来执行js
脚本的形式来打开新窗口的driver.execute_script("window.open('https://www.douban.com/')")
- 在selenium眼中,新窗口是不会变成当前执行命令的窗口 -1为切换到最新(最后)显示的窗口 ,0为切换到初始窗口
driver.switch_to.window(driver.window_handles[-1])
-
关掉当前窗口,回到初始的窗口视角
-
driver.close() driver.switch_to.window(driver.window_handles[0])
6. selenium-iframe
网页中嵌套了网页,先切换到iframe
,然后再执行其他操作
-
切换到要处理的Frame
driver.switch_to.frame(frame节点对象)
-
在Frame中定位页面元素并进行操作
-
返回当前处理的Frame的上一级页面或主页面
# 返回上一级 driver.switch_to.parent_frame() # 返回主页面 driver.switch_to.default_content()
7. 操作cookie
- 获取cookie:
driver.get_cookies()
- 根据cookie的key获取value:
value = driver.get_cookie(key)
- 删除所有的cookie:
driver.delete_all_cookies()
- 删除某个cookie:
driver.delete_cookie(key)
8. 隐式等待和显式等待
- 隐式等待:标签定位时,指定一个时间,在这个时间内一直会处于等待状态。隐式等待需要使用driver.implicitly_wait
- 显式等待:指定在某个时间内,如果某个条件满足了,那么就不会再等待,针对某一操作使用。显式等待用的方法需导包
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)