08_selenium对应Chromedrive的基本使用

1. 安装selenium和Chromedrive

1.1 安装selenium

pip install selenium 安装

1.2 下载安装不同Chrome版本对应的Chromedrive

https://npm.taobao.org/mirrors/chromedriver 下载对应接口

然后拷贝到python的运行路径下,或者是一个win的全局变量PATH地址下即可

测试:在cmd中输入chromedrive,有启动反应测试成功

1.3 二者对应关系

selenium是一个python的模块,里面提供多种方法去调用浏览器执行不同动作

但是需要一个浏览器的接口,才能让浏览器执行相应命令,各个浏览器的接口和驱动都是不同的,所以需要下载对应浏览器版本的webdrive,也就是Chromedrive

还需要本地有个浏览器Chrome

1.4 phantomjs无界面浏览器

  • Chrome对应得是有界面(有头)浏览器
  • phantomjs无界面(无头)浏览器
  • 有界面指:运行时会有浏览器显示运行的过程,反应会较慢,一般用于测试开发,能不用就不用
  • 无界面指:运行时不会有浏览器显示运行的过程,直接返回结果,更省资源,更快,更适合服务器部署

2. selenium的基本使用

2.1 drive对象常用的属性和方法

from selenium import webdriver   # 引入浏览器接口
import time

url = 'http://www.baidu.com'

# 定义浏览器的对象
drive = webdriver.Chrome()

# 打开URL的页面
drive.get(url)
# 输出页面的原码
print(drive.page_source)
# 输出页面的标题
print(drive.title)
# 对该页面截图报错为baidu.png
drive.save_screenshot('baidu.png')

time.sleep(1)
# 在同一页面跳转到其他URL
drive.get('https://www.douban.com')

time.sleep(1)
# 页面后退
drive.back()

time.sleep(1)
# 页面前进
drive.forward()

# 关闭该页面标签,如果只打开了这一个页面,则会关闭浏览器
drive.close()

# 关闭浏览器
drive.quit()

2.2 drive 对元素定位

find_element_by_id() 						(返回一个元素)
find_element(s)_by_class_name()  			(根据类名获取元素列表)
find_element(s)_by_name()  				    (根据标签的name属性值返回包含标签对象元素的列表)
find_element(s)_by_xpath()  				(返回一个包含元素的列表)
find_element(s)_by_link_text()  			(根据连接文本获取元素列表)
find_element(s)_by_partial_link_text()  	(根据链接包含的文本获取元素列表)
find_element(s)_by_tag_name()  	 		    (根据标签名获取元素列表)
find_element(s)_by_css_selector()  		    (根据css选择器来获取元素列表)
  • 使用方法: drive.find_element_by_id('kw')
  • element返回第一个定位标签,没有报; elements返回列表,没有返回空列表

2.3 drive 提取文本内容和属性

  • 发送数据:drive.send_keys('string')
  • 点击:drive.click()
  • 获取文本:drive.text
  • 获取属性:drive.get_attribute('属性名')

2.4 代码示例

对于标签的定位:可以在浏览器中原码所定位处右击copy选择需要复制类型

from selenium import webdriver
import time

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

drive = webdriver.Chrome()  # 1. 设置Chrome的接口
drive.get(url)  # 2. 访问网址

# 3. 定位搜索框并发送数据,注意前端知识:搜索框中有input参数才可以输入
# drive.find_element_by_class_name('s_ipt').send_keys('python')  
# drive.find_element_by_id('kw').send_keys('python3')
drive.find_element_by_xpath('//*[@id="kw"]').send_keys('python3')

# 4. 对搜索按钮点击访问
# drive.find_element_by_id('su').click()
drive.find_element_by_css_selector('#su').click()

# 5. 等待页面加载完毕等待三秒,防止过快,页面数据还没有加载出来则关闭了
time.sleep(3)

# 6. 通过elements生成所定位的地址的列表,再通过e.text,e.get_attribute('属性名')将每一条索引的名称和地址提取出
ele_list = drive.find_elements_by_xpath('//*[@id]/h3/a')
for e in ele_list:
    # print(e)
    print(e.text, e.get_attribute('href'))

drive.quit()

3. 其他相关语法

3.1 切换标签页面句柄

  • 语法:
    • 当前句柄:drive.current_window_handle
    • 所有句柄: drive.window_handles
    • 切换句柄:drive.switch_to.window(drive.window_handles[位置])
  • 代码示例
from selenium import webdriver
import time
drive = webdriver.Chrome()

url = 'https://shanghai.anjuke.com/?from=navigation#'
drive.get(url)
time.sleep(3)
# 目前的所有窗口句柄
handle = drive.window_handles
print(handle)

tmp = drive.find_element_by_xpath('//*[@id="content"]/div[1]/div[3]/h1/a')
tmp.click()
time.sleep(3)
print(drive.current_url)
# 当前窗口句柄,如果没有主动切换,仍然为第一个句柄,虽然打开了第二个标签页
print(drive.current_window_handle)
# 所有窗口句柄,列表形式输出,此时有两个
print(drive.window_handles)
handle = drive.window_handles

# 默认第一个,非第二个,则此时对第二个页面定位为空
el = drive.find_elements_by_xpath('//*[@id="container"]/div/div[1]/ul/li/div/div[1]/h3/a')
print(len(el))

# 切换窗口句柄为最后一个
drive.switch_to.window(handle[-1])

# 切换后对第二个定位,此时非空有值
el = drive.find_elements_by_xpath('//*[@id="container"]/div/div[1]/ul/li/div/div[1]/h3/a')
print(len(el))

drive.quit()

3.2 switch_to_frame切换到框架中

  • 语法:
    • login_frame = driver.find_element_by_id('login_frame') 根据id定位 frame元素
    • driver.switch_to.frame(login_frame) 转向到该frame中
  • 代码示例
from selenium import webdriver
import time

url = 'https://mail.qq.com/cgi-bin/loginpage'
drive = webdriver.Chrome()
drive.get(url)
time.sleep(2)

# 切换到frame框架里面
frame_id = drive.find_element_by_id('login_frame')
drive.switch_to_frame(frame_id)

# 如果想要操作frame外元素,需要切换到外面
# window_handle = drive.window_handles
# drive.switch_to.window(window_handle[0]) 

drive.find_element_by_xpath('//*[@id="u"]').send_keys('1598100183')
time.sleep(2)
drive.find_element_by_xpath('//*[@id="p"]').send_keys('1598FeI!')
time.sleep(2)
drive.find_element_by_xpath('//*[@id="login_button"]').click()
time.sleep(2)

drive.quit()

3.3 获取cookies

  • 语法:driver.get_cookies()
  • 将获取到的字典列表转化为字典:cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}

3.4 执行js

  • 语法:提前写好js语句,driver.execute_script(js)

3.5 页面等待

  • 强制等待: time.sleep(3)

  • 隐式等待:等待一个driver响应的最大时间为7s,如果7s内响应了则立即继续下一条语句,不再等待,否则等7s后继续执行,driver.implicitly_wait(7)

  • 显示等待:每经过多少秒则查看条件是否达成,否则继续等待,直至超时

  • 代码示例

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(7)
url = 'https://cs.lianjia.com/'
driver.get(url)

js = 'window.scrollTo(0,1500)'
driver.execute_script(js)

driver.find_element_by_xpath('//*[@id="ershoufanglist"]/div/ul/li[1]/a').click()
time.sleep(3)
driver.quit()

3.6 对可选项设置

  • 无头浏览器
  • 设置浏览器代理:但是每次打开浏览器只能用一个代理,无法爬虫中切换
# 1. 设置浏览器选项对象
opt = webdriver.ChromeOptions()

# 2. 对象选项设置无头浏览器
opt.add_argument('--headless')
opt.add_argument('--disable-gpu')

# 2. 对象选项设置代理
opt.add_argument('--proxy-server=http://x.x.x.x:xx')

# 3. 将选项添加到浏览器中
driver = webdriver.Chrome(chrome_options=opt)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值