Python爬虫之Selenium用法

Selenium相关方法介绍

直接放代码了,有相关介绍和说明

一个小案例,关于chromedirver.exe可以自行下载(提取码:3d12,geckodriver.exe是Firefox浏览器),注意这个只是针对谷歌浏览器进行使用的,运行前保证你的电脑有安装谷歌浏览器,最好是最新版。

from selenium import webdriver
import time
url = "https://movie.douban.com/"
# 加载驱动
driver = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
# 获取链接
driver.get(url)
# 窗口最大化
driver.maximize_window()
# 定位页面搜索框并传入参数
driver.find_element_by_xpath('//*[@id="inp-query"]').send_keys("驯龙高手")
# 定位页面搜索按钮并触发点击事件
driver.find_element_by_xpath('//*[@id="db-nav-movie"]/div[1]/div/div[2]/form/fieldset/div[2]/input').click()
# 进行截图保存
driver.save_screenshot("douban.png")
time.sleep(3)
# 关闭浏览器
driver.quit()

以下是selenium的相关使用方法

1:声明浏览器对象
from selenium import webdriver
#声明谷歌、Firefox、Safari等浏览器
browser=webdriver.Chrome(executable_path='../bin/chromedriver.exe')
browser=webdriver.Firefox(executable_path='../bin/geckodriver.exe')

注意:注意文件路径,这里bin文件是与项目文件同级的。

2:访问页面
from selenium import webdriver
browser=webdriver.Chrome(executable_path='../bin/chromedriver.exe')
browser.get("http://www.taobao.com")
#打印页面内容
print(browser.page_source)
#打印cookies信息
print(driver.get_cookies())
#打印当前页面URL
print(driver.current_url)
browser.close()

3:查找单个元素
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
browser.get("http://www.taobao.com")
# 通过三种方式找id为q的元素
input_first = browser.find_element_by_id("q")
input_second = browser.find_element_by_css_selector("#q")
input_third = browser.find_element(By.ID, "q")
print(input_first)
print(input_second)
print(input_third)
browser.close()

4:查找多个元素
from selenium import webdriver
from selenium.webdriver.common.by import By
browser=webdriver.Chrome(executable_path="../bin/chromedriver.exe")
browser.get("http://www.taobao.com")
# 找元素标签,返回第一个标签
lis = browser.find_element_by_css_selector("li")
lis_c = browser.find_element(By.CSS_SELECTOR, "li")
print(lis)
print(lis_c)
browser.close()

注:这里的代码只能找到一个元素,find_element 和find_elements的区别:返回一个和返回一个列表。

5:元素的交互操作

对获取到的元素调用交互方法

from selenium import webdriver
import time
browser = webdriver.Chrome(executable_path='../bin/chromedriver.exe')
browser.get("https://tieba.baidu.com/")
# 获取输入框元素的id
input = browser.find_element_by_id("wd1")
# 向输入框传入参数
input.send_keys("数学")
# 休眠5秒
time.sleep(5)
# 清空输入框
input.clear()
time.sleep(5)
# 再次传入参数
input.send_keys("哲学")
# 获取"进入贴吧"按钮的class名
button = browser.find_element_by_class_name("search_btn")
# 进行点击操作
button.click()
time.sleep(5)
browser.close()
6:交互动作

把动作附加到交互链中

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
from selenium.webdriver.common.alert import Alert
browser = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
#切换到目标元素所在的frame
browser.switch_to.frame("iframeResult")
#确定拖拽目标的起点
source = browser.find_element_by_id("draggable")
#确定拖拽目标的终点
target = browser.find_element_by_id("droppable")
#形成动作链
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
#执行
actions.perform()
'''
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点右上角x,取消弹出框
'''
t = browser.switch_to_alert()
print(t.text)
t.accept()
time.sleep(10)
browser.close()
7:执行javascript

下面的例子是执行就是,拖拽进度条到底,并弹出提示框

from selenium import webdriver
import time
browser = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
browser.get("https://www.zhihu.com/explore")
# 窗口最大化
browser.maximize_window()
time.sleep(3)
#执行脚本,窗口滚动条滚动底部
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(3)
# 执行脚本,弹出框
browser.execute_script("alert('To Button')")
time.sleep(3)
browser.close()
8:获取元素信息
获取属性
from selenium import webdriver
import time
browser = webdriver.Chrome(executable_path='../bin/chromedriver.exe')
browser.maximize_window()
url = "https://www.zhihu.com/explore"
browser.get(url)
time.sleep(5)
logo = browser.find_element_by_id("zh-top-link-logo")
print(logo)
# 打印获取到的class属性
print(logo.get_attribute("class"))
browser.close()
获取文本值
from selenium import webdriver
browser=webdriver.Chrome("../bin/chromedriver.exe")
url = "https://www.zhihu.com/explore"
browser.get(url)
logo=browser.find_element_by_id("zh-top-link-logo")
print(logo)
print(logo.text)
browser.close()
获取ID、位置、大小和标签名
from selenium import webdriver
browser = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
# browser.minimize_window()
url = "https://www.zhihu.com/explore"
browser.get(url)
logo = browser.find_element_by_id("zh-top-link-logo")
print(logo)
#id
print(logo.id)
#位置
print(logo.location)
#标签名
print(logo.tag_name)
#大小
print(logo.size)
# 关闭当前浏览器窗口
browser.close()
9:等待

隐式等待
当使用了隐式等待执行测试的时候,如果webdriver没有在DOM中找到元素,将继续等待,超过设定的时间后则抛出找不到元素的异常,换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找DOM,默认时间为0.

from selenium import webdriver
browser = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
url="https://www.zhihu.com/explore"
browser.get(url)
browser.implicitly_wait(10)
logo=browser.find_element_by_id("zh-top-link-logo")
print(logo)
browser.close()

显示等待

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
url="https://www.taobao.com"
browser.get(url)
wait = WebDriverWait(browser,10)
input = wait.until(EC.presence_of_element_located((By.ID, "q")))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn-search")))
print(input)
print(button)
browser.close()
10:浏览器的前进和后退
from selenium import webdriver
import time

browser = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
browser.get("https://www.taobao.com")
browser.get("https://www.baidu.com")
browser.get("https://www.python.org")
# 浏览器后退
browser.back()
time.sleep(3)
# 浏览器前进
browser.forward()
browser.close()
11:cookies的处理
from selenium import webdriver
import time

browser = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
browser.get("https://www.zhihu.com/explore")
print(browser.get_cookies())
browser.add_cookie({"name": "name", "domain": "www.zhihu.com", "value": "germey"})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
browser.close()
12:选项卡管理
from selenium import webdriver
import time
browser = webdriver.Chrome(executable_path="../bin/chromedriver.exe")
browser.get("https://www.zhihu.com/explore")
# 打开一个新的浏览器窗口
browser.execute_script("window.open()")
# 打印窗口句柄
print(browser.window_handles)
# 切换到指定的window_name页签
browser.switch_to_window(browser.window_handles[1])
browser.get("https://www.taobao.com")
time.sleep(5)
browser.switch_to_window(browser.window_handles[0])
browser.get("https://baidu.com")
browser.close()
13:异常处理
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException

browser=webdriver.Chrome(executable_path="../bin/chromedriver.exe")
try:
    browser.get("https://www.zhihu.com/explore")
except TimeoutException:
    print("Time out")
try:
    browser.find_element_by_id("hello")
except NoSuchElementException:
    print("No Element")
finally:
    browser.close()

补:• driver.close() #退出当前页面
       • driver.quit() #退出浏览器

关于页面元素定位
用法:

• find_element_by_id (返回一个)
• find_elements_by_xpath (返回一个列表)
• find_elements_by_link_text
• find_elements_by_partial_link_text
• find_elements_by_tag_name
• find_elements_by_class_name
• find_elements_by_css_selector

注意点:

• find_element 和find_elements的区别:返回一个和返回一个列表
• by_link_text和by_partial_link_text的区别:全部文本和包含某个文本
• by_css_selector的用法: #food span.dairy.aged
• by_xpath中获取属性和文本需要使用get_attribute() 和.text

代理设置
from selenium import webdriver
chromeOptions = webdriver.ChromeOptions()
# 设置代理
chromeOptions.add_argument("--proxy-server=http://202.20.16.82:10152")
# 一定要注意,=两边不能有空格,不能是这样--proxy-server = http://202.20.16.82:10152
browser = webdriver.Chrome(chrome_options = chromeOptions)
# 查看本机ip,查看代理是否起作用
browser.get("http://httpbin.org/ip")
print(browser.page_source)
# 退出,清除浏览器缓存
browser.quit()
关于页面等待

为什么需要等待
如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错
强制等待

  • time.sleep(10)

显式等待(了解)

  • 显式等待指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了。
  • WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, “myDynamicElement”))

隐式等待(了解)

  • 就是简单地设置一个最大等待时间,单位为秒。
  • driver.implicitly_wait(10)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值