Python Web 爬虫中Selenium插件使用教程

Selenium主要用于Web应用中的自动化测试,是一种比较常用的自动化测试工具;

Selenium直接运行在浏览器之中,模拟用户对浏览器的相应操作。可以支持像IE, Firefox、safari,Opera或者Chrome等相关浏览器;

在WEB爬虫应用中,我们主要通过Selenium来模拟用户对网页的访问,进而实现用户信息获取。

我们以Chrome为例子:

1:Selenium安装和ChromeDriver的配置

1)Selenium安装,依赖pip安装工具, 主要通过

pip install Selenium 命令实现Selenium 的python依赖模块安装

2)chromeDriver主要根据不同的OS和当前OS上安装的不同的Chrome版本进行对应;

ChromeDriver对应下载地址: http://npm.taobao.org/mirrors/chromedriver/

根据自身的OS和Chrome 浏览器的版本下载对应的Driver即可;

3)配置, 将下载的chromeDrive解压, 将解压出来的文件,例如chromedriver.exe 放在对应的路径,让python程序获取得到即可。

2: Selenium插件的简单使用过程

1)浏览器见面可见运行方式

from selenium import werdriver

driver = webdriver.Chrome() 
driver.get('https://www.baidu.com')    #访问百度页面
driver.quit()

2)chrome无界面运行方式

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

chrome_opt = Options()   # chromedriver 运行参数设置
chrome_opt.add_argument('--headless')   # 无界面化.
chrome_opt.add_argument('--disable-gpu')    # 配合上面的无界面化.
chrome_opt.add_argument('--window-size=1366,768')

driver = webdriver.Chrome(chrome_options=chrome_opt)
driver.get('https://www.baidu.com') 
print(driver.page_source)
driver.quit()

Selenium常用启动配置项

更为详细的参数参见:https://peter.sh/experiments/chromium-command-line-switches/

其中 禁用图片加载的参数配置如下:

prefs = {
    'profile.default_content_setting_values' : {
        'images' : 2
    }
}
options.add_experimental_option('prefs',prefs)

禁用浏览器弹窗的参数如下:

prefs = {  
    'profile.default_content_setting_values' :  {  
        'notifications' : 2  
     }  
}  
options.add_experimental_option('prefs',prefs) 

另外,如果想通过制定driver的文件运行,代码如下:

from selenium import webdriver


driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.quit()

3: Selenium Driver的操作

Driver对象常见操作

get(url): 在当前浏览器会话中访问传入的url地址, driver.get('https://www.baidu.com')

close(): 关闭浏览器当前窗口

quit(): 退出webdriver并关闭所有窗口

refresh(): 刷新当前页面

title: 获取当前页的标题

page_source: 获取当前页渲染后的源代码

current_url: 获取当前页面的url

window_handles: 获取当前会话中所有窗口的句柄

Driver 查找单个元素

查找后返回一个Webelement对象

查找多个元素的话: 将其中的element加上s,则对应的多个的查找方法

上面的方法都是将第一个找到的元素进行返回,而将所有匹配的元素进行返回使用的是find_elements_by_*方法。

Driver操作Cookie

add_cookie(cookie_dict) : 给当前会话添加一个cookie。

cookie_dict: 一个字典对象,必须要有”name”和”value”两个键,可选的键有:“path”, “domain”, “secure”, “expiry”

用法:

driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’})
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’})
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’, ‘secure’:True})

get_cookie(name): 按name获取单个Cookie,没有则返回None

get_cookies(): 获取所有Cookie,返回的是一组字典

delete_all_cookies(): 删除所有Cookies

delete_cookie(name): 按name删除指定cooki

Driver获取截屏

get_screenshot_as_base64(): 获取当前窗口的截图保存为一个base64编码的字符串。
get_screenshot_as_file(filename): 获取当前窗口的截图保存为一个png格式的图片,filename参数为图片的保存地址,最后应该以.png结尾。如果出现IO错误,则返回False。
    用法: driver.get_screenshot_as_file(‘/Screenshots/foo.png’)
get_screenshot_as_png(): 获取当前窗口的截图保存为一个png格式的二进制字符串。

Driver获取窗口信息

get_window_position(windowHandle=’current’): 获取当前窗口的x,y坐标。

get_window_rect(): 获取当前窗口的x,y坐标和当前窗口的高度和宽度。

get_window_size(windowHandle=’current’): 获取当前窗口的高度和宽度。
 

Driver切换操作

  • switch_to_frame(frame_reference): 将焦点切换到指定的子框架中

  • switch_to_window(window_name): 切换窗口

Driver执行JS代码

execute_async_script(script, *args) : 在当前的window/frame中异步执行JS代码。

  • script:是你要执行的JS代码。
  • *args:是你的JS代码执行要传入的参数。
  • 用法:
script = “var callback = arguments[arguments.length - 1]; ”
script2 = “window.setTimeout(function(){ callback(‘timeout’) }, 3000);” 
driver.execute_async_script(script + script2)

execute_script(script, *args): 在当前的window/frame中同步执行JS代码。

  • script:是你要执行的JS代码。
  • *args:是你的JS代码执行要传入的参数。

4: Selenium Webelement操作

Webelement操作

前面有讲到使用find等方法来查找单个或多个元素对象, 其结果返回一个Webelement对象.

下面就是对这个对象的一些操作

常用方法:

clear(): 清空对象中的内容.
click(): 单击对象.
get_attribute(name): 优先返回完全匹配属性名的值,如果不存在,则返回属性名中包含name的值。
screenshot(filename): 获取当前元素的截图,保存为png,最好用绝对路径.
send_keys(value): 给对象元素输入数据, 如在百度中搜索’哔哩哔哩’.
submit(): 提交表单.
 

常用属性:

text: 获取当前元素的文本内容.
tag_name: 获取当前元素的标签名.
size: 获取当前元素的大小.
screenshot_as_png: 将当前元素截屏并保存为png格式的二进制数据.
screenshot_as_base64: 将当前元素截屏并保存为base64编码的字符串.
rect: 获取一个包含当前元素大小和位置的字典.
parent: 获取当前元素的父节点.
location: 当前元素的位置.
id: 当前元素的id值,主要用来selenium内部使用,可以用来判断两个元素是否是同一个元素.
 

Webelement中的keys

我们经常需要模拟键盘的输入,当输入普通的值时,在send_keys()方法中传入要输入的字符串就好了。

但是我们有时候会用到一些特殊的按键,这时候就需要用到我们的Keys类。

Demo:

from selenium.webdriver.common.keys import Keys


elem.send_keys(Keys.CONTROL, 'c')

更多模拟键值,参考如下:

5: Selenium 复杂交互操作

一般来说我们与页面的交互可以使用Webelement的方法来进行点击等操作。但是,有时候我们需要一些更复杂的动作,类似于拖动,双击,长按等等。

这时候就需要用到我们的Action Chains(动作链)了。

Demo:

from selenium.webdriver import ActionChains
from selenium import webdriver

driver = webdriver.Chrome()     # 创建webdriver对象.

element = driver.find_element_by_name("source")     # 查找单一元素对象.
target = driver.find_element_by_name("target")      # 同上.

actions = ActionChains(driver)      # 创建动作链对象.

# 在element元素上点击抓起,移动到target元素上松开放下。 类似鼠标.
actions.drag_and_drop(element, target)
actions.perform()   # 执行动作.

在导入动作链模块以后,需要声明一个动作链对象,在声明时将webdriver对象当作参数传入,并将对象赋值给一个actions变量。

然后我们通过这个actions变量,调用其内部附带的各种动作方法进行操作。

注:在调用各种动作方法后,这些方法并不会马上执行,而是会按你代码的顺序存储在ActionChains对象的队列中。当你调用perform()时,这些动作才会依次开始执行。
 

常用的Action-chains方法

click(on_element=None) : 左键单击传入的元素,如果不传入的话,点击鼠标当前位置。
context_click(on_element=None): 右键单击。
double_click(on_element=None) : 双击。
click_and_hold(on_element=None): 点击并抓起
drag_and_drop(source, target) : 在source元素上点击抓起,移动到target元素上松开放下。
drag_and_drop_by_offset(source, xoffset, yoffset):在source元素上点击抓起,移动到相对于source元素偏移xoffset和yoffset的坐标位置放下。
send_keys(*keys_to_send): 将键发送到当前聚焦的元素。
send_keys_to_element(element, *keys_to_send): 将键发送到指定的元素。
reset_actions(): 清除已经存储的动作。
 

6: Selenium Wait动作

在selenium操作浏览器的过程中,每一次请求url,selenium都会等待页面加载完毕以后,才会将操作权限再次交给我们的程序。

但是,由于ajax和各种JS代码的异步加载问题,所以我们在使用selenium的时候常常会遇到操作的元素还没有加载出来,就会引发报错。为了解决这个问题,Selenium提供了几种等待的方法,让我们可以等待元素加载完毕后,再进行操作。
显示等待Demo:

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


driver = webdriver.Chrome()
driver.get("http://somedomain/url_that_delays_loading")

try:
    # 创建wait对象.
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )

finally:
    driver.quit()

在这个例子中,我们在查找一个元素的时候,不再使用find_element_by_*这样的方式来查找元素,而是使用了WebDriverWait。

try代码块中的代码的意思是:在抛出元素不存在异常之前,最多等待10秒。在这10秒中,WebDriverWait会默认每500ms运行一次until之中的内容,而until中的EC.presence_of_element_located则是检查元素是否已经被加载,检查的元素则通过By.ID这样的方式来进行查找。

就是说,在10秒内,默认每0.5秒检查一次元素是否存在,存在则将元素赋值给element这个变量。如果超过10秒这个元素仍不存在,则抛出超时异常。
 

隐式等待

隐式等待指的是,在webdriver中进行find_element这一类查找操作时,如果找不到元素,则会默认的轮询等待一段时间。

这个值默认是0,可以通过以下方式进行设置:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10) # 单位是秒
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

7: Expected Conditions 方法

https://www.cnblogs.com/yuuwee/p/6635652.html

发布了99 篇原创文章 · 获赞 8 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/CodeAsWind/article/details/103596268