人生苦短,我用 Pythonhtml
前文传送门:前端
小白学 Python 爬虫(1):开篇python
小白学 Python 爬虫(2):前置准备(一)基本类库的安装git
小白学 Python 爬虫(3):前置准备(二)Linux基础入门github
小白学 Python 爬虫(4):前置准备(三)Docker基础入门web
小白学 Python 爬虫(5):前置准备(四)数据库基础chrome
小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装数据库
小白学 Python 爬虫(10):Session 和 Cookies
小白学 Python 爬虫(11):urllib 基础使用(一)
小白学 Python 爬虫(12):urllib 基础使用(二)
小白学 Python 爬虫(13):urllib 基础使用(三)
小白学 Python 爬虫(14):urllib 基础使用(四)
小白学 Python 爬虫(15):urllib 基础使用(五)
小白学 Python 爬虫(16):urllib 实战之爬取妹子图
小白学 Python 爬虫(17):Requests 基础使用
小白学 Python 爬虫(18):Requests 进阶操做
小白学 Python 爬虫(21):解析库 Beautiful Soup(上)
小白学 Python 爬虫(22):解析库 Beautiful Soup(下)
小白学 Python 爬虫(23):解析库 pyquery 入门
小白学 Python 爬虫(26):为啥买不起上海二手房你都买不起
小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到放弃(一)
在介绍交互以前,咱们先简单了解一下新名词:AJAX 。
AJAX 全写为 “Asynchronous Javascript And XML” (异步 JavaScript 和 XML),是指一种建立交互式网页应用的网页开发技术。
AJAX 是一种在无需从新加载整个网页的状况下,可以更新部分网页的技术。
重点来了,咱们若是在网站中使用 AJAX ,能够在整个网页不刷新的状况下,更够更新网页上的显示信息(DOM 节点),也就是 DOM 节点,这种技术被普遍的应用到各个网站之中,最开始的时候,你们都只是使用它更新部分的网页,也不知道是哪位大佬异想天开:既然 AJAX 能够更新部分网页,那么能不能用它来更新所有网页呢?这就产生了现代的前端框架:React 、 Vue 和 Angular。
这种思想,如今被更加普遍的应用于各大网站之中,由于这种方式,前端页面上只有最基础的 DOM 节点,其他全部的 DOM 节点都是由 JavaScript 动态渲染出来的,而 JavaScript 都是通过打包处理的,可读性极差。
那么为何要选用前端框架呢? HTML + CSS + JQuery 就不行么?
固然不是,其实之因此如今咱们须要选择框架,本质上是由于咱们面临的需求变了。你们确定都明白若是咱们只写一个纯展现信息的页面,没有任何交互功能的页面,其实即使是如今,咱们也是不须要选择框架的,咱们只须要写几行 CSS 和 HTML 就能够完成任务。
因此是由于咱们面临的需求变得复杂了,咱们的应用常常须要在运行时作一些交互。
现代的前端开发,咱们开发的应用常常须要在运行时来作一些交互,这些交互在早期只是个幻灯片或者 Tab 切换下拉菜单等一些简单的交互,这些交互用 JQuery 实现彻底没什么问题。但现代的前端咱们的目标是用 Web 去 PK 原生应用,去和 Native 进行 PK 。
emmmmmmmmm,聊偏了,下面咱们接着聊 Selenium 。
现在,大多数 Web 应用程序都在使用 AJAX 技术。当浏览器加载页面时,该页面中的元素可能会以不一样的时间间隔加载。这使定位元素变得困难:若是 DOM 中尚不存在元素,则定位函数将引起 ElementNotVisibleException 异常。使用等待,咱们能够解决此问题。等待在执行的动做之间提供了必定的松弛时间-主要是定位元素或对该元素进行的任何其余操做。
Selenium Webdriver 提供两种类型的等待-隐式和显式。显式等待使 WebDriver 等待特定条件发生,而后再继续执行。隐式等待使 WebDriver 在尝试查找元素时轮询DOM必定时间。
咱们可使用 time.sleep()
来设定等待时间,彻底没有问题,可是它须要将条件设置为要等待的确切时间段。若是咱们不知道准确的渲染时间,咱们就没法设定一个比较合适的值。
Selenium 为咱们提供了 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 driver = webdriver.Chrome() driver.get("https://www.jd.com/") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "key")) ) finally: driver.quit()
结果以下:
<selenium.webdriver.remote.webelement.WebElement (session="b1baacca997d18d7d54447127c844d15", element="a472369e-3196-4456-b43e-4e1b280bf5b9")>
上面咱们使用了 WebDriverWait 来设置最长等待时间,这里咱们选择获取 JD 首页的输入框,咱们限定的等待时间为 10s ,若是它在 10s 内都没法返回结果,将会抛出 TimeoutException 。默认状况下, WebDriverWait 每 500 毫秒调用 ExpectedCondition ,直到成功返回。
隐式等待告诉 WebDriver 在尝试查找不当即可用的一个或多个元素时在必定时间内轮询 DOM 。默认设置为 0 。设置后,将在 WebDriver 对象的生存期内设置隐式等待。
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # seconds driver.get("https://www.jd.com/") key = driver.find_element_by_id("key") print(key)
Selenium 为咱们提供了一些节点的交互动做,如输入文字时能够用 send_keys()
方法,清空文字时能够用 clear()
方法,点击按钮时能够用 click()
方法。
from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get('https://www.taobao.com/') input = driver.find_element_by_id('q') input.send_keys('IPad') time.sleep(1) input.clear() input.send_keys('Surface Pro') button = driver.find_element_by_class_name('btn-search') button.click()
在上面这个示例中,咱们先打开淘宝网,而且开启了隐式等待,先在搜索框中输入了 IPad ,在等待 1s 后删除,再输入了 Surface Pro ,而后点击了搜索按钮,先在淘宝搜索须要用户登陆才能搜索,因此咱们直接跳转到了登陆页。
对于某些 Selenium API 没有提供的操做,咱们能够经过模拟运行 JavaScript 的方式来完成,用到的方法是 execute_script()
,好比咱们在淘宝首页将滚动条滑到底部:
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.taobao.com/') driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
前面咱们介绍了如何拿到 DOM 节点,那么最重要的是咱们要从 DOM 节点上来获取咱们须要的信息。
由于咱们获取的是 WebElement 类型,而 WebElement 也提供了相关的方法来提取节点信息。
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 实例化一个启动参数对象 chrome_options = Options() # 设置浏览器窗口大小 chrome_options.add_argument('--window-size=1366, 768') # 启动浏览器 driver = webdriver.Chrome(chrome_options=chrome_options) url = 'https://www.geekdigging.com/' driver.get(url) title = driver.find_element_by_xpath('//*[@id="text-4"]/div/div/div[1]/div[2]/a') print(title) # 获取属性信息 print(title.get_attribute('href')) # 获取文本信息 print(title.text) # 获取位置 print(title.location) # 获取大小 print(title.size)
上面由于 Chrome 默认打开大小有点小,打开小编博客的时候小编选择的这个 DOM 节点正好看到,因此小编设置了一下 Chrome 浏览器打开时的大小。
具体信息的提取小编列出了一部分,都加好注释了,还有一部分比较有意思的属性小编列在下面,供你们参考:
最后这两个获取元素屏幕快照,在获取验证码的时候将验证码截取出来会很好用的。
咱们使用浏览器最上面的地方有一个前进和后退按钮,Selenium 完成这两个动做使用了 back()
和 forward()
这两个方法。
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.jd.com/') browser.get('https://www.taobao.com/') browser.get('https://www.geekdigging.com/') browser.back() time.sleep(1) browser.forward()
这个各位同窗应该都看的懂,小编就很少啰嗦了。
又到了一个重点内容, Cookies ,它是和服务端保持会话的一个重要元素。 Selenium 为咱们提供了一些方法,让咱们能够方便的对 Cookies 进行增删改查等操做。示例以下:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.geekdigging.com/') # 获取 cookies print(browser.get_cookies()) # 添加一个 cookie browser.add_cookie({'name': 'name', 'domain': 'www.geekdigging.com', 'value': 'geekdigging'}) print(browser.get_cookies()) # 删除全部 cookie browser.delete_all_cookies() print(browser.get_cookies())
Selenium 的简单介绍就到这里了,但愿各位同窗看完后能本身动手试一试,毕竟并不难。
本系列的全部代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便你们取用。
https://blog.csdn.net/caoxuecheng001/article/details/81290643
https://www.jianshu.com/p/02af89375b54
https://cuiqingcai.com/5630.html
原文出处:https://www.cnblogs.com/babycomeon/p/12105449.html