大概是Python Selenium基础


之前写Python爬虫,基本上是使用request库比较多,但是遇到复杂的,需要登录的网站,要用起request就比较麻烦了。这时候,就需要无敌的Selenium出马了。

Selenium是一个浏览器自动测试工具,他可以模拟人操作浏览器的过程,实现浏览器的自动测试,所以,我使用它主要有两个场景:1、当做更高级的爬虫使用,2、当做网页按键精灵使用

作为爬虫,selenium的效率肯定是不如request的,因为他需要等待浏览器完全加载网页,比如说js啊之类的乱七八糟的,而且还需要等待浏览器打开之类的,会浪费很多时间,但是对于我们这种没这么需求效率的工作,确实是非常方便的。

安装并启动selenium

pip install selenium

和其它的python库一样,selenium库的安装就那么简单,但是现在就想要控制浏览器,那是不可能的。因为selenium还需要结合浏览器控制工具来进行自动测试浏览器。

下载chromedriver可以用淘宝的镜像源: http://npm.taobao.org/mirrors/chromedriver/

如果需要ie才能登陆的网站,就使用iedriverserver

事实上,用pip安装慢的话,其实可以用豆瓣的镜像源

pip install -i http://pypi.douban.com/simple/

将Driver放到python根目录的script的文件夹就可以直接从python中调用它了。打开一个python的命令行,直接输入

from selenium import webdriver
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")

这个时候,就能看到selenium打开了一个chrome浏览器的窗口,并访问了百度首页。

如果需要将做好的工具用pyinstaller打包给别的用户,也需要将chromedriver等浏览器测试工具也一起放到包里,这时候打开的代码就需要使用(这里是个ie的例子)

driver = webdriver.Ie(f'{cwd}{sep}IEDriverServer')

用这个可以打开同一个文件夹下的driver

使用iedriverserver之前,需要进行一些配置:

1 修改注册表

64位

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BFCACHE]
"iexplorer.exe"=dword:00000000

32位

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BFCACHE]
"iexplorer.exe"=dword:00000000

将他复制到记事本命名为.reg文件,双击导入就可以了

2 修改ie设置

将ie安全性四个模式的保护模式全部关闭,ie11以上版本要关闭增强保护模式,并将ie缩放改回为100%

完成操作后记得使用 driver.close() 关掉浏览器

用Selenium来定位网页元素

在selenium中,可以用8种方法来定位网页元素,结合百度首页来简单说明一下吧。可以在百度首页按下F12调用控制台来结合理解

#用元素id来定位,例如用"kw"来定位百度搜索框
find_element_by_id()
#用元素名称来定位,例如用"wd"来定位百度搜索框
find_element_by_name()
#用元素所属的类名,例如用"s_ipt"来定位百度搜索框,需要注意元素的唯一性
find_element_by_class_name()
#这是用元素的tag来定位的方法,比如说查找网页上的input
find_element_by_tag_name()
#定位网页上的超链接文本,例如用"新闻"来定位百度首页上的新闻超链接
find_element_by_link_text()
#定位网页上的超链接文本,但是可以用少数的文字来匹
find_element_by_partial_link_text()
#这个是神器!用chrome控制台对着元素的html代码按右键,可以复制出他的xpath
find_element_by_xpath()
#这是用css来定位的方法
find_element_by_css_selector()
#要查找多个元素就在element后面加上s

成功定位之后,就可以用send_keys(),click()来对元素进行操作

关于Iframe

在iframe中的元素,是不能直接定位的,必须使用driver.switch_to_frame()

后进行定位,函数里直接写iframe的id或者name,但是如果没有id和name,需要先定位iframe再用switch_to_frame进入

driver.switch_to.default_content() #这是切换回来的代码
driver.switch_to.parent_frame() #多重iframe嵌套,用这个可以回到上一层

关于弹出框

对于出现的弹出框,不操作弹出框是不能继续操作的

a=driver.switch_to_alert() #定位到弹窗
a.dismiss() #触发取消按钮,accept()则是弹窗确定
authenticate(name, pass) #如果是登录认证类弹窗,用这个来输入账号密码

关于无头浏览

用这种方式启动chrome可以不显示chrome的浏览器,实现无头浏览(?

chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=chrome_options)


想要成为自己的未来