环境: Python3.6.5
编译器: Sublime Text 3
联系方式: ke.zb@qq.com
第三方库: selenium
一、简介
我们模拟登陆用的是selenium库,selenium是一个自动化测试工具,在爬虫中通常用来进行模拟登陆。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,同时Selenium也支持多种语言开发,比如 Java,C,Ruby、Python等等。
二、安装
这里我推荐给大家的安装工具是命令行,win+R输入cmd可以快速打开命令行工具

在命令行中输入以下命令即可安装,前提是你已经安装好Python环境且pip可以正常使用
pip install selenuim
明天依旧可好
三、下载驱动器
驱动器是我们在通过selenium模拟用户操作时需要的一个工具,我这里用的是Chromedriver(谷歌浏览器驱动,对应谷歌浏览器),下面是Chrome、Firefox、Safari等浏览器驱动的下载地址
下载完成后我们有两种掉用驱动器的方法,一种是把驱动器放到py文件同一文件夹下,另外一种就是将驱动器放到Python的安装目录下,以下是我的Python安装目录
明天依旧可好
注:网上流传比较广的方法是将驱动器加到环境变量中,但是我试了好像不怎么管用依然会报错,所以我就不放到这里(实践过确实有效的童鞋,可以在文章下方留言,在此感谢你的分享)
四、简单实例
来一段代码让我们直观的理解一下selenium吧
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
运行代码,我们可以看到跳出如下的浏览器界面
明天依旧可好
下面我们将继续完善代码来实现自动化,在搜索框中输入“明天依旧可好”-->点击搜索结果的第一条
time.sleep(1)
driver.find_element_by_xpath("//input[@name='wd']").send_keys("明天依旧可好")
time.sleep(2)
driver.find_element_by_xpath("//div[@class='result c-container ']//h3/a").click()
明天依旧可好
五、配置浏览器
我们在使用 selenium 时,可能需要对 chrome 做一些特殊的设置,以完成我们期望的浏览器行为,比如最大化窗口
,无窗口启动
等动作。这些需要selenium的ChromeOptions
来帮助我们完成
(一)配置浏览器
chromeoptions 是一个方便控制 chrome 启动时属性的类,主要提供如下的功能:
- 设置 chrome 二进制文件位置 (binary_location)
- 添加启动参数 (add_argument)
- 添加扩展应用 (add_extension, add_encoded_extension)
- 添加实验性质的设置参数 (add_experimental_option)
- 设置调试器地址 (debugger_address)
常用设置举例:
#设置无窗口
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://blog.csdn.net/qq_38251616')
1.add_argument常用系列
- 无窗口:- -headless
- 启动就最大化:- -start-maximized
- 设置窗口大小:- -window-size=100,100
- 禁用弹出拦截:- -disable-popup-blocking
- 禁用插件:- -disable-plugins
- 禁用图像:- -disable-images
- 伪装iphone登录:- -user-agent=iphone
- 伪装android:- -user-agent=android
- 设置语言为简体中文:- -lang=zh-CN
- 使用给定的 User-Agent 字符串:- -user-agent="这里填写User-Agent"
- 禁用Javascript:- -disable-javascript
- 指定用户文件夹User Data路径:- -user-data-dir="[PATH]"
注释:两个“-”中间是没有空格的,由于排版原因我在中间加了一个空格。
(二)添加代理
chrome_options = webdriver.ChromeOptions()
#设置代理
chrome_options.add_argument('--proxy-server=http://{ip}:{port}')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://blog.csdn.net/qq_38251616')
六、定位标签
定位方法示例:
#获取网页中的h1标签
h1 = driver.find_element_by_name("h1")
#获取网页中所有的h1标签
h1_list = driver.find_elements_by_name("h1")
单个元素选取:
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
多个元素选取:
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
七、页面操作
selenium最主要的优势在于我们可以在代码中添加需要对网页进行的操作,比如输入提交表单、点击按钮、清空输入框等等。下面我将常用的操作一一列举出来
1.点击
driver.find_element_by_xpath("//div[@class='result c-container ']//h3/a").click()
2.输入文本
driver.find_element_by_xpath("//input[@name='wd']").send_keys("明天依旧可好")
3.清空输入框
driver.find_element_by_xpath("//input[@name='wd']").clear()
4.关闭浏览器
driver.close()
5.拖放
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
6.切换窗口
窗口之间的切换是通过句柄的切换来完成的,每一个窗口对应着一个句柄(类似于ID)
window_handles
用于获取已经打开的所有窗口的句柄,返回列表;current_window_handle
用户获取当前窗口的句柄,返回字符串。
#获取所有窗口句柄
window_handle_list = driver.window_handles
#切换回第一个窗口,通过句柄实现
driver.switch_to_window(window_handle_list[0])
八、等待页面加载
(一)显示等待
显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。 最糟糕的案例是使用time.sleep(),它将条件设置为等待一个确切的时间段。 下面有一些方便的方法让你只等待需要的时间。WebDriverWait结合ExpectedCondition 是实现的一种方式。
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
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "//input[@name='wd']")))
finally:
print("网页加载完成")
上面的代码最多等待 10 秒,超时后就抛出 TimeoutException,假设在第4秒就找到了这个元素,那么也就不会多等剩下的6秒使时间,而是继续执行后续代码。WebDriverWait 默认每 500 毫秒调用一次 ExpectedCondition 中的方法,直到它返回成功信号,如果成功,则返回相应的内容,否则返回布尔类型的 False。
我这个是通过Xpath规则//input[@name='wd']
来判断页面是否渲染完成,当然你也可以换成其他的判断条件。我给出如下模板,
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
try:
element = WebDriverWait(driver, 等待时间范围).until(
EC.实现条件((By.定位方式, 定位值)))
finally:
print("网页加载完成")
(二)隐式等待
隐式等待是在尝试发现某个元素的时候,如果没能立刻发现,就等待固定长度的时间。默认设置是0秒。一旦设置了隐式等待时间,它的作用范围就是Webdriver对象实例的整个生命周期。
from selenium import webdriver
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.implicitly_wait(10)
driver.get('http://www.baidu.com/')
driver.find_element_by_xpath("//input[@name='wd']").send_keys("明天依旧可好")
九、后记
关于selenium实战项目请参考:【实现CSDN自动点赞】、【爬取QQ群中的人员信息】
我的专栏:【机器学习100天】、【K童鞋的爬虫笔记】
参考文章:selenium 定制启动 chrome 的选项、selenium+python配置chrome浏览器的选项、selenium 的显示等待与隐式等待、selenium-Python中文文档、Selenium中的“显示等待”和“隐式等待”
如果觉得我写得可以点个赞呗;如果有什么不足的地方,还你希望可以在下方留言告诉我。
网友评论