python3,网络爬虫学习,Selenium自动化测试工具的使用

#有些网页不包含Ajax请求,有些网页Ajax接口含有很多加密参数,很难直接分析Ajax来抓取

#解决方法是使用模拟浏览器运行的方式来爬取,本章主要学习Selenium和Splash的使用

#1、基本使用
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 EC
from selenium.webdriver.support.wait import WebDriverWait

# browser = webdriver.Chrome()    #声明使用什么浏览器
# try:
#     browser.get('https://www.baidu.com')    #打开什么网站
#     input = browser.find_element_by_id('kw')     #输入栏的id,找的方式多样
#     input.send_keys('python')                #输入python
#     input.send_keys(Keys.ENTER)               #确认发送
#     wait = WebDriverWait(browser,10)
#     wait.until(EC.presence_of_element_located((By.ID,'content_left')))
#     print(browser.current_url)             #输出当前的url地址
#     print(browser.get_cookies())          #输出cookies信息
#     print(browser.page_source)              #输出网页源代码
# finally:
#     browser.close()                         #关闭浏览器

#2、声明浏览器对象
#Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器,另外,也支持无界面浏览器PhantomJS
#初始化浏览器对象
# from selenium import webdriver
#
# browser = webdriver.Chrome()
# browser = webdriver.Firefox()
# browser = webdriver.Edge()
# browser = webdriver.PhantomJS()
# browser = webdriver.Safari()

#3、访问页面
# from selenium import webdriver
#
# browser = webdriver.Chrome()
# browser.get("https://www.baidu.com")
# print(browser.page_source)
# browser.close()

#4、查找节点
#Selenium提供了一系列查找节点的方法,
# from selenium import webdriver
#
# browser = webdriver.Chrome()
# browser.get("https://www.taobao.com/")
# # a1 = browser.find_element_by_id("q")
# # a3 = browser.find_element_by_name("q")
# # a4 = browser.find_element_by_xpath("//*[@id = 'q']")
# # a5 = browser.find_element(By.ID,"q")         #这种方法可以选择传入的参数,传参更加灵活
# # print(a1)
# # print(a3)
# # print(a4)
# print(a5)
# a5.send_keys('python')
# a5.send_keys(Keys.ENTER)
# browser.close()

#多个节点
#如果查找的目标只有一个可以用 find_element()方法,但是如果有多个节点时需要使用find_elements()方法
# from selenium import webdriver
# browser = webdriver.Chrome()
# browser.get("https://www.taobao.com/")
# list1 = browser.find_elements_by_xpath("//*[@data-cid = '1']")
# print(list1)

#节点交互
# import time
# from selenium import webdriver
# browser = webdriver.Chrome()
# browser.get("https://www.taobao.com/")
# input = browser.find_element_by_xpath("//*[@id = 'q']")
# input.send_keys("phone")
# input.clear()     #清空输入
# time.sleep(1)
# input.send_keys("python")
# button = browser.find_element_by_xpath("//*[@class='btn-search tb-bg']")   #找到按钮的节点
# button.click()           #模拟点击
# browser.close()

#动作链
# from selenium import webdriver
# from selenium.webdriver import ActionChains
#
# browser = webdriver.Chrome()
# url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
# browser.get(url)
# browser.switch_to.frame('iframeResult')
# source = browser.find_element_by_xpath('//*[@id="droppable"]')
# target = browser.find_element_by_xpath('//*[@id="draggable"]')
# actions =ActionChains(browser)
# actions.drag_and_drop(source,target)
# actions.perform()

#执行JavaScript
#对于某些操作,Selenium API并没有提供。比如下拉进度条,它可以直接模拟运行JavaScript,此时使用execute_script()方法即可实现
# from selenium import webdriver
# import time
# browser = webdriver.Chrome()
# browser.get("https://www.taobao.com")
# browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
# time.sleep(2)
# browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
# # browser.execute_script('alert("To Bottom")')

#获取节点信息
#1、获取属性
#我们可以使用get_attribute()方法来获取节点的属性,但是其前提是先选中这个节点,示例如下
# from selenium import webdriver
#
# browser = webdriver.Chrome()
# browser.get("https://www.baidu.com")
# logo = browser.find_element_by_xpath("//*[@id = 'result_logo']")
# print(logo)
# print(logo.get_attribute('onmousedown'))
# browser.close()

#2、获取文本值
#每个WebElement节点都有text属性,直接调用这个属性就可以得到节点内部的文本信息,这相当于pyquery的text()方法
# from selenium import webdriver
#
# browser = webdriver.Chrome()
# browser.get("https://www.qiushibaike.com/text/")
# input = browser.find_element_by_xpath("//*[@id ='qiushi_tag_120833039']//*[@class = 'content']/span")
# print(input.text)

#3、获取id、位置、标签名和大小
#另外,WebElement节点还有一些其他属性,比如id属性可以获取节点id,location属性可以获取该节点在页面中的相对位置tag_name属性可以获取标签名称,size可以获取节点的大小,也就是宽高
# from selenium import  webdriver
#
# browser = webdriver.Chrome()
# browser.get("https://www.qiushibaike.com/text/")
# input = browser.find_element_by_xpath("//*[@id='content-left']")
# print(input.get_attribute("class"))
# print(input.tag_name)
# print(input.location)
# print(input.size)
# browser.close()

#切换Frame
#网页中有一种节点叫做iframe,也就是子Frame( 框架/freɪm/),它的结构和外部网页的结构是完全相同的,Selenium打开页面后,它默认是在父级Frame中操作,他是不能获取到子Frame里面的节点的。这时就需要使用switch_to.frame()方法来切换Frame。示例:
# import time
# from selenium import webdriver
# from selenium.common.exceptions import NoSuchElementException
#
# browser = webdriver.Chrome()
# browser.get('https://www.bilibili.com/video/av9846552/?p=3')
# # print(browser.find_element_by_xpath("//*[@class='bilibili-player-video']/video"))
# browser.switch_to_frame("1、2016.8.26 The Chainsmokers - Don't Let Me Down")
# # print(browser.find_element_by_xpath("//*[@class='bilibili-player-video']/video/@src"))
# browser.close()

#11、延时等待
# 在Selenium中,get()方法会在网页框架加载结束后执行,此时如果获取page_source,可能并不是完全加载完成的页面,如果某些页面有额外的Ajax请求,我们在网页源代码中也不一定能获取成功,所以,这时需要延时等待一定的时间,确保节点已加载出来。

#隐式等待
# 当使用隐式等待执的时候,如果selenium没有在DOM中找到节点,将继续等待,超出设定时间后,则抛出找不到节点的异常。换句话说,当查找节点并没有立即出现时,隐式等待将等待一段时间再查找DOM,默认时间是0.示例如下:
# from selenium import webdriver
# browser = webdriver.Chrome()
# browser.implicitly_wait(10)         #隐式等待10s
# browser.get("https://www.zhihu.com/explore")
# input = browser.find_element_by_class_name('zu-top-add-question')
# print(input)
# browser.close()

#显示等待
#隐式等待的效果并没有那么好,因为我们只规定了一个固定的时间,而页面的加载时间会受到网络条件的限制
#还有一种更适合的显示等待方式,它指定想要查找的节点,然后指定了一个最长等待时间。如果在规定时间内加载出了这个节点,就返回查找的节点;如果规定时间时间依然没有加载出该节点,则抛出超时异常
# 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
#
# browser = webdriver.Chrome()
# browser.get('https://www.taobao.com/')
# wait = WebDriverWait(browser,10)           #指定了最长等待时间10s
# input = wait.until(EC.presence_of_element_located((By.ID,"q")))   #调用until()方法,传入等待条件expected_conditions
# button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))    #查看10s内是否能够点击
# print(input,button)
# """
#                         等待条件及其含义
# ------------------------------------------------------------------
# title_is                            标题是某内容
# title_contains                      标题包含某内容
# presence_of_element_located         节点加载出来,传入定位元组,如(By.ID,'q')
# 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             节点可点击
# stalness_of                         判断一个节点是否仍在DOM,判断页面是否已经刷新
# element_to_be_selected              节点可选则,传入节点对象
# element_selection_state_to_be       传入节点对象以及状态,相等返回True,否则返回False
# element_located_selection_state_to_be   传入定位元组以及状态,相等返回True,否则返回False
# alert_is_present                    是否出现警告
# ------------------------------------------------------------------------------------
# """

#前进和后退
#平时使用的浏览器都有前进与后退功能,Selenium也可以完成这个操作,它使用back()方法后退,使用forward()方法前进
# import time
# from selenium import webdriver
#
# browser = webdriver.Chrome()
# browser.get("https://www.baidu.com")
# browser.get("https://www.taobao.com/")
# browser.get("htttps://www.python.org/")
# browser.back()
# time.sleep(1)
# browser.forward()
# browser.close()

#Cookies
#使用Selenium,还可以方便的对Cookies进行操作,例如获取、添加、删除Cookies等,示例如下:
# from selenium import webdriver
# browser = webdriver.Chrome()
# browser.get("https://www.zhihu.com/explore")
# print(browser.get_cookies())
# browser.add_cookie({'name':'name','domain':"www.zhihu.com",'value':'germy'})
# print(browser.get_cookies())
# browser.delete_all_cookies()
# print(browser.get_cookies())

#选项卡管理
#在访问网页的时候,会开启一个个的选项卡,在Selenium中,我们可以对选项卡进行操作
# import time
# from selenium import webdriver
# browser = webdriver.Chrome()
# browser.get("https://www.baidu.com")
# browser.execute_script('window.open()')    #调用window.open()这个JavaScript语句开启一个选项卡
# print(browser.window_handles)
# browser.switch_to_window(browser.window_handles[1])   #切换到刚开启的选项卡
# browser.get('https://www.taobao.com')
# time.sleep(1)
# browser.switch_to_window(browser.window_handles[0])
# browser.get("https://www.zhihu.com/explore")
# browser.close()
# browser.switch_to_window(browser.window_handles[0])
# browser.close()

#异常处理
#捕获异常进行操作,通用

你可能感兴趣的:(python3,网络爬虫学习,Selenium自动化测试工具的使用)