python的selenium模块(selenium py)
关于Python的Selenium框架全解,一篇完整的说明书
目录
安装 selenium 第三方库
下载浏览器驱动:
需要把这些浏览器驱动放入 Python 应用目录里面的 Script 文件夹里面
① 200 多本 Python 电子书(和经典的书籍)应该有
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且可靠的练手项目及源码)
④ Python基础入门、爬虫、网络开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
私信我01即可获取大量Python学习资源
每次当selenium启动chrome浏览器的时候,chrome浏览器很干净,没有插件、没有收藏、没有 历史 记录,这是因为selenium在启动chrome时为了保证最快的运行效率,启动了一个裸浏览器,这就是为什么需要配置参数的原因,但是有些时候我们需要的不仅是一个裸浏览器
selenium启动配置参数接收是ChromeOptions类,创建方式如下 :
创建了ChromeOptions类之后就是添加参数,添加参数有几个特定的方法,分别对应添加不同类型的配置项目
常用配置参数:
其他配置项目参数
制作无头浏览器
规避检测
门户网站检测如果是selenium请求的,有可能会拒绝访问。这也是一种反爬机制
实现规避检测
注意:这里只能使用 options 添加
如果有其他的模块要添加,注意要分开添加
元素定位语法
常用语法:
在 element 变成 elements 时,返回符合条件的所有元素组成的数组
控制浏览器大小
浏览器后退,前进
刷新
在搜索框模拟回车操作
在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供
ActionChains 类提供了鼠标操作的常用方法:
语法:
想使用selenium中的键盘事件,首先我们必须导入Keys包,需要注意的是包名称Keys首字母需要大写。Keys类中提供了几乎所有的键盘事件包括组合按键如 Ctrl+A、 Ctrl+C 等
使用语法:
其他事件可以通过查看源码获取
显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常
实例:
WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常
语法:
参数:
如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期
案例
语法:
alert 里面的方法
WebDriver操作cookie的方法:
参考链接:
与普通的在headers里添加 {'Cookies':' '} 不一样的是,此方法需要按照cookie的name,value,path,domain格式逐个cookie添加
通过execute_script()方法执行JavaScripts代码来移动滚动条的位置
如何搭建Python3.4+Selenium
详细步骤:1.下载32位的python3.4,安装,注意在安装过程中,选择pip2.添加系统环境变量C:\Python34;C:\Python34\Scripts;C:\ProgramFiles\Google\Chrome\Application(后面会用到)3.使用pip命令,安装seleniumcdPython34然后输入:pipinstall-Uselenium安装成功后,显示:Runingsetup.pyinstallfoeseleniumSuccessfullyinstalledselenium-2.48.04.检测selenium是否安装成功。在Python的IDLE中,输入:fromseleniumimportwebdriver如果没有报错,则selenium安装成功。5.开始第一个程序fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get(““)driver.find_element_by_id(“kw”).send_keys(“自动化测试”)按F5运行,然后会自动打开百度网页。能够顺利安装,那是幸运的,但是时候,总因为各种原因导致安装过程不太顺利。下面将安装过程中遇到的问题,总结在此:issue1:使用pip命令安装结束后,加载selenium模块报错。fromseleniumimportwebdriver报错:File“pyshell#0”,line1,inimportseleniumFile“C:\Python34\selenium.py”,line1,infromseleniumimportwebdriverImportError:cannotimportname‘webdriver’Traceback(mostrecentcalllast):File“pyshell#0”,line1,inimportseleniumFile“C:\Python34\selenium.py”,line1,infromseleniumimportwebdriver百度了很多方法,仍无解。解决方法:最后换了版本,将64位python3.4改为32位的python3.4再次重新安装,成功。issue2:使用browser=webdriver.Chorme()报错。报错:Errormessage:“’chromedriver’executableneedstobeavailableinthepath”这是因为缺少驱动:Chromedriver.exe下载Chormedriver.exe注意安装Chromedriver.exe要与PC所安装的Chrome版本匹配。解决方法:下载安装ChromeDrvier.exe将ChromeDrvier.exe放到C:\Python34\Scripts\OVER
python+Selenium之自动滑块破解滑块验证码
头大系列:以虎嗅网注册页面的滑块验证码为例:
打开浏览器调试工具,点击左上角按钮进行页面元素跟踪,然后将鼠标移动到滑块验证码的图像上,就发现问题了,这也是关键所在:
验证码的图像是由很多个这样的10x58(宽10高58)的小方块拼接而成的。再检查一下元素标签,发现每一个小方块的元素标签里面都有background-image:url以及background-position这两个关键的信息。
既然是url,就不妨打开链接来观察。发现打开的链接是一张图片,但却是一张乱七八糟的图片。
得到这张乱七八糟的图片,第一感觉是重影。试猜想,会不会将每一个小方块的url链接图片都重叠在一起或拼接在一起就能组成我们所看到的验证码图片。
但经打开每一张图片发现,每个小方块后面的url链接的图片是一样的。
这就说明不可能是将图片进行重叠或拼接了。那就有可能是另外一种可能:将这张完整的验证码图片的部分区域切割然后打乱排序,形成一张新的图片,而这张新的图片就是我们现在所看到的乱七八糟的图片。
再观察发现,每个小方块后面还有background-position这个重要的信息。发现里面正是-157px -58px; -145px -58px;这种形式,是不是很像坐标的形式了。而进一步猜想,将我们刚刚的乱七八糟的图按每一个小方块的坐标进行切割,然后再进行排序,是不是就能得到原来完整的验证码图片了。
进行实践:
运用PIL模块的切割crop()以及粘贴paste(),重新将图片进行整合。效果神奇出现:
先不管其他了的。先把两张完整的图片拼接出来再进行下一步吧。
按照相同的方法,找到页面元素中鼠标点击后的出现缺口的验证码图片位置,找到缺口图片乱七八糟的url链接。
通过相同方法拼接:
已经得到两张关键的验证码图片,那接下来就是PIL大显身手的时候了,对比两张图片的像素点,缺口位置明显黑了一块,也就是RGB三色必然与周围的像素RGB三色差别明显。
将两张图片的每个像素点进行遍历对比,RGB三色任意一色差距大于一定的范围即视为是滑块的缺口。
找到缺口之后返回遍历的像素点的x坐标值(因为滑块只能X轴左右移动,所以y轴可以不需要用到),而x坐标就是滑块需要移动的距离。
完美拼接。但被吃了,也是美中不足:
快速,匀速,准确,所谓的“快,准,稳”,一样不差。
那就认定你是机器人来滑动的吧,把你吃掉!
python网络爬虫:Selenium
获取页面每个Cookies值,用法如下
driver.add_cookie(cookie_dict)
一个浏览器肯定会有很多窗口,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:
imgs = driver.find_elements_by_xpath("//img")
for img in imgs:
driver.execute_script('$(arguments[0]).fadeOut()',img)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
driver.execute_script('alert("This is a alert")')
driver.quit()
python selenium模块使用出错,这个怎么改
s1.bind( address )
#由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。
#如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。
#例: ('192.168.1.1',9999)!