最新公告
  • 欢迎光临icbug创客,本站所有的文章全部开放!部分资源需付费!立即加入我们会员
  • 【爬虫基础】浏览器测试框架:Selenium

    浏览器测试框架:Selenium

    • 1、什么是Selenium?

      • 1)概念

        • Selenium 是一套完整的web应用程序测试系统
        • Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上
        • Selenium测试直接运行在浏览器中,就像真正的用户在操作一样 正则表达式 - 幕布正则表达式

          • 1、正则表达式快速上手
            • 1)什么是正则表达式?
              • 概念
                • 正则表达式,又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)
                • 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑
                • 正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串
              • python正则表达式工具包:re
              • 爬虫中正则表达式的作用是什么?
                • “模糊匹配”
                • requests+BeautifulSoup爬虫逻辑中,在标签识别基础上,匹配里面的信息 → 处理文本内容、提取字段
                • 数据采集后,在pandas中对字段进行处理
              • 示例
            • 2)字符匹配
              • re.match(pattern, string, flags=0) → 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
                • pattern:匹配的正则表达式
                • string:要匹配的字符串。
                • flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
              • 返回结果
                • 匹配成功re.match方法返回一个匹配的对象,否则返回None。
                • 可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式
                  • group()/group(0) → 返回成功匹配的内容
                  • group(num) → 返回成功匹配的内容中第num个小组的字符
                  • groups() → 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号
                  • 示例
                • 通过span()方法用于以元祖形式返回匹配的起始位置和结束位置
                  • span() 返回一个元组包含匹配 (开始,结束) 的位置
                  • start() 返回匹配开始的位置
                  • end() 返回匹配结束的位置
                  • 示例
            • 3)修饰符 - 可选标志
              • 概念
                • 正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志
                • 多个标志可以通过按位 OR(|) 它们来指定
              • 修饰符
                • re.I 使匹配对大小写不敏感
                • re.L 做本地化识别(locale-aware)匹配
                • re.M 多行匹配,影响 ^ 和 $
                • re.S 使 . 匹配包括换行在内的所有字符
                • re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
                • re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
          • 2、正则表达式模式
            • 1)概念与注意点
              • 模式字符串使用特殊的语法来表示一个正则表达式
              • r\'...\' 用在pattern之前,表示单引号中的字符串为原生字符,不会进行任何转义
                • 由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r\'\t\',等价于 \\t )匹配相应的特殊字符
            • 2)常用模式
              • ① 用于匹配位置
                • ^ 匹配字符串的开头
                • $ 匹配字符串的末尾
                • 示例
              • ② 用于匹配内容
                • . 匹配除 \n 之外的任何单个字符,要匹配包括 \'\n\' 在内的任何字符,请使用象 \'[\s\S]\' 的模式
                • [...] 用来表示一组字符,单独列出:[amk] 匹配 \'a\',\'m\'或\'k\'
                • [^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符
                • \d 匹配一个数字字符。等价于 [0-9]
                • \D 匹配一个非数字字符。等价于 [^0-9]
                • \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
                • \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
                • \w 匹配包括下划线的任何单词字符。等价于\'[A-Za-z0-9_]\'
                • \W 匹配任何非单词字符。等价于 \'[^A-Za-z0-9_]\'
                • 示例
                  • [Pp]ython 匹配 Python 或 python
                  • rub[ye] 匹配 ruby 或 rube
                  • [aeiou] 匹配中括号内的任意一个字母
                  • [0-9] 匹配任何数字。类似于 [0123456789]
                  • [a-z] 匹配任何小写字母
                  • [A-Z] 匹配任何大写字母
                  • [a-zA-Z0-9] 匹配任何字母及数字
                  • [^aeiou] 除了aeiou字母以外的所有字符
                  • [^0-9] 匹配除了数字外的字符
              • ③ 用于匹配次数
                • re* 匹配0个或多个的表达式。
                • re+ 匹配1个或多个的表达式。
                • re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
                • re{ n} 匹配n个前面表达式
                • re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
                • 示例
              • ④ 用于分组
                • (re) 匹配括号内的表达式,也表示一个组
                • 示例
              • ⑤ 贪婪匹配问题
                • 贪婪匹配:尝试匹配尽可能多的字符,默认匹配都是贪婪匹配
                • 非贪婪匹配:尝试匹配尽可能少的字符,用?
                • 示例
              • ⑥ 或
                • a| b 匹配a或b
            • 3)附录:所有模式
          • 3、字符搜索
            • 1)re.search(pattern, string, flags=0) → 扫描整个字符串并返回第一个成功的匹配
              • 参数
                • pattern:匹配的正则表达式
                • string:要匹配的字符串。
                • flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
              • 返回结果 - 和re.match()一致
                • 匹配成功re.match方法返回一个匹配的对象,否则返回None。
                • 可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式
                • 通过span()方法用于以元祖形式返回匹配的起始位置和结束位置
              • re.match与re.search的区别
                • re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配
              • 示例
            • 2)findall(pattern, string, flags=0) → 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
              • 参数
                • pattern:匹配的正则表达式
                • string:要匹配的字符串。
                • flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
              • 示例
          • 4、字符替换与分割
            • 1)替换
              • re.sub(pattern, repl, string, count=0, flags=0) → 替换字符串中的匹配项
                • pattern : 正则中的模式字符串。
                • repl : 替换的字符串,也可为一个函数。
                • string : 要被查找替换的原始字符串。
                • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
                • flags : 编译时用的匹配模式,数字形式
              • 示例
                • 相比于replace(),可以模糊匹配字符然后替换
            • 2)分割
              • re.split(pattern, string[, maxsplit=0, flags=0]) → 按照能够匹配的子串将字符串分割后返回列表
                • pattern 匹配的正则表达式
                • string 要匹配的字符串。
                • maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
                • flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
              • 示例
              • 延伸讲一下,关于提取特殊信息
          • 5、爬虫中正则的用处

            • 1)爬虫中的正则练习_1

              • 回顾【爬虫练习项目(一)】中的第一个案例,对于“作者”等字段的提取难度
              • 数据采集阶段如何解决?

                • ① 作者/译者等如何提取
                • ② 定价字段怎么提取数字?
                • ③ 字符串基本操作,和正则处理如何搭配?
                • 示例

                  •                                     ![](https://mubu.com/document_image/5920225a-4b55-4b07-b0a2-f29c8c6d68df-2412512.jpg)
            • 2)爬虫中的正则练习_2
              • 回顾【爬虫练习项目(一)】中的第二个案例,对于“其他信息”中的字段匹配
              • 采集思路
                • 用正则匹配关键信息
                • 示例

          /span>

          • 支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等
        • 优势
          • Selenium 测试直接在浏览器中运行,就像真实用户所做的一样
          • 支持多种浏览器:Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Chrome和 Firefox 中运行。其他测试工具都不能覆盖如此多的平台
          • 可以较好地应对反爬措施
        • 劣势
          • 简单粗暴,但效率不高
      • 2)如何安装

        • ① 安装python内置的selenium
          • pip3 install selenium
          • pip show selenium
        • ② 安装浏览器驱动

          • 打开谷歌浏览器,查看自己的版本,设置页面网址:chrome://settings/help
          • chrome:http://chromedriver.storage.googleapis.com/index.html

            •       ![](https://mubu.com/document_image/7596ba2c-7033-4d3f-b8b9-7b686f55adf3-2412512.jpg)
          • 下载后解压,放入自己的路径
            • 例如:C:\Program Files (x86)\Google\Chrome\Application
          • 添加环境变量
            • 打开开始菜单->我的电脑(或计算机)->系统属性->高级系统设置->环境变量
            • 变量里的path,在最后面添加;C:\Program Files (x86)\Google\Chrome\Application或者在最前面添加C:\Program Files (x86)\Google\Chrome\Application,总之变量之间用分号隔开,修改完之后点击确定按钮保存配置
      • 3)配置检查
        • 在spyder中运行 - 注意如果刚配置好,重启spyder
        • 如果未安装驱动,会出现报错
    • 2、如何用Selenium快速访问网页

      • 1)导航:.get()

        • 返回结果为WebDriver对象,网页测试窗口也进入对应网址
        • .current_url → 返回网页网址
        • .get_cookies() → 返回网页cookies
        • 示例

          • ![](https://mubu.com/document_image/b0f1cf24-2bf0-44c7-9e32-efc421f09a80-2412512.jpg)
      • 2)快速上手
    • 3、提取网页数据

      • 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
        • 定位一组元素,返回1个list(类似bs里的find_all())
          • 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
      • 2)定位方法选择顺序

        • 顺序方法(以下方法也是核心方法)
          • 按xpath:find_element_by_xpath
          • 按属性定位:find_element_by_id 或者 find_element_by_class_name
          • 按照标签名定位:find_element_by_tag_name
        • 需要采集链接时(a标签的href、img标签的src)

          • 不建议用find_element_by_link_text(按照链接文本定位)
          • 直接通过核心方法先识别a标签,然后通过get_attribute(href)获得链接
          • 示例

            •       ![](https://mubu.com/document_image/c3cfcc3a-165a-439b-93a0-16c52f57e482-2412512.jpg)
      • 3)定位元素后有哪些操作?

        • size:返回元素尺寸
        • text :返回元素文本
        • get_attribute(name):获得属性值
        • find_....:继续识别

          • 这里用了find_elements_by_tag_name(\'span\')来寻找一组元素

            ![](https://mubu.com/document_image/cb5984e8-0a95-44c3-8928-8e5c57113aaf-2412512.jpg)
        • click():点击按钮

          • 点击进入下一个网页

            •       ![](https://mubu.com/document_image/a862b93d-2ba9-4ed4-a08e-b1f8f27f7d49-2412512.jpg)
              
                    ![](https://mubu.com/document_image/8d3c7367-c957-42b4-8ef2-6d1db7ca1131-2412512.jpg)
          • 进入下一个网页后,brower的页面会变化,可以用.current_url查看现有url
      • 4)定位单个元素

        • 案例网址:https://book.douban.com/subject/1043815/
        • ① 按照id属性定位:find_element_by_id

          • 返回匹配id属性名的第一个元素。如果没有元素具有匹配的类属性名,则会报错NoSuchElementException
            • 网页中大部分情况,id是唯一的
          • 示例

            • brower.find_element_by_id(\'info\').text

                    ![](https://mubu.com/document_image/7f42686f-f508-4916-9e61-b1d283795a09-2412512.jpg)
        • ② 按照class属性定位:find_element_by_class_name

          • 返回匹配class属性名的第一个元素。如果没有元素具有匹配的类属性名,则会报错NoSuchElementException
          • 示例

            •       ![](https://mubu.com/document_image/1b4ef159-0057-48ad-9621-f477cffe6e48-2412512.jpg)
        • ③ 通过tag name定位元素:find_element_by_tag_name

          • 返回带有给定tag name的第一个元素。如果没有元素具有匹配的标记名,则会报错NoSuchElementException
          • 示例

            •       ![](https://mubu.com/document_image/e75fc8ba-1b60-467e-9944-89865081f357-2412512.jpg)
        • ④ 按照xpath定位 - 核心

          • 当没有定位的元素拥有合适的id或name属性时,可以使用XPath
          • xpath在浏览器中右键获取
          • 示例

            •       ![](https://mubu.com/document_image/ad253bef-167e-4ff5-9795-a5250d137875-2412512.jpg)
      • 5)定位多个元素

    • 4、实现网页的账号登陆

      • 案例网页:https://book.douban.com/
      • 1)找到“登陆”的标签,并click
      • 2)网页交互:按照账号密码登陆

      • 3)分别识别两个input标签,并输入账号密码

    • 5、如何协调selenium与requests+bs的方法
    icbug创客严格遵守文章协议!请勿侵犯作者权益复制直接转载,如需转载请标明出处!
    icbug创客 » 【爬虫基础】浏览器测试框架:Selenium

    发表评论

    • 650会员总数(位)
    • 189资源总数(个)
    • 3本周发布(个)
    • 0 今日发布(个)
    • 224稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情