博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python下selenium的简单用法
阅读量:6963 次
发布时间:2019-06-27

本文共 13712 字,大约阅读时间需要 45 分钟。

1.学习之前请下载chromedriver等之类的浏览器插件

"""动态渲染页面页面抓取。JavaScript除了可以Ajax直接获取数据之外,还可以通过计算生成,加密参数等形式来更安全的获取数据。这些通过特别处理的数据我们很难找出规律直接Ajax去获取。为了解决这些问题,我们可以直接使用模拟浏览器运行的方式来请求数据,这样可以看到的是什么,抓取的源码就是什么,也可以避免去分析Ajax接口到底有什么参数。Python提供的模拟浏览器运行的库:Selenium、Splash、PyV8等""""""Selenium的用法解析支持的浏览器Chrome、Firefox、PhantomJS还有Android、BlackBerry等手机端浏览器:browser = webdriver.Chrome()browser = webdriver.Firefox()browser = webdriver.Edge()browser = webdriver.PhantomJS()https://selenium-python.readthedocs.io/api.html     webdriver的API解释"""from selenium import webdriver                      # 可选择的浏览器from selenium.webdriver.common.by import By         # 选择器方法from selenium.webdriver.common.keys import Keys     # 键盘按键对应表from selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWait# 声明浏览器对象并将其赋值为browserbrowser = webdriver.Chrome()try:    # 调用get()方法请求网页    browser.get("https://www.baidu.com")    # 调用find_element_by_id()方法查找输入节点ID    input = browser.find_element_by_id("kw")    # WebElement类型结果。调用此类下的send_keys()方法输入查找关键字    input.send_keys("Python")    # 调用send_keys()输入键盘ENTER键    input.send_keys(Keys.ENTER)    # 传入webdriver实例browser和超时时间    wait = WebDriverWait(browser, 10)    # until()方法确认请求的结果不是False。presence_of_element_located()方法检查DOM上是否存在查询的该元素    wait.until(EC.presence_of_element_located((By.ID, "content_left")))    # 请求成功之后分别打印返回的当前url、cookies、网页源代码    print(browser.current_url)    print(browser.get_cookies())    print(browser.page_source)finally:    # 最后关闭浏览器    browser.close()
View Code
from selenium import webdriverimport time# 获取chromedriver.exe路径driver_path = r"E:\Program Files\chromedriver.exe"# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 访问网页driver.get("https://www.baidu.com/")# 通过page_source获取网页源代码print(driver.page_source)# 等待5秒查看操作结果time.sleep(5)# 关闭当前网页driver.close()# 退出浏览器driver.quit()

2.用selenium输入

"""通过Selenium API获取节点信息"""from selenium import webdriverfrom selenium.webdriver import ActionChains# 声明浏览器对象并将其赋值为browserbrowser = webdriver.Chrome()url = "https://zhihu.com/explore"# 调用get()方法请求网页browser.get(url)# 通过ID属性找到对应节点logo = browser.find_element_by_id("zh-top-link-logo")# 打印节点信息WebElement类型结果print(logo)# 获取CSS中的class属性print(logo.get_attribute("class"))# 获取节点文本信息print(logo.text)
View Code
"""查找节点"""from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.remote.webelement import WebElement   # 包含所有节点查找方法# 声明浏览器对象并将其赋值为browserbrowser = webdriver.Chrome()# 调用get()方法访问京东页面browser.get("https://www.jd.com")"""单个查找节点方法"""# 根据ID获取输入框input_first = browser.find_element_by_id("key")# 根据CSS获取输入框input_second = browser.find_element_by_css_selector("#key")# 根据XPath获取输入框input_third = browser.find_element_by_xpath("//input[@id='key']")# 通用的函数查找版本,参数更灵活input_fourth = browser.find_element(By.ID, "key")# 同样的WebElement类型结果print(input_first, input_second, input_third, input_fourth)"""多个查找节点方法"""# CSS选择器查找lis = browser.find_elements(By.CSS_SELECTOR, ".cate_menu_item")# XPath查找lis_first = browser.find_elements_by_xpath("//li[@class='cate_menu_item']")# 返回结果为列表,列表中的每个元素还是WebElement类型print(lis, lis_first)# 关闭浏览器browser.close()
View Code
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom lxml import etree# 获取chromedriver.exe路径driver_path = r"E:\Program Files\chromedriver.exe"# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 访问网页driver.get("https://www.baidu.com/")# 1.通过id输入文本inputTag = driver.find_element_by_id("kw")# 2.第二种查找方式inputTag = driver.find_elements(By.ID, "kw")[0]# 3.通过name输入文本inputTag = driver.find_element_by_name("wd")# 4.通过属性输入文本inputTag = driver.find_element_by_class_name("s_ipt")# 5.通过xpath输入文本inputTag = driver.find_element_by_xpath("//input[@id='kw']")# 6.find_elements,后面添加s表示查找多个inputTag = driver.find_elements_by_css_selector(".quickdelete-wrap > input")[0]# 输入文本必须使用send_keysinputTag.send_keys("python")# 特殊:查找标签和属性时可以使用lxml替代,因为lxml是C语言写的效率更高html = etree.HTML(driver.page_source)html.xpath("")

3.用selenium表单提交

"""节点操作"""from selenium import webdriverimport time# 声明浏览器对象并将其赋值为browserbrowser = webdriver.Firefox()# 调用get()方法请求网页browser.get("https://www.jd.com")# XPath查找输入框input = browser.find_element_by_xpath("//input[@id='key']")# 调用send_keys()方法输入文字input.send_keys("华为")time.sleep(2)# 调用clear()方法清空输入的文字input.clear()# 再次输入文字input.send_keys("iPhone")# CSS查找button按钮button = browser.find_element_by_css_selector(".button")# 调用click()方法点击按钮完成搜索button.click()
View Code
from selenium import webdriverimport time# 获取chromedriver.exe路径driver_path = r"E:\Program Files\chromedriver.exe"# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 访问网页driver.get("https://www.baidu.com/")# 操作表单元素inputTag = driver.find_element_by_id("kw")inputTag.send_keys("python")# 按钮点击submitTag = driver.find_element_by_id("su")submitTag.click()time.sleep(5)# # 清除输入inputTag.clear()

4.操作selenium完成百度搜索

"""动作链"""from selenium import webdriverfrom selenium.webdriver import ActionChains     # 自动化低级别交互的方法browser = webdriver.Chrome()url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"browser.get(url)# switch_to()方法将焦点切换到对应的选项,frame()方法通过索引、名称或webelement将焦点切换到指定的帧。browser.switch_to.frame("iframeResult")# 通过ID找到需要的元素source = browser.find_element_by_id("draggable")target = browser.find_element_by_id("droppable")# 声明ActionChains对象传入webdriver实例browser并赋值为actions变量actions = ActionChains(browser)# 按住源元素上的鼠标左键,然后移动到目标元素并释放鼠标按钮。actions.drag_and_drop(source, target)# perform()方法按顺序执行所有储存的操作。完成拖拽actions.perform()
View Code
from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChains# 获取chromedriver.exe路径driver_path = r"E:\Program Files\chromedriver.exe"# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 访问网页driver.get("https://www.baidu.com/")# 行为链,完成百度搜索PythoninputTag = driver.find_element_by_id("kw")# 找到输入框和按钮submitBtn = driver.find_element_by_id("su")# 生成一个动作链对象actions = ActionChains(driver)# 移动到输入框输入pythonactions.move_to_element(inputTag)actions.send_keys_to_element(inputTag, "python")# 移动到按钮点击按钮actions.move_to_element(submitBtn)actions.click(submitBtn)# 执行所有存储在ActionChains中的动作actions.perform()

5.操作selenium获取cookies

"""Cookies的获取和修改、删除"""from selenium import webdriver# 声明浏览器对象并将其赋值为browserbrowser = webdriver.Firefox()# 开始请求网页browser.get("https://www.taobao.com")# 获取Cookies信息print(browser.get_cookies())# 添加cookie信息browser.add_cookie({
"name": "yangyu", "domain": "www.taobao.com", "value": "germey"})# 再次获取已添加cookie的列表,会包含两个cookies字典print(browser.get_cookies())# 删除所有Cookies信息browser.delete_all_cookies()# 返回空列表print(browser.get_cookies())
View Code
from selenium import webdriver# 获取chromedriver.exe路径driver_path = r"E:\Program Files\chromedriver.exe"# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 访问网页driver.get("https://www.baidu.com/")# 获取所有cookiesfor cookie in driver.get_cookies():    print(cookie)# 获取对应的cookieprint(driver.get_cookie("PSTM"))# 删除对应的cookiedriver.delete_cookie("PSTM")print(driver.get_cookie("PSTM"))

6.操作selenium完成点击和页面等待

"""目前,大多数Web应用程序都在使用AJAX技术。当浏览器加载页面时,该页面中的元素可能以不同的时间间隔加载。这使定位元素变得困难:如果DOM中尚未存在元素,则locate函数将引发ElementNotVisibleException异常。使用等待,我们可以解决这个问题。等待在执行的操作之间提供了一些松弛 - 主要是使用元素定位元素或任何其他操作。Selenium Webdriver提供两种类型的等待 - 隐式和显式。1.显式等待使WebDriver等待某个条件发生,然后再继续执行。(建议使用显示等待)显式等待是您定义的代码,用于在进一步执行代码之前等待某个条件发生。这种情况的极端情况是time.sleep(),它将条件设置为等待的确切时间段。提供了一些便捷方法,可帮助您编写仅在需要时等待的代码。WebDriverWait与ExpectedCondition相结合是一种可以实现的方法。title_is                                # 标题是某内容title_contains                          # 标题包含某内容presence_of_element_located             # 节点加载出来,传人定位元组,如(By.ID ,'p')visibility_of_element_located           # 节点可见,传人定位元组visibility_of                           # 可见,传入节点对象presence_of_all_elements_located        # 所有节点加载出来text_to_be_present_in_element           # 某个节点文本包含某文字text_to_be_present_in_element_value     # 某个节点值包含某文字frame_to_be_available_and_switch_to_it  # 加载并切换invisibility_of_element_located         # 节点不可见element_to_be_clickable                 # 节点可点击staleness_of                            # 判断一个节点是否仍在DOM ,可判断页面是否已经刷新element_to_be_selected                  # 节点可选择,传节点对象element_located_to_be_selected          # 节点可选择,传人定位元组element_selection_state_to_be           # 传人节点对象以及状态,相等返回True ,否则返回Falseelement_located_selection_state_to_be   # 传入定位元组以及状态,相等返回True ,否则返回Falsealert_is_present                        # 是否出现警告"""from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 声明浏览器对象并将其赋值为driverdriver = webdriver.Firefox()# 调用get()方法请求网页driver.get("https://www.taobao.com/")try:    # WebDriverWait指定最长等待时间。而until()方法指定等待的条件    element = WebDriverWait(driver, 10).until(        # 检查该元素是否在10秒内加载出来并成功返回。没有则抛出异常        EC.presence_of_element_located((By.ID, "q"))    )    button = WebDriverWait(driver, 10).until(        # 检查元素是否可以点击        EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn-search"))    )    print(element, button)finally:    # 最后执行退出    driver.quit()"""2.隐式等待使WebDriver在尝试定位元素时将DOM轮询一段时间。隐式等待告诉WebDriver在尝试查找不能立即可用的任何元素(或元素)时轮询DOM一段时间。默认设置为0.设置后,将为WebDriver对象的生命周期设置隐式等待.如果查找的节点没有立即出现,将会等待一段时间再次查找,这段时间是固定的,而页面加载会受到网络条件的影响,是不固定因素"""from selenium import webdriver# 声明浏览器对象并将其赋值为driverdriver = webdriver.Firefox()# implicitly_wait()方法实现隐式等待。driver.implicitly_wait(10)# 开始请求网页driver.get("https://www.zhihu.com/explore")# 找到指定的元素input = driver.find_element_by_id("zu-top-add-question")print(input)
View Code
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 获取chromedriver.exe路径driver_path = r"E:\Program Files\chromedriver.exe"# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 访问网页driver.get("https://www.douban.com/")# 操作checkboxrememberBtn = driver.find_element_by_name("remember")# # 自动点击rememberBtn.click()# 页面等待# 1.隐式等待,傻傻等10秒driver.implicitly_wait(10)driver.find_element_by_id("form_email")# 2.显示等待,获取到数据后立即结束等待WebDriverWait(driver, 10).until(    EC.presence_of_element_located((By.ID, "form_email")))

7.操作selenium在同一个窗口中生成新页面

"""选项卡管理"""import timefrom selenium import webdriver# 声明浏览器对象并将其赋值为browserbrowser = webdriver.Chrome()# 开始请求网页browser.get("https://www.baidu.com")# 调用execute_script()执行JavaScript()语句开启新选项卡browser.execute_script("window.open()")# 获取选项卡列表print(browser.window_handles)# 调用switch_to_window()方法切换选项卡browser.switch_to_window(browser.window_handles[1])# 在新选项卡里面请求网页browser.get("https://www.jd.com")time.sleep(3)# 切换回原选项卡browser.switch_to_window(browser.window_handles[0])# 再次请求网页browser.get("https://taobao.com")
View Code
"""Selenium API没有的操作,可以用execute_script()方法执行JavaScript语句解决"""from selenium import webdriver# 声明浏览器对象并将其赋值为browserbrowser = webdriver.Chrome()# 调用get()方法请求网页browser.get("https://www.zhihu.com/explore")# 调用execute_script()方法在当前窗口/框架中同步执行JavaScript语句,下拉进度条browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")# 弹出alert提示框browser.execute_script("alert('To Bottom')")
View Code
from selenium import webdriver# 获取chromedriver.exe路径driver_path = r"E:\Program Files\chromedriver.exe"# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 访问网页driver.get("https://www.douban.com/")# 在同一个窗口中生成新的页面driver.execute_script("window.open('https://www.douban.com/')")# 打印当前列表中有几个窗口,里面的对象就是窗口句柄print(driver.window_handles)# 下标切换选中窗口driver.switch_to_window(driver.window_handles[1])# 打印当前urlprint(driver.current_url)

8.操作selenium选择选择框中数据

"""切换子框架、iframe,相当于页面的子页面。Selenium打开页面后,默认是在父级的Frame里面操作,如果我们要切换到子页面,则需要使用switch_to.frame()方法切换"""import timefrom selenium import  webdriverfrom selenium.common.exceptions import NoSuchElementException# 声明浏览器对象并将其赋值为browserbrowser = webdriver.Chrome()url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"# 调用get()方法请求网页browser.get(url)# 切换到子framebrowser.switch_to.frame("iframeResult")# try...except...语句处理和捕获异常try:    # 尝试获取父级CSS属性    logo = browser.find_element_by_class_name("logo")except NoSuchElementException as e:    # 获取失败,打印失败信息    print("NO LOGO", e.args)# 切换到父级Framebrowser.switch_to.parent_frame()# 获取父级的CSS属性logo = browser.find_element_by_class_name("logo")# 打印获取的属性信息print(logo)print(logo.text)
View Code
from selenium import webdriverfrom selenium.webdriver.support.ui import Select# 获取chromedriver.exe路径driver_path = r"E:\Program Files\chromedriver.exe"# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 操作selectdriver.get("http://www.dytt8.net/")selectBtn = Select(driver.find_element_by_name("field"))# 下标选择selectBtn.select_by_index(2)# value选择selectBtn.select_by_value("http://s.ygdy8.com/plus/so.php?typeid=19&keyword=")# 内容选择selectBtn.select_by_visible_text("动漫")

9.操作selenium设置代理IP

from selenium import webdriver# 获取chromedriver.exe路径driver_path = r"E:\Program Files\chromedriver.exe"# 设置代理IPoptions = webdriver.ChromeOptions()options.add_argument("--proxy-server=http://121.49.110.65:8888")# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path, chrome_options=options)driver.get("http://httpbin.org/ip")

10.操作selenium选择浏览器历史记录

"""前进forward()和后退back()"""import timefrom selenium import webdriverbrowser = webdriver.Chrome()browser.get("https://www.baidu.com")browser.get("https://www.taobao.com")browser.get("https://www.jd.com")# 在浏览器历史记录中向后退一步。browser.back()time.sleep(3)# 在浏览器历史记录中向后前一步。browser.forward()browser.close()

 

转载于:https://www.cnblogs.com/Guishuzhe/p/9854388.html

你可能感兴趣的文章
一场版本升级引发的性能血案 - 王者归来
查看>>
httpd 服务器的三大引擎 prefork、worker、event分析
查看>>
schedule和scheduleAtFixedRate
查看>>
golang之runtime.SetFinalizer
查看>>
tomcat 内存溢出
查看>>
操作用户 简介
查看>>
JDK工具(一)–Java编译器javac
查看>>
Cassandra数据模型设计
查看>>
JDBC Java SQL Server 连接
查看>>
Maven部署Struts2环境详解
查看>>
日常记录-js篇
查看>>
使用 Java Native Interface 的最佳实践
查看>>
关于 Perl 与 Python 的起源和特点
查看>>
taobao npm registry
查看>>
jenkins------结合maven将svn项目自动部署到tomcat下
查看>>
我的友情链接
查看>>
MySQL二进制包使用mysql_upgrade版本更新升级MySQL 5.7
查看>>
css3文本溢出显示控制
查看>>
MySQL 可优化的一些参数详解
查看>>
JAVA中的内存映射文件
查看>>