大家好,我是小菜。
一个心愿可能成为 吹着牛X谈架构 的男人!如果你也想成为我想成为的人,不然点个关注做个伴,让小菜不再孤独!

本文次要介绍 Selenium

如有须要,能够参考

如有帮忙,不忘 点赞

微信公众号已开启,小菜良记,没关注的同学们记得关注哦!

哈喽,大家好。这里是小菜良记的前身菜农曰。不要因为名字改了,头像换了,大家就迷路了哦~

最近为了扩大语言面,这周大略理解了一下 Python 的玩法,学完之后发现,哎嘛,真香。不晓得大家刚学一门语言的时候有没有感觉这语言有点意思,什么都想试一试。

说到 Python 大家的反馈可能就是 爬虫自动化测试,比拟少会说到用 python 来做 web 开发,相对来说,在国内 web 开发应用比拟多的语言还是 java~ 然而并不是说 python 不适宜用于做 web 开发,据我理解到罕用的 web框架有Djangoflask 等~

Django 是一个很重的框架,它提供了很多很不便的工具,对很多货色也进行封装,不须要本人过多的造轮子

Flask 的长处是玲珑,但毛病也是玲珑,灵便的同时意味着本人须要造更多的轮子,或者花更多的工夫配置

然而咱们这篇的重点不是介绍 python 的 web 开发,也不是介绍 python 的根底入门,而是聊聊 python 的自动化测试和爬虫入门~

在我看来,如果你有其余语言的开发教训,小菜还是比拟倡议间接从一个案例动手,一边看一边学,语法之类其实都是雷同的(前面会出联合 java 去学 python 的内容),代码根本能读个八九不离十,然而如果没有任何语言开发教训的同学,那小菜还是倡议从头零碎的学习,视频和书籍都是不错的抉择,这里举荐 廖雪峰老师 的博客,内容相当不错 Python教程

一、自动化测试

python 无能的事件很多,无能乏味的事件也很多

学习一门语言,当然得找趣味点能力学得更快,比如说你想要爬某某网站的图片或视频,是吧~

什么是自动化测试?那就是 自动化 + 测试,只有你编写好了一段脚本(.py 文件),运行后会主动帮你在后盾进行测试的流程运行,那么应用自动化测试,有一个很好的工具能够帮忙你实现,那就是 Selenium

Selenium 是一款 web 自动化测试工具,能够很不便地模仿实在用户对浏览器的操作,它反对各种支流浏览器,比方IE、Chrome、Firefox、Safari、Opera 等,这里应用 python 进行演示阐明,并不是说 Selenium 只反对 python,它有多重编程语言的客户端驱动,语法简介~ 上面咱们做一个简略的示例演示!

1)前置筹备

为了保障演示的顺利,咱们须要做一些前置筹备,不然可能会造成浏览器无奈失常关上的状况~

步骤1

查看浏览器版本,咱们以下是应用 Edge,咱们可在网址输入框输出 edge://version 查看浏览器版本,而后到对应的驱动商店进行对应版本驱动的装置 Microsoft Edge - Webdriver (windows.net)

步骤2

而后咱们将下载好的驱动文件解压到你 python 的装置目录下的 Scripts文件夹下

2)浏览器操作

做好前置筹备,咱们来看上面一段简略代码:

加上导包总共也才 4 行代码,并在终端输出 python autoTest.py,并失去了以下演示成果:

能够看到利用该脚本曾经实现了主动关上浏览器主动放大窗口主动关上百度网页,三个自动化操作,将咱们的学习向前拉近了一步,是不是感觉有点意思~ 上面让你逐步沉沦!

这里介绍几个针对浏览器操作的罕用办法:

办法阐明
webdriver.xxx()用于创立浏览器对象
maximize_window()窗口最大化
get_window_size()获取浏览器尺寸
set_window_size()设置浏览器尺寸
get_window_position()获取浏览器地位
set_window_position(x, y)设置浏览器地位
close()敞开以后标签/窗口
quit()敞开所有标签/窗口

这几个当然是 Selenium 的根本惯例操作,更杰出的还在前面~

当咱们关上了浏览器,想做的当然不只是关上网页这种简略的操作,毕竟程序员的野心是有限的!咱们还想主动操作页面元素,那么这就须要说到 Selenium 的定位操作了

3)定位元素

页面的元素定位对于前端来说并不生疏,用 JS 能够很轻松的实现元素定位,比方以下几种:

  • 通过 id 进行定位

document.getElementById("id")

  • 通过 name 进行定位

document.getElementByName("name")

  • 通过标签名进行定位

document.getElementByTagName("tagName")

  • 通过 class 类进行定位

document.getElementByClassName("className")

  • 通过 css 选择器进行定位

document.querySeletorAll("css selector")

以上几种形式都能实现元素的选取定位,当然咱们这节的配角是 Selenium,作为主推的自动化测试工具,怎么能逞强呢~ 它实现页面元素定位的形式有 8 种,如下:

  1. id定位

driver.find_element_by_id("id")

咱们关上百度页面,能够发现该输入框的 id 是 kw,

在分明了元素 ID 之后,咱们就能够应用 id 进行元素定位,形式如下

from selenium import webdriver# 加载 Edge 驱动driver = webdriver.ChromiumEdge()# 设置最大窗口化driver.maximize_window()# 关上百度网页driver.get("http://baidu.com")# 通过 id 定位元素i = driver.find_element_by_id("kw")# 往输入框输出值i.send_keys("菜农曰")

  1. name属性值定位

driver.find_element_by_name("name")

name 定位的形式与 id 类似,都是须要通过查找name的值,而后调用对应的 api,应用形式如下:

from selenium import webdriver# 加载 Edge 驱动driver = webdriver.ChromiumEdge()# 设置最大窗口化driver.maximize_window()# 关上百度网页driver.get("http://baidu.com")# 通过 id 定位元素i = driver.find_element_by_name("wd")# 往输入框输出值i.send_keys("菜农曰")
  1. 类名定位

driver.find_element_by_class_name("className")

与 id 和 name 定位形式统一,须要找到对应的 className 而后进行定位~

  1. 标签名定位

driver.find_element_by_tag_name("tagName")

这种形式咱们在日常中应用还是比拟少的,因为在 HTML 是通过 tag 来定义性能的,比方 input 是输出,table 是表格... 每个元素其实都是一个 tag,一个 tag 往往用来定义一类性能,在一个页面中可能存在多个 div,input,table 等,因而应用 tag 很难精准定位元素~

  1. css选择器

driver.find_element_by_css_selector("cssVale")

这种形式须要连贯 css 的五大选择器

五大选择器

  1. 元素选择器

最常见的css选择器便是元素选择器,在HTML文档中该选择器通常是指某种HTML元素,例如:

html {background-color: black;}p {font-size: 30px; backgroud-color: gray;}h2 {background-color: red;}
  1. 类选择器

.加上类名就组成了一个类选择器,例如:

.deadline { color: red;}span.deadline { font-style: italic;}
  1. id 选择器

ID选择器和类选择器有些相似,然而差异又非常显著。首先一个元素不能像类属性一样领有多个类,一个元素只能领有一个惟一的ID属性。应用ID选择器的办法为井号#加上id值,例如:

#top { ...}
  1. 属性选择器

咱们能够依据元素的属性及属性值来抉择元素,例如:

a[href][title] { ...}
  1. 派生选择器

它又名上下文选择器,它是应用文档DOM构造来进行css抉择的。例如:

body li { ...}h1 span { ...}

当然这边选择器只是做一个简略的介绍,更多内容自行文档查阅~

在理解选择器之后咱们就能够欢快的进行 css 选择器 定位了:

from selenium import webdriver# 加载 Edge 驱动driver = webdriver.ChromiumEdge()# 设置最大窗口化driver.maximize_window()# 关上百度网页driver.get("http://baidu.com")# 通过 id选择器 定位元素i = driver.find_elements_by_css_selector("#kw")# 往输入框输出值i.send_keys("菜农曰")
  1. 链接文本定位

driver.find_element_by_link_text("linkText")

这种形式是专门用来定位文本链接的,比方咱们能够看到百度的首页上有个 新闻hao123地图... 等链接元素

那么咱们就能够利用链接文原本进行定位

from selenium import webdriver# 加载 Edge 驱动driver = webdriver.ChromiumEdge()# 设置最大窗口化driver.maximize_window()# 关上百度网页driver.get("http://baidu.com")# 通过 链接文本 定位元素并 点击driver.find_element_by_link_text("hao123").click()

  1. 局部链接文本

driver.find_element_by_partial_link_text("partialLinkText")

这种形式是对 link_text 的辅助,有时候可能一个超链接文本特地长,如果咱们全副输出既麻烦又不美观

那其实咱们只须要截取一部分字符串让 selenium 了解咱们要选取的内容即可,那么就是应用 partial_link_text 这种形式~

  1. xpath 门路表达式

driver.find_element_by_xpath("xpathName")

后面介绍的几种定位办法都是在现实状态下,每个元素都有一个惟一的id或name或class或超链接文本的属性,那么咱们就能够通过这个惟一的属性值来定位他们。然而有时候咱们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都雷同,又或者刷新页面,这些属性值都会变动。那么这个时候咱们就只能通过xpath或者CSS来定位了。当然 xpath 的值并不需要你去计算咱们只须要关上页面而后在 F12 中找到对应元素,右击复制 xpath 即可

而后在代码中进行定位:

from selenium import webdriver# 加载 Edge 驱动driver = webdriver.ChromiumEdge()# 设置最大窗口化driver.maximize_window()# 关上百度网页driver.get("http://www.baidu.com")driver.find_element_by_xpath("//*[@id='kw']").send_keys("菜农曰")

4)元素操作

咱们想做的当然不只是元素的选取,而是选取元素后的操作,咱们在下面演示中其实就曾经进行了两种操作 click()send_keys("value"),这里持续介绍几种其余操作~

办法名阐明
click()点击元素
send_keys("value")模仿按键输出
clear()革除元素的内容,比方 输入框
submit()提交表单
text获取元素的文本内容
is_displayed判断元素是否可见

看完是不是有一种似曾类似的感觉,这不就是 js 的基本操作吗~!

5)实操练习

学完以上操作,咱们就能够模仿一个小米商城的购物操作,代码如下:

from selenium import webdriveritem_url = "https://www.mi.com/buy/detail?product_id=10000330"# 加载 Edge 驱动driver = webdriver.ChromiumEdge()# 设置最大窗口化driver.maximize_window()# 关上商品购物页driver.get(item_url)# 隐式期待 设置 防止网络阻塞页面未及时加载driver.implicitly_wait(30)# 抉择地址driver.find_element_by_xpath("//*[@id='app']/div[3]/div/div/div/div[2]/div[2]/div[3]/div/div/div[1]/a").click()driver.implicitly_wait(10)# 点击手动抉择地址driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div["                             "1]/div/div/div[2]/span[1]").click()# 抉择福建driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div/div/div/div["                             "1]/div[2]/span[13]").click()driver.implicitly_wait(10)# 抉择市driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div/div/div/div["                             "1]/div[2]/span[1]").click()driver.implicitly_wait(10)# 抉择区driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div/div/div/div["                             "1]/div[2]/span[1]").click()driver.implicitly_wait(10)# 抉择街道driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div/div/div/div["                             "1]/div[2]/span[1]").click()driver.implicitly_wait(20)# 点击退出购物车driver.find_element_by_class_name("sale-btn").click()driver.implicitly_wait(20)# 点击去购物车结算driver.find_element_by_xpath("//*[@id='app']/div[2]/div/div[1]/div[2]/a[2]").click()driver.implicitly_wait(20)# 点击去结算driver.find_element_by_xpath("//*[@id='app']/div[2]/div/div/div/div[1]/div[4]/span/a").click()driver.implicitly_wait(20)# 点击批准协定driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div[3]/button[1]").click()

成果如下:

这便是咱们学习成绩的实际,当然如果遇到秒杀状况无妨也能够写个脚本练练手~ ,如果无货的状况咱们能够加个 while 循环去轮询拜访!

二、爬虫测试

下面咱们实现了如何应用 Selenium 来实现自动化测试,应用须非法~ 接下来咱们来展现 python 另一个弱小的性能,那就是用于 爬虫

在学习爬虫之前,咱们须要理解几个必要的工具

1)页面下载器

python 规范库中曾经提供了 :urlliburllib2httplib 等模块以供 http 申请,然而 api 不够好用优雅~,它须要巨量的工作,以及各种办法的笼罩,来实现最简略的工作,当然这是程序员所不能忍耐的,各方俊杰开发除了各种好用的第三方库以供应用~

  • request

request 是应用 apaches2 许可证的基于 python 开发的http库,它在 python 内置模块的根底上进行了高度的封装,从而使使用者在进行网络申请时能够更加不便的实现浏览器可有的所有操作~

  • scrapy

request 和 scrapy 的区别可能就在于,scrapy 是一个比拟重量级的框架,它属于网站级爬虫,而 request 是页面级爬虫,并发数和性能没有 scrapy 那么好

2)页面解析器

  • BeautifulSoup

BeautifulSoup是一个模块,该模块用于接管一个HTML或XML字符串,而后将其进行格式化,之后遍能够应用他提供的办法进行疾速查找指定元素,从而使得在HTML或XML中查找指定元素变得简略。

  • scrapy.Selector

Selector 是基于parsel,一种比拟高级的封装,通过特定的 XPath 或者 CSS 表达式来抉择HTML文件中的某个局部。它构建于 lxml 库之上,这意味着它们在速度和解析准确性上十分类似。

具体应用能够查阅Scrapy 文档,介绍的相当具体

3)数据存储

当咱们爬下来内容后,这个时候就须要有一个对应的存储源进行存储

具体数据库操作会在后续的 web 开发博文中进行介绍~
  • txt 文本

应用文件 file 的罕用操作

  • sqlite3

SQLite,是一款轻型的数据库,是恪守ACID的关系型数据库管理系统,它蕴含在一个绝对小的C库中

  • mysql

不做过多介绍,懂的都懂,web 开发老情人了

4)实操练习

网络爬虫,其实叫作网络数据采集更容易了解。它就是通过编程向网络服务器申请数据(HTML表单),而后解析HTML,提取出本人想要的数据。

咱们能够简略分为 4 个步骤:

  • 依据给定 url 获取 html 数据
  • 解析 html,获取指标数据
  • 存储数据

当然这所有须要建设在你懂 python 的简略语法和 html 的基本操作~

咱们接下来应用 request + BeautifulSoup + text 的组合进行操作练习,假设咱们想要爬取廖雪峰老师的python教程内容~

# 导入requests库import requests# 导入文件操作库import codecsimport osfrom bs4 import BeautifulSoupimport sysimport jsonimport numpy as npimport importlibimportlib.reload(sys)# 给申请指定一个申请头来模仿chrome浏览器global headersheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}server = 'https://www.liaoxuefeng.com/'# 廖雪峰python教程地址book = 'https://www.liaoxuefeng.com/wiki/1016959663602400'# 定义存储地位global save_pathsave_path = 'D:/books/python'if os.path.exists(save_path) is False:    os.makedirs(save_path)# 获取章节内容def get_contents(chapter):    req = requests.get(url=chapter, headers=headers)    html = req.content    html_doc = str(html, 'utf8')    bf = BeautifulSoup(html_doc, 'html.parser')    texts = bf.find_all(class_="x-wiki-content")    # 获取div标签id属性content的内容 \xa0 是不间断空白符      content = texts[0].text.replace('\xa0' * 4, '\n')    return content# 写入文件def write_txt(chapter, content, code):    with codecs.open(chapter, 'a', encoding=code)as f:        f.write(content)# 主办法def main():    res = requests.get(book, headers=headers)    html = res.content    html_doc = str(html, 'utf8')    # HTML解析    soup = BeautifulSoup(html_doc, 'html.parser')    # 获取所有的章节    a = soup.find('div', id='1016959663602400').find_all('a')    print('总篇数: %d ' % len(a))    for each in a:        try:            chapter = server + each.get('href')            content = get_contents(chapter)            chapter = save_path + "/" + each.string.replace("?", "") + ".txt"            write_txt(chapter, content, 'utf8')        except Exception as e:            print(e)if __name__ == '__main__':    main()

当咱们运行程序后便能够在 D:/books/python 地位看到咱们所爬取到的教程内容!

这样子咱们就曾经简略的实现了爬虫,不过爬虫需谨慎~!

咱们这篇以两个维度 自动化测试爬虫 意识了 python的应用,心愿可能激发出你的趣味点~

不要空谈,不要贪懒,和小菜一起做个吹着牛X做架构的程序猿吧~点个关注做个伴,让小菜不再孤独。咱们下文见!

明天的你多致力一点,今天的你就能少说一句求人的话!
我是小菜,一个和你一起变强的男人。
微信公众号已开启,小菜良记,没关注的同学们记得关注哦!