ToB企服应用市场:ToB评测及商务社交产业平台

标题: 第十五天:Selenium与PhantomJS [打印本页]

作者: 石小疯    时间: 2025-2-21 22:11
标题: 第十五天:Selenium与PhantomJS
文章目录
一、Selenium
二、PhantomJS
三、使用方式
1.简朴例子
四、页面操作
1.页面交互
1)获取
2)输入内容
3)模拟点击某个按键
4)清空文本
5)元素拖拽
6)汗青纪录
五、API
六、等待
1. 隐式等待
2. 表现等待
3. 强制等待

一、Selenium

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开辟的,类型像我们玩游戏用的按键精灵,可以按指定的下令自动操作,不同是Selenium 可以直接运行在欣赏器上,它支持所有主流的欣赏器(包罗PhantomJS这些无界面的欣赏器)。
Selenium 可以根据我们的指令,让欣赏器自动加载页面,获取需要的数据,乃至页面截屏,或者判断网站上某些动作是否发生。
Selenium 自己不带欣赏器,不支持欣赏器的功能,它需要与第三方欣赏器结合在一起才能使用。但是我们偶然候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具取代真实的欣赏器。
PyPI网站下载 Selenium库https://pypi.python.org/simple/selenium,也可以用 第三方管理器
pip用下令安装:pip install selenium
Selenium 官方参考文档:http://selenium-python.readthedocs.io/index.html
二、PhantomJS

PhantomJS 是一个基于Webkit的“无界面”(headless)欣赏器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完备的欣赏器要高效
如果我们把 Selenium 和 PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处置惩罚 JavaScrip、Cookie、headers,以及任何我们真实用户需要做的事变
1. 注意:PhantomJS(python2)
只能从它的官方网站http://phantomjs.org/download.html) 下载。 因为 PhantomJS 是一个功能完善(虽然无界面)的欣赏器而非一个 Python 库,所以它不需要像 Python 的其他库一样安装,但我们可以通过Selenium调用PhantomJS来直接使用。
PhantomJS 官方参考文档:http://phantomjs.org/documentation
2. python3使用的欣赏器
随着Python3的普及,Selenium3也跟上了行程。而Selenium3最大的变化是去掉了Selenium RC,另外就是Webdriver从各自欣赏器中脱离,必须单独下载
    1) 安装Firefox geckodriver
    安装firefox最新版本,添加Firefox可执行步伐到系统环境变量。记得关闭firefox的自动更新
    firefox下载地下:https://github.com/mozilla/geckodriver/releases
    将下载的geckodriver.exe 放到path路径下 D:\Python\Python36\
    2) 安装ChromeDriver
    http://chromedriver.storage.googleapis.com/index.html
    注意版本号要对应
    下载下来的文件解压到Python36\Scripts
    chrome59版本以后可以变成无头的欣赏器,加以下参数
  1. options = webdriver.ChromeOptions()
  2. options.add_argument('--headless')
  3. chrome = webdriver.Chrome(chrome_options=options)
  4. chrome.get("http://ww.baidu.com")
复制代码
署理模式
  1. from selenium import webdriver
  2. option = webdriver.ChromeOptions()
  3. option.add_argument("--proxy-server=http://61.138.33.20:808")
  4. chrome = webdriver.Chrome(chrome_options=option)
  5. chrome.get('http://httpbin.org/get')
  6. info = chrome.page_source
  7. print(info)
复制代码
三、使用方式

Selenium 库里有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网站的欣赏器,但是它也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫
1.简朴例子

  1. # 导入 webdriver
  2. from selenium import webdriver
  3. # 要想调用键盘按键操作需要引入keys包
  4. from selenium.webdriver.common.keys import Keys
  5. # 调用环境变量指定的PhantomJS浏览器创建浏览器对象
  6. driver = webdriver.PhantomJS()
  7. # 如果没有在环境变量指定PhantomJS位置
  8. # driver = webdriver.PhantomJS(executable_path="./phantomjs"))
  9. # get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
  10. driver.get("http://www.baidu.com/")
  11. # 获取页面名为 wrapper的id标签的文本内容
  12. data = driver.find_element_by_id("wrapper").text
  13. # 打印数据内容
  14. print(data)
  15. # 打印页面标题 "百度一下,你就知道"
  16. print(driver.title)
  17. # 生成当前页面快照并保存
  18. driver.save_screenshot("baidu.png")
  19. # id="kw"是百度搜索输入框,输入字符串"长城"
  20. driver.find_element_by_id("kw").send_keys("尚学堂")
  21. # id="su"是百度搜索按钮,click() 是模拟点击
  22. driver.find_element_by_id("su").click()
  23. # 获取新的页面快照
  24. driver.save_screenshot("尚学.png")
  25. # 打印网页渲染后的源代码
  26. print(driver.page_source)
  27. # 获取当前页面Cookie
  28. print(driver.get_cookies())
  29. # ctrl+a 全选输入框内容
  30. driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
  31. # ctrl+x 剪切输入框内容
  32. driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
  33. # 输入框重新输入内容
  34. driver.find_element_by_id("kw").send_keys("python爬虫")
  35. # 模拟Enter回车键
  36. driver.find_element_by_id("su").send_keys(Keys.RETURN)
  37. # 清除输入框内容
  38. driver.find_element_by_id("kw").clear()
  39. # 生成新的页面快照
  40. driver.save_screenshot("python爬虫.png")
  41. # 获取当前url
  42. print(driver.current_url)
  43. # 关闭当前页面,如果只有一个页面,会关闭浏览器
  44. # driver.close()
  45. # 关闭浏览器
  46. driver.quit()
  47. # 浏览器退出Bug-解决方案
  48. os.system('taskkill /im chromedriver.exe /F')
  49. os.system('taskkill /im chrome.exe /F')
复制代码
四、页面操作

1.页面交互

仅仅抓取页面没有多大卵用,我们真正要做的是做到和页面交互,比如点击,输入等等。那么前提就是要找到页面中的元素。WebDriver提供了各种方法来寻找元素。例如下面有一个表单输入框
  1. <input type="text" name="passwd" id="passwd-id" />
复制代码
1)获取

  1. element = driver.find_element_by_id("passwd-id")
  2. element = driver.find_element_by_name("passwd")
  3. element = driver.find_elements_by_tag_name("input")
  4. element = driver.find_element_by_xpath("//input[@id='passwd-id']")
复制代码
注意:
文本必须完全匹配才可以,所以这并不是一个很好的匹配方式
在用 xpath 的时候还需要注意的如果有多个元素匹配了 xpath,它只会返回第一个匹配的元素。如果没有找到,那么会抛出 NoSuchElementException 的异常
2)输入内容

  1. element.send_keys("some text")
复制代码
3)模拟点击某个按键

  1. element.send_keys("and some", Keys.ARROW_DOWN)
复制代码
4)清空文本

  1. element.clear()
复制代码
5)元素拖拽

要完成元素的拖拽,首先你需要指定被拖动的元素和拖动目的元素,然后利用 ActionChains 类来实现
  1. element = driver.find_element_by_name("source")
  2. target = driver.find_element_by_name("target")
  3. from selenium.webdriver import ActionChains
  4. action_chains = ActionChains(driver)
  5. action_chains.drag_and_drop(element, target).perform()
复制代码
6)汗青纪录

操作页面的进步和退却功能
  1. driver.forward()
  2. driver.back()
复制代码
五、API

元素选取
1) 单个元素选取
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

2)多个元素选取
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

3)利用 By 类来确定哪种选择方式
  1. from selenium.webdriver.common.by import By
  2. driver.find_element(By.XPATH, '//button[text()="Some text"]')
  3. driver.find_elements(By.XPATH, '//button')
复制代码
  By 类的一些属性如下:
  
  ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
  六、等待

1. 隐式等待

到了一定的时间发现元素还没有加载,则继承等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立刻执行。
  1. from selenium import webdriver
  2. url = 'https://www.guazi.com/nj/buy/'
  3. driver = webdriver.Chrome()
  4. driver.get(url)
  5. driver.implicitly_wait(100)
  6. print(driver.find_element_by_class_name('next'))
  7. print(driver.page_source)
复制代码
2. 表现等待

指定一个等待条件,并且指定一个最长等待时间,会在这个时间内进行判断是否满足等待条件,如果建立就会立刻返回,如果不建立,就会不停等待,直到等待你指定的最长等待时间,如果还是不满足,就会抛出异常,如果满足了就会正常返回
  1. url = 'https://www.guazi.com/nj/buy/'
  2.    driver = webdriver.Chrome()
  3.    driver.get(url)
  4.    wait = WebDriverWait(driver,10)
  5.    wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'next')))
  6.    print(driver.page_source)
复制代码
presence_of_element_located
元素加载出,传入定位元组,如(By.ID, 'p')
presence_of_all_elements_located
所有元素加载出
element_to_be_clickable
元素可点击
element_located_to_be_selected
元素可选择,传入定位元组
3. 强制等待

使用 time.sleep

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4