Python学习笔记:24 Selenium的使用

基本使用

创建浏览器对象并加载页面

注意要将浏览器驱动放在当前项目目录下或配置环境变量。

from selenium import webdriver
driver = webdriver.Chrome('chromedriver.exe')
driver.get('https://www.baidu.com')

设置浏览器大小

两种方式:1、set_window_size方法可以指定分辨率设置窗口大小。

​ 2、maximize_window方法可以将窗口最大化。

from selenium import webdriver

driver = webdriver.Chrome('chromedriver.exe')

# 设置浏览器大小
# driver.set_window_size(1920, 1080)

# 将浏览器设置为全屏
driver.maximize_window()

网页的前进与后退

from selenium import webdriver
import time

url = 'https://www.chinanews.com/scroll-news/news1.html'
url1 = 'https://www.baidu.com/'
url2 = 'https://www.taobao.com/'
# 创建浏览器对象
driver = webdriver.Chrome('chromedriver.exe')
# 请求链接
driver.get(url1)
driver.get(url2)
driver.get(url)
# 后退
driver.back()
time.sleep(1)
# 前进
driver.forward()

设置滚动条

from selenium import webdriver
import time

url = 'https://www.chinanews.com/scroll-news/news1.html'

# 创建浏览器对象
driver = webdriver.Chrome('chromedriver.exe')
driver.get(url)
max_y = 4000
y = 0
while y <= max_y:
    driver.execute_script(f'window.scrollTo(0, {y})')
    y += 1000
    time.sleep(1)

元素定位

from selenium import webdriver
import time

url = 'https://www.chinanews.com/scroll-news/news1.html'

# 创建浏览器对象
driver = webdriver.Chrome('chromedriver.exe')
driver.get(url)

# 打印网页源码:str类型 ---> bs4
# print(driver.page_source, type(driver.page_source))

contents = driver.find_element_by_id('content_right').text
# print(contents)

# 新闻标题
news_title = driver.find_element_by_class_name('dd_bt').text
print(news_title)

# 新闻链接
news_href = driver.find_element_by_css_selector\
    ('#content_right > div.content_list > ul > li > div.dd_bt > a').get_attribute('href')
print(news_href)

# 新闻时间
news_time = driver.find_element_by_class_name('dd_time').text
print(news_time)

# 新闻类型
news_type = driver.find_element_by_css_selector\
    ('#content_right > div.content_list > ul > li:nth-child(1) > div.dd_lm').text
print(news_type)

# 休眠
time.sleep(3)
# 自动关闭浏览器
# driver.close()
driver.quit()

自动关闭浏览器有两种方式,二者区别如下:close(),如果selenium打开了一个浏览器窗口,但是这个窗口有多个标签页,只会关闭当前所在页,quit()直接关闭浏览器窗口浏览器打开时会产生缓存文件,close()只关闭浏览器,不会执行清理缓存操作,quit()在关闭浏览器的同时会清理缓存。

基本配置

from selenium import webdriver
# 创建设置对象
options = webdriver.ChromeOptions()
# 解决DevToolsActivePort文件不存在的报错
options.add_argument('--no-sandbox')
# 谷歌文档提到需要加上这个属性来规避bug
options.add_argument('--disable-gpu')
# 隐藏滚动条, 应对一些特殊页面
options.add_argument('--hide-scrollbars')
# 不加载图片, 提升速度
options.add_argument('blink-settings=imagesEnabled=false')
# 设置取消图片加载
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
# 设置取消测试环境
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
options.add_argument('--headless')
# 设置代理
option.add_argument('--proxy-server=socks5://代理服务器:端口')
# 避免终端下执行代码报错
options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
# 设置配置
driver = webdriver.Chrome(options=options)
# -------------------------------------------------
# 防止selenium被监测
# 先修改js,再加载js
driver.execute_cdp_cmd(
    "Page.addScriptToEvaluateOnNewDocument",
    {
        "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
    }
)

获取cookie及使用cookie

获取登录淘宝页面的cookie,这样在访问淘宝页面后,传入cookie,再请求页面,就可以实现自动登录淘宝操作,于是可以避免每次操作淘宝页面都需要进行登录操作。

import time

from selenium import webdriver

url1 = 'https://www.taobao.com/'
url2 = 'https://www.baidu.com/'

# 设置配置项
options = webdriver.ChromeOptions()
# 不加载图片,提升速度
options.add_argument('blink-settings=imagesEnabled=false')

driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get(url1)
# 打开新的标签页
driver.execute_script('window.open()')
print(driver.window_handles)    # 一个列表,有两个标签页
# 切换到新的标签页
driver.switch_to.window(driver.window_handles[1])
driver.get(url2)
time.sleep(1)
# 切换到第一个标签页
driver.switch_to.window(driver.window_handles[0])
driver.maximize_window()

# 点击登录选项
driver.find_element_by_class_name('h').click()
# 点击二维码
driver.find_element_by_class_name('icon-qrcode').click()

# 隐式等待:全局等待方式,在指定时间内等待成功了就终止等待
driver.implicitly_wait(20)

# 检测信息是否加载成功
driver.find_element_by_class_name('site-nav-login-info-nick ')

# 获取cookie
cookie = driver.get_cookies()
print(cookie)
# 保存cookie,数据的持久化
with open('cookie.txt', 'w') as file:
    file.write(str(cookie))
driver.quit()

设置配置项,可以添加不加载图片,提升速度的配置。

传入cookie,在淘宝页面搜索框输入内容,点击搜索按钮,滑动搜索页面。

import time

from numpy import safe_eval
from selenium import webdriver
from selenium.webdriver.common import keys

url = 'https://www.taobao.com/'

options = webdriver.ChromeOptions()
options.add_argument('blink-settings=imagesEnabled=false')

with open('cookie.txt', 'r') as file:
    cookie = file.read()
new_cookie = safe_eval(cookie)

driver = webdriver.Chrome('chromedriver.exe', options=options)
# 防止selenium被监测
# 先修改js,再加载js
driver.execute_cdp_cmd(
    "Page.addScriptToEvaluateOnNewDocument",
    {
        "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
    }
)
# 先访问淘宝页面,再传cookie
driver.get(url)
for i in new_cookie:
    if i['secure']:
        driver.add_cookie(i)
# 再次请求页面
driver.get(url)

# 定位搜索框
search = driver.find_element_by_id('q').send_keys('秋装女小个子')
time.sleep(2)
# enter = driver.find_element_by_class_name('btn-search').click()
# 键盘事件
enter = driver.find_element_by_class_name('btn-search').send_keys(keys.Keys.ENTER)

time.sleep(3)
# 拖动滚动条
max_y = 5000
y = 0
while y <= max_y:
    driver.execute_script(f'window.scrollTo(0, {y})')
    y += 1000
    time.sleep(1)

print(driver.page_source)
time.sleep(2)
driver.quit()

注意:由于之前保存cookie的是列表样式的字符串,因此需要使用safe_eval()方法将字符串解析为列表,列表中的内容是字典,传入cookie时需要注意:

  • 先请求页面,再传入cookie,再请求页面。

  • 传入的cookie必须是字典。

  • 当字典中的键secure值为False时,cookie传不进去,因此需要设置条件。

为了防止selenium被检测,需要设置配置项。

隐式等待与显示等待

淘宝登录与搜索

import getpass

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.taobao.com/'

# 创建设置对象
options = webdriver.ChromeOptions()
# 避免终端下执行代码报错
options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
# 不加载图片
options.add_argument('blink-settings=imagesEnabled=false')

driver = webdriver.Chrome('chromedriver.exe', options=options)

# # 隐式等待
# driver.implicitly_wait(30)

# 防止selenium被监测
# 先修改js,再加载js
driver.execute_cdp_cmd(
    "Page.addScriptToEvaluateOnNewDocument",
    {
        "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
    }
)

driver.get(url)
# 找到登录按钮,点击
driver.find_element_by_class_name('h').click()

user = input('请输入账号:')
password = getpass.getpass('请输入密码:')
# 输入账号
driver.find_element_by_id('fm-login-id').send_keys(user)
# 输入密码
driver.find_element_by_id('fm-login-password').send_keys(password)
# 点击登录
driver.find_element_by_class_name('fm-button').click()

# 显示等待(不会等待js加载成功)
WebDriverWait(driver, 20).until(
    EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#J_LoginInfo > div.menu-hd > a'), 'tb18471010')
)

# 搜索商品
search = driver.find_element_by_id('q')
search.send_keys('月饼')
search.send_keys(Keys.ENTER)

implicitly_wait():隐式等待,设置等待时间,是对页面中的所有元素设置加载时间,即整个页面的加载时间,放在请求网页之前。
WebDriverWait():显示等待是针对于某个特定的元素设置的等待时间。

iframe 与default_content的切换

在某些网页定位元素时,可能定位不到,这时需要考虑该元素是否在iframe标签之下。

如果想要代码能够正常执行,需要先切换到元素所在的frame下,切换frame使用的语句为:driver.switch_to.frame()

此处需要分为两种情况进行操作:

  • 需要切换至的frame有id或name标记,则可以直接使用切换语句,如
    driver.switch_to.frame() ,括号内填入frame的idname属性值均可。如:
driver.switch_to.frame('login-iframe')
  • frame没有id或name标记,但有class属性,需要先获取到对应的frame(使用css选择器定位或xpath定位),然后在切换至该frame,如:
frame1 = driver.find_element_by_css_selector('#page > div.content.bg_default > div > div > iframe')
driver.switch_to.frame(frame1)

QQ空间登录页面:定位账号密码登录这个元素时,需要切换到iframe标签,才能定位到该元素。
当然,要切换到iframe标签之外的元素时,切换到default_content即可。
在这里插入图片描述

from selenium import webdriver

url = 'https://qzone.qq.com'
driver = webdriver.Chrome('chromedriver.exe')
driver.get(url)
# 切换到iframe
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()

# 从iframe中切换出来
driver.switch_to.default_content()
driver.find_element_by_class_name('icon_ipad').click()
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

better meˇ:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值