天天看点

【python 工具】selenium 浏览器操作

作者:甘道实研

selenium的安装步骤:

1. 安装selenium,打开cmd控制台

pip install selenium

2. 安装驱动程序(我这里安装的是chromedriver),用来启动chrome浏览器,具体的驱动程序需要对应浏览器的版本

下载地址:

http://chromedriver.storage.googleapis.com/index.html

基本步骤:

1.导入模块

from selenium import webdriver  # 用来启动chromedriver
from selenium.webdriver.common.keys import Keys  # 提供键盘支持           

2.创建一个web实例

chrome = webdriver.Chrome('chromedriver驱动程序的路径')           

3.打开页面

chrome.get(url)  # chromedriver会打开一个chrome浏览器窗口,显示为浏览的页面           

4.关闭页面

chrome.close()
#or
chrome.quit()           

以上就是selenium的基本操作了,在打开页面和关闭页面中间就是各种操作。

1.高级- 元素定位

元素的定位,和爬虫中HTML页面解析,定位到某个元素基本上差不多,只是调用者是driver

element = chrome.find_element_by_id('id')  # 通过id获取元素
element = chrome.find_element_by_class('class')  # 通过class获取元素           

2.高级 - 元素操作

找到需要的元素后,就是进行操作(即交互)

element.send_keys('Hello World!')  # 向可输入对象中输入内容           

还可以点击提交表单按钮

element.click() # 点击提交表单           

3.高级 - 窗口切换

当selenium控制浏览器打开多个标签页时,要控制浏览器在不同的标签页进行切换,需要做以下两步:

1. 获取所有标签页的窗口句柄

2. 通过窗口句柄切换到自定标签页
# 1.获取当前所有标签页的句柄构成的列表
current_windows = drver,window_handles

# 2.根据标签页句柄列表索引下标进行切换
driver.seitch_to.window(current_windows[0])           
from selenium import webdriver

chrome = webdriver.Chrome()
chrome.get('https://bengbu.58.com/')
chrome.find_element_by_xpath('//*[@id="fcNav"]/em/a[1]').click()
# 获取当前所有标签页的句柄
current_windows = chrome.window_handles
# 根据标签页句柄列表进行切换
chrome.switch_to.window(current_windows[1])
text = chrome.find_element_by_xpath('/html/body/div[7]/div[2]/ul/li/div[2]/h2/a')
print(text)           

4.高级 - 滚动条的使用

在访问页面时,有些网页中的内容并不是一次性全都加载出来的,而是需要拖动滚动条,才能慢慢加载出来,比如京东这样的网站。

这时我们就可以用selenium去执行js代码,实现拉取滚动条完成加载页面。

滚动条回到顶部
js="var q=document.getElementById('id‘).scrollTop=0"
driver.execute_script(js)
滚动条拉到底部
js="var q=document.getElementById('id’).scrollTop=10000"
---------以上方法用于firefox和ie----------


chrome:
 js="var q=document.body.scrollTop=0"
横向滚动条:
js="windows.scrollTo(100,400)"           

参考代码示例:

from selenium import webdriver
from lxml import etree
from time import sleep

url='https://search.jd.com/Search?keyword=mac%E7%94%B5%E8%84%91&enc=utf-8&spm=2.1.1'
chrome = webdriver.Chrome()
# 发送请求
chrome.get(url)
# 将滚动条下拉到最底部
js = "document.documentElement.scrollTop=10000"
chrome.execute_script(js)
# 加载页面
sleep(3)
# 获取网页源代码
html = chrome.page_source
# 将html代码解析成html对象
e = etree.HTML(html)
# 获取商品名称,价格
names = e.xpath('//div[@class="p-name p-name-type-2"]/a/em')
prices = e.xpath('//div[@class="p-price"]/strong/i/text()')
print('共{}条结果'.format(len(names)))
for n, price in zip(names, prices):
    name = n.xpath('string(.)').replace('\n', '')
    print("商品名称:{},价格:{}".format(name, price))           

5.高级 - 无头浏览器

当我们在使用selenium时,每访问一次页面就弹出一个浏览器窗口。然而在做爬虫时,通常是不需要打开浏览器的,我们只需要使用浏览器的内核,因此我们可以使用chrome的无头模式。

只需要在创建实例时加入以下几行代码,就可以让浏览器进入无头模式

options = webdriver.ChromeOptions()
options.add_argument('--headless')
chrome = webdriver.Chrome(options=options)           

6.高级-页面等待

分类:

1. 强制等待

不管页面有没有加载完成,都等待指定时间

缺点:设置时间太短,页面没有加载完成,设置时间太长,则浪费时间

time.sleep(10)

2. 隐式等待

隐式等待主要针对的是元素定位,隐式等待设置了一个时间,在这段时间内判断元素是否定位成功,若定位成功,进行下一步;若没成功,则会报超时加载

隐式等待只需定义一次,后续所有元素定位操作都会遵守

chrome.implicitly_wait(10)  # 设置隐式等待时间为10秒,后续所有元素定位操作均可用