自学python爬虫(七)selenium库的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38736612/article/details/81487969

一、基本概念

selenium,是一种自动化测施工具,支持多种浏览器。爬虫中主要用来解决JavaScript渲染问题。

二、具体用法

说在前面:笔者是以GooleChrome浏览器来进行测试的,当然其他浏览器也可以,具体下面会讲到不同的浏览器不同做法。
1、下载安装:chromedriver,否则不能运行。
具体下载链接和安装方法请参照:selenium之使用chrome浏览器测试(附chromedriver与chrome的对应关系表)

2、具体使用
基本使用,先来个比较全面的例子~

# 较为全面的一个简单实例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
    input = browser.find_element_by_id('kw')
    input.send_keys('Python')
    input.send_keys(Keys.ENTER)
    wait = WebDriverWait(browser,10)
    wait.until(EC.presence_of_element_located((By.ID,'content_left')))
    print(browser.current_url)
    print(browser.get_cookies())
    print(browser.page_source)
finally:
    browser.close()

是不是觉得功能好强大呀,下面具体来了解啦!
其实很多知识需要查找官方文档最好啦,但是很多都是英文版的,阅读不方便,这里给出中文版作为参考,下面讲到的只是一部分,还是可以多看看文档:http://selenium-python-docs-zh.readthedocs.io/zh_CN/latest/
2.1声明浏览器对象

#  声明浏览器对象
from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
……

每种浏览器不同的,这里我只用了Chrome,其他浏览器可以自行百度。
2.2访问页面

# 访问页面
from selenium import webdriver

browser = webdriver.Chrome() # 声明浏览器对象 
browser.get('https://www.taobao.com')# 获得页面
print(browser.page_source)# 打印出页面内容
browser.close()# 关闭浏览器对象

2.3查找元素
2.3.1查找单个元素

# 单个元素
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element_by_id('q')# id
input_second = browser.find_element_by_css_selector('#q')# css选择器
input_third = browser.find_element_by_xpath('//*[@id="q"]')# xpath
print(input_first,input_second,input_third)
browser.close()

这里写图片描述
这里只是举出了几个例子,还有下面这些:
这里写图片描述
还有一种比较通用的方法来获单个元素:

from selenium import webdriver
from selenium.webdriver.common.by import By # 导入By

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element(By.ID,'q')# 通过这种来获取元素
print(input_first)
browser.close()
2.3.2多个元素
#  多个元素
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements_by_css_selector(' .service-bd li')
print(lis)
browser.close()

这里写图片描述

#  多个元素
from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements(By.CSS_SELECTOR,' .service-bd li')
print(lis)
browser.close()

当然,类似单个元素,获取多个元素也有多种方法:
这里写图片描述
2.4元素交互操作
对获取的元素调用交互方法

#  对获取的元素调用交互方法
from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')# 输入框
input.send_keys('iphone')#输入框输入iPhone
time.sleep(1)
input.clear()# 清掉输入框
input.send_keys('ipad')# 输入iPad
button = browser.find_element_by_class_name('btn-search')# 找到搜索按钮
button.click()# 点击搜索

这里写图片描述
2.5交互动作
将动作附加到动作链中串行执行

from selenium import webdriver
from selenium.webdriver import ActionChains

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')# 切换frame
source = browser.find_element_by_css_selector('#draggable') #原来的位置
target = browser.find_element_by_css_selector('#droppable')# 目标位置
actions = ActionChains(browser)# 声明一个ActionChains
actions.drag_and_drop(source,target)# 调用方法,拖动目标
actions.perform()# 执行

这里写图片描述这里写图片描述
2.6执行Javascript

# 执行JavaScript
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')# 使用JavaScript方法到页面底部
browser.execute_script('alert("To bottom")')

2.7获取元素信息
2.7.1获取属性

# 获取属性
from selenium import webdriver
from selenium.webdriver import ActionChains

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
logo = browser.find_element_by_id('zh-top-link-logo')
print(type(logo))
print(logo)
print(logo.get_attribute('class'))

这里写图片描述
2.7.2获取文本值

# 获取文本值
from selenium import webdriver

browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)

这里写图片描述
2.7.3获取ID、位置、标签名、大小

#  获取ID、位置、标签名、大小
from selenium import webdriver

browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)

2.8 Frame

# Frame
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
print(source)
# 在内部肯定找不到这个元素的,这里只是为了测试
try:
    logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
    print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)

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

# 隐式等待
from selenium import webdriver

browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)

2.9.2显式等待

# 显式等待
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()
browser.get('https://www.taobao.com')
wait = WebDriverWait(browser,10)
input = wait.until(EC.presence_of_element_located((By.ID,'q')))# 找到q这个id时停止等待
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))# 找到btn-search时停止等待
print(input,button)

显式等待还有许多条件判断方法:
这里写图片描述
2.10 前进后退
back() forward()

# 前进后退
import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('https://www.jingdong.com')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

2.11 cookies

# Cookies
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'gemery'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

2.12 选项卡管理
利用window_handles进行选项卡切换
这里写图片描述

# 选项卡管理
import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('http://www.csu.edu.cn')

2.13 异常处理

# 异常处理
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.find_element_by_id('hello')
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException

browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time out')
try:
    browser.find_element_by_id('hello')
except NoSuchElementException:
    print('No element')
finally:
    browser.close()

总结;到这里爬虫的基本库就基本结束了,很多东西还是要在实战中才能真正学会使用,所以接下来会是几个实战项目练习,一起期待吧~

猜你喜欢

转载自blog.csdn.net/qq_38736612/article/details/81487969