irpas技术客

爬虫工具 - selenium_顽固油渍

大大的周 6609

一、selenium的基本使用

1. 安装(换元安装):

? ? ? ? 在CMD窗口中输入:pip install selenium -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

? ? ? ? ?若提示pip命令不可以或安装失败,先使用命令 upgrade? pip 更新pip安装命令

2. 案例 -- 打开百度输入“爬虫”搜索,并返回网页的一些信息

from selenium import webdriver # 驱动浏览器 from selenium.webdriver.common.by import By # 选择器 from selenium.webdriver.common.keys import Keys # 按钮 from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载完毕 from selenium.webdriver.support import expected_conditions as EC # 1.驱动浏览器 brower = webdriver.Chrome() # 2.请求页面, --返回的数据封装在了browser对象里,不需要额外的变量接收 brower.get("http://·") # 调用浏览器驱动访问站点 # 3.拿到输入框 # text_input = brower.find_element_by_id('kw') # 方法1,不建议使用!!! text_input = brower.find_element(By.ID, 'kw') # 4.向输入框中写入内容 text_input.send_keys("爬虫") # 5.按下回车按钮 text_input.send_keys(Keys.ENTER) # 等待事件,防止网速过慢 wait = WebDriverWait(brower, 100) # 参数1:浏览器对象,参数2:时间 # 等待某元素出现 presence_of_element_located()传入的参数格式是一个元组 wait.until(EC.presence_of_element_located((By.ID, 'result_tts_player'))) print(brower.current_url) # 查看网页url print(brower.get_cookies()) # 查看cookie信息 print(brower.page_source) # 查看网页原码 brower.close() # 关闭浏览器

3. 声明不同的浏览器对象

from selenium import webdriver browser = webdriver.Chrome() # 谷歌浏览器,一般都使用Chrome browser = webdriver.Firefox() browser = webdriver.PhantomJS() browser = webdriver.Safari()

4. 访问页面

from selenium import webdriver # 声明Chromeduix browser = webdriver.Chrome() # 请求页面 browser.get("https://·") # 获取网页源代码 print(browser.page_source) # 关闭浏览器 browser.close()

5. 查找元素

? ? (1)查找单个元素的方法:

????????????????find_element(By.ID,"id") 根据id属性来定位

????????????????find_element(By.NAME,"name") 根据name元素来定位

????????????????find_element(By.XPATH,"xpath语法") 根据xpath语法来定位

????????????????find_elemnt(By.TAG_NAME,"input") 根据标签名来定位

????????????????find_element(By.CLASS_NAME,"classname") 根据class的名字来定位

????????????????find_element(By.CSS_SELECTOR,"#id") 根据css选择器来定位

????????????????find_element(By.LINK_TEXT,"text") 根据文本属性

???案例1:

from selenium import webdriver # 单个元素 browser = webdriver.Chrome() browser.get("http://·") browser.find_element(By.LINK_TEXT, '新闻').click() # 通过.click()点击目标链接 browser.close()

???案例2:

browser = webdriver.Chrome() browser.get("http://·") # 1.通过元素ID查找 by_id = browser.find_element(By.ID,'q') by_id.send_keys('美食') print(by_id) # 2.通过css选择器查找 css_select = browser.find_element(By.CSS_SELECTOR,'#q') css_select.send_keys('美食') # 3.通过xpath查找 xpath = browser.find_element(By.XPATH,'//*[@id="q"]') xpath.send_keys('美食') browser.close()

? ?(2)查找多个元素:

????????find_elements(By.ID,"id") 根据id属性来定位

????????find_elements(By.NAME,"name") 根据name元素来定位

????????find_elements(By.XPATH,"xpath语法") 根据xpath语法来定位

????????find_elemnts(By.TAG_NAME,"input") 根据标签名来定位

????????find_elements(By.CLASS_NAME,"classname") 根据class的名字来定位

????????find_elements(By.CSS_SELECTOR,"#id") 根据css选择器来定位

????????find_elements(By.LINK_TEXT,"text") 根据文本属性

案例:

from selenium import webdriver # 驱动浏览器 from selenium.webdriver.common.by import By # 选择器 browser = webdriver.Chrome() browser.get("http://·") # 通过CSS选择器定位 elements = browser.find_elements(By.CSS_SELECTOR, '.service-bd li') # print(elements) # 以列表形式返回 for e in elements: print(e)

6. 元素的交换操作

案例:对获取的元素调用交换方法

import time from selenium import webdriver # 驱动浏览器 from selenium.webdriver.common.by import By # 选择器 browser = webdriver.Chrome() browser.get("http://·") text_input = browser.find_element(By.ID, 'key') text_input.send_keys("iphone") time.sleep(2) # 清空原来的文本内容 text_input.clear() text_input.send_keys('iPad') # 找到按钮并单击 button = browser.find_element(By.CLASS_NAME, 'button') button.click() browser.close()

7.?交互动作ActionChains,将动作附加到动作链中串行执行

from selenium import webdriver # 驱动浏览器 from selenium.webdriver.common.by import By # 选择器 browser = webdriver.Chrome() url = "http://·/try/try.php?filename=jqueryui-api-droppable" browser.get(url) """ webDriver只能在一个页面上对元素识别和定位 对于frame/iframe表单内嵌页面上的元素无法直接定位, 此时就需要通过switch_to.frame()方法将当前定位的主题切换为iframe表单的内嵌页面中, switch_to.frame()默认可以直接提取表单的id和name属性 """ #.switch_to.frame() from selenium.webdriver import ActionChains browser.switch_to.frame('iframeResult') # 将当前定位的主题切换为iframe表单的内嵌页面中 A = browser.find_element(By.CSS_SELECTOR, '#draggable') B = browser.find_element(By.CSS_SELECTOR, '#droppable') # 产生一个动作执行器 actions = ActionChains(browser) actions.drag_and_drop(A, B) # A移动到B actions.perform() # 执行动作链 browser.close()

8. 执行JavaScript

?selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了

????????滚动页面方法execute_script() 该方法可调用原生JavaScript的api

????????滚动到底部:window.scrollTo(0,document.body.scrollHeight)

????????滚动到顶部:window.scrollTo(0,0)

? 说明:

????????window:js的window对象

????????scrollTo:window的方法,可以滚到页面的任何位置

????????scrollHeight:是dom元素的通用属性,document.body.scrollHeight会返回body元素的高度,基本上就是页面的高度

????????scrollLeft:获取位于对象左边界和窗口目前可见内容的最左端之间的距离

????????scrollTop:获取位于对象最顶端和窗口中可见内容的最顶端之间的距离

????????scrollWidth:获取对象滚动的宽度

案例:

import time from selenium import webdriver # 驱动浏览器 driver = webdriver.Chrome() driver.get('http://news.baidu.com') time.sleep(2) # 滚动到浏览器底部 js = "window.scrollTo(0,document.body.scrollHeight)" driver.execute_script(js) # 执行js代码 time.sleep(2) # 回到浏览器顶部 js2 = "window.scrollTo(0,0)" driver.execute_script(js2)

9. 获取元素信息

????????获取文本及其属性 :.text文本值, get_attribute()根据属性获取属性值

from selenium import webdriver # 驱动浏览器 from selenium.webdriver.common.by import By # 选择器 browser = webdriver.Chrome() url = "https://·/explore" browser.get(url) # 知乎,圆桌讨论 l = browser.find_element(By.CSS_SELECTOR, '.ExploreRoundtableCard.ExploreHomePage-roundtableCard .ExploreRoundtableCard-header .ExploreRoundtableCard-title') print(l) print("--------------------------------------") # 返回的l是列表类型,可以遍历返回 # for i in l: # print(i) # print(i.text) # print(i.get_attribute('href')) # 找单个元素 logo = browser.find_element(By.XPATH,'//*[@id="special"]/div[2]/div/div[3]/div[1]/div[1]/a') print(logo) print(logo.text) print(logo.get_attribute('href'))

10. 等待

????????等待特定元素出现后做某事,通常用于等待某个网页元素加载完毕后进行后续操作,避免出现异常。

EC模块的使用方法:

????????导包:from selenium.webdriver.support import expected_conditions as EC

????????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 frame加载并切换

????????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,否则返回False

????????element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False

???????? alert_is_present 是否出现Alert

案例:

from selenium import webdriver # 驱动浏览器 from selenium.webdriver.common.by import By # 选择器 from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载完毕 from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Chrome() browser.get("http://·") wait = WebDriverWait(browser, 100) # 等待特定元素加载完 input = wait.until(EC.presence_of_element_located((By.ID, 'J_Toolkit'))) print(input)

11. 前进后退

import time from selenium import webdriver # 驱动浏览器 browser = webdriver.Chrome() browser.get("http://·") browser.get("http://·") browser.get("http://·") browser.back() # 后退 淘宝 time.sleep(3) browser.forward() # 前进 京东 time.sleep(3)

12. 选项卡管理

????????窗口切换 switch_to_window(窗口ID) switch_to.window(窗口ID) (python3.8以上版本都支持,python3.7只支持后者写法)

????????查看所有窗口ID window_handles

????????FAQ:只有切换到当前窗口时,才能操作当前窗口(比如翻页、获取源代码等等)

案例:

import time from selenium import webdriver # 驱动浏览器 browser = webdriver.Chrome() browser.get("http://·") # 调用原生JavaScript的api接口 browser.execute_script('window.open()') # 选项卡1 窗口1 time.sleep(1) browser.execute_script('window.open()') # 选项卡2 窗口2 print(browser.window_handles) # 查看当前浏览器所有窗口ID # 给新选项卡窗口访问目标站点 .switch.to.window browser.switch_to.window(browser.window_handles[0]) browser.get('https://·/') browser.switch_to.window(browser.window_handles[1]) #加载窗口2 切换到窗口2 browser.get('https://·') # 窗口2 打开淘宝 browser.switch_to.window(browser.window_handles[2]) browser.get('https://jd.com') browser.switch_to.window(browser.window_handles[1]) browser.page_source

13. 异常处理

异常处理模块所在位置:from selenium.common.exceptions import TimeoutException, NoSuchElementException

案例:

from selenium import webdriver # 驱动浏览器 from selenium.webdriver.common.by import By # 选择器 from selenium.common.exceptions import TimeoutException, NoSuchElementException browser = webdriver.Chrome() try: browser.get('https://·') except TimeoutException: print('Time out') try: browser.find_element(By.ID,'hello') except NoSuchElementException: print('No Element') finally: #无论try语句中是否抛出异常,finally中的语句一定会被执行 browser.close()

补充:

设为开发者模式(无头模式),避免被监测导致爬虫失败,只需添加参数 ????????options = webdriver.ChromeOptions()? ?# 配置对象 ????????options.add_experimental_option('excludeSwitches', ['enable-automation'])? ?# 写入参数 ????????browser = webdriver.Chrome(options=options) ????????browser.get('https://·')


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #爬虫工具 #selenium