selenium的使用

selenium的使用

声明浏览器对象

Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。此外,我们可以用如下方式进行初始化:

from selenium import webdriver 

browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge() 
browser = webdriver.Safari()

这样就完成了浏览器对象的初始化并将其赋值为 browser 对象。接下来,我们要做的就是调用 browser 对象,让其执行各个动作以模拟浏览器操作。

访问页面

我们可以用 get 方法来请求网页,只需要把参数传入链接 URL 即可。比如,这里用 get 方法访问淘宝,然后打印出源代码,代码如下:

from selenium import webdriver  

browser = webdriver.Chrome() 
browser.get('https://www.taobao.com') 
print(browser.page_source) 
browser.close()

运行后会弹出 Chrome 浏览器并且自动访问淘宝,然后控制台会输出淘宝页面的源代码,随后浏览器关闭。

通过这几行简单的代码,我们就可以驱动浏览器并获取网页源码,非常便捷。

定位网页元素

1、find_element_by_id  # 通过id属性定位
2、find_element_by_link_text   # 通过a标签文本信息定位(完整)
3、find_element_by_partial_link_text # 通过a标签文本信息定位(部分文本)
4、find_element_by_tag_name        # 根据标签名字找
5、find_element_by_class_name      # 根据类名字找
6、find_element_by_name            # name='xx' 根据name属性进行定位
7、find_element_by_css_selector    # css选择器找
8、find_element_by_xpath           # xpath选择器找

  # 强调:
  # 1、上述均可以改写成find_element(By.ID,'kw')的形式
  # 2、find_elements_by_xxx的形式是查找到多个元素,结果为列表

#===============示范用法===================
# 1、find_element_by_id
print(driver.find_element_by_id('kw'))

# 2、find_element_by_link_text
# login=driver.find_element_by_link_text('登录')
# login.click()

# 3、find_element_by_partial_link_text
login=driver.find_elements_by_partial_link_text('')[0]
login.click()

# 4、find_element_by_tag_name
print(driver.find_element_by_tag_name('a'))

# 5、find_element_by_class_name
button=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'tang-pass-footerBarULogin')))
button.click()

# 6、find_element_by_name
input_user=wait.until(EC.presence_of_element_located((By.NAME,'userName')))
input_pwd=wait.until(EC.presence_of_element_located((By.NAME,'password')))
commit=wait.until(EC.element_to_be_clickable((By.ID,'TANGRAM__PSP_10__submit')))

input_user.send_keys('18611453110')
input_pwd.send_keys('xxxxxx')
commit.click()

# 7、find_element_by_css_selector
driver.find_element_by_css_selector('#kw')

# 8、find_element_by_xpath
```

元素交互操作

  • 元素名称.send_keys(value) 输入内容

  • 元素名称.clear() 清空用于有些输入的地方有默认值

  • 元素名称.click() 点击 主要用于按钮元素

  • 元素名称.submit() 提交

  • 按回车提交

案例:通过selenium用百度搜索“美女”关键字

from selenium import webdriver
import time
bro=webdriver.Chrome()
bro.get("https://www.baidu.com"

input_search=bro.find_element_by_xpath('//*[@id="kw"]')
# 输入查找内容
input_search.send_keys("美女")
# 查找搜索按钮
enter=bro.find_element_by_id('su')

# 点击按钮
enter.click()
time.sleep(5)
# 关闭浏览器
bro.close())

获取元素内容

  • 元素名称.text: 获取文本 (****重点)
  • 元素名称.get_attribute(attribute):获取元素内属性  (****重点)attribute为标签属性 
  • 元素名称.id :获取元素标签
  • 元素名称.location:获取元素名称
  • 元素名称.tag_name:获取元素标签名称
  • 元素名称.size:获取元素大小

隐式等待

implicitly_wait(隐式等待)

  • 隐式等待实际是设置了一个最长等待时间10秒

  • 如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。超出设定时间后,则抛出找不到节点的异常。

  • 只有控件没有加载出来才会等,控件一旦加载出来,直接就取到
#隐式等待,失败概率高,可不用
browser.implicitly_wait(10)
#在10秒内,如果网页全部加载完成(包含js),则执行下一步,否则一直等到10秒结束后,在执行下一步

案例:

from selenium import webdriver
import time

bro=webdriver.Chrome()
bro.get("https://www.baidu.com")
 
bro.implicitly_wait(10)  # 设置隐式等待

submit_button=bro.find_element_by_link_text('登录')
submit_button.click()

user_button=bro.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn')
user_button.click()

user_input=bro.find_element_by_id('TANGRAM__PSP_10__userName')
user_input.send_keys("ssssss@qq.com")

pwd_input=bro.find_element_by_id('TANGRAM__PSP_10__password')
pwd_input.send_keys("123456")


submit_input=bro.find_element_by_id('TANGRAM__PSP_10__submit')
submit_input.click()

time.sleep(5)
bro.close()
View Code

获取cookie

使用 Selenium,还可以方便地对 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': 'germey'}) 
print(browser.get_cookies()) 
browser.delete_all_cookies() 
print(browser.get_cookies())

#搭建cookie池和代理池的作用是什么?封ip ,封账号(弄一堆小号,一堆cookie)

首先,我们访问知乎,加载完成后,浏览器实际上已经生成 Cookies 了。接着,调用 get_cookies 方法获取所有的 Cookies。然后,我们再添加一个 Cookie,这里传入一个字典,有 name、domain 和 value 等内容。接下来,再次获取所有的 Cookies,可以发现,结果会多出这一项新加的 Cookie。最后,调用 delete_all_cookies 方法删除所有的 Cookies。再重新获取,发现结果就为空了。

无界面浏览器(驱动谷歌,驱动其他浏览器)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败

bro=webdriver.Chrome(options=chrome_options)
bro.get("https://www.baidu.com")
print(bro.get_cookies())
bro.close()

前进后退

平常我们使用浏览器时都有前进和后退功能,Selenium 也可以完成这个操作,它使用 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.zhihu.com/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

执行js

Selenium API 并没有提供实现某些操作的方法,比如,下拉进度条。但它可以直接模拟运行 JavaScript,此时使用 execute_script 方法即可实现,代码如下:

from selenium import webdriver 

browser = webdriver.Chrome() 
browser.get('https://www.zhihu.com/explore') 
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') 
browser.execute_script('alert("To Bottom")')

这里利用 execute_script 方法将进度条下拉到最底部,然后弹出 alert 提示框。

有了这个方法,基本上 API 没有提供的所有功能都可以用执行 JavaScript 的方式来实现了。

选项卡管理

在访问网页的时候,我们通常会开启多个选项卡。在 Selenium 中,我们也可以对选项卡进行操作。示例如下:

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])  #[1]表示跳转到第几个选项卡
browser.get('https://www.taobao.com')
time.sleep(2)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://www.sina.com.cn')
browser.close()

异常处理

在使用 Selenium 的过程中,难免会遇到一些异常,例如超时、节点未找到等错误,一旦出现此类错误,程序便不会继续运行了。这里我们可以使用 try except 语句来捕获各种异常。

from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException

try:
    browser = webdriver.Chrome()
    browser.get('http://www.baidu.com')
    browser.find_element_by_id("xxx")

except Exception as e:
    print(e)
finally:
    browser.close()

动作链

from selenium.webdriver import ActionChains
# 1 生成一个动作练对象
action=ActionChains(bro)
# 2 点击并夯住某个控件
action.click_and_hold(div)
# 3 移动方式(三种方式)
# action.move_by_offset(x, y) # 通过坐标偏移
# action.move_to_element(x, y) # 到另一个标签
# action.move_to_element_with_offset(x, y) # 到另一个标签,再偏移一部分

# 4 真正移动
action.perform()

# 5 释放控件(松开鼠标)
action.release()

 

posted @ 2020-04-09 21:53  Hank·Paul  阅读(243)  评论(0编辑  收藏  举报