大家好,我是小菜。
一个心愿可能成为 吹着牛 X 谈架构 的男人!如果你也想成为我想成为的人,不然点个关注做个伴,让小菜不再孤独!
本文次要介绍
Selenium
如有须要,能够参考
如有帮忙,不忘 点赞 ❥
微信公众号已开启,小菜良记,没关注的同学们记得关注哦!
哈喽,大家好。这里是 小菜良记
的前身 菜农曰
。不要因为名字改了,头像换了,大家就迷路了哦~
最近为了扩大语言面,这周大略理解了一下 Python 的玩法,学完之后发现,哎嘛,真香。不晓得大家刚学一门语言的时候有没有感觉这语言有点意思,什么都想试一试。
说到 Python 大家的反馈可能就是 爬虫 、 自动化测试 ,比拟少会说到用 python 来做 web 开发,相对来说,在国内 web 开发应用比拟多的语言还是 java~ 然而并不是说 python 不适宜用于做 web 开发,据我理解到罕用的 web 框架有Django
和flask
等~
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 种,如下:
- 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("菜农曰")
- 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("菜农曰")
- 类名定位
driver.find_element_by_class_name("className")
与 id 和 name 定位形式统一,须要找到对应的 className 而后进行定位~
- 标签名定位
driver.find_element_by_tag_name("tagName")
这种形式咱们在日常中应用还是比拟少的,因为在 HTML 是通过 tag 来定义性能的,比方 input 是输出,table 是表格 … 每个元素其实都是一个 tag,一个 tag 往往用来定义一类性能,在一个页面中可能存在多个 div,input,table 等,因而应用 tag 很难精准定位元素~
- css 选择器
driver.find_element_by_css_selector("cssVale")
这种形式须要连贯 css 的五大选择器
五大选择器
- 元素选择器
最常见的 css 选择器便是元素选择器,在 HTML 文档中该选择器通常是指某种 HTML 元素,例如:
html {background-color: black;} p {font-size: 30px; backgroud-color: gray;} h2 {background-color: red;}
- 类选择器
.
加上类名就组成了一个类选择器,例如:.deadline {color: red;} span.deadline {font-style: italic;}
- id 选择器
ID 选择器和类选择器有些相似,然而差异又非常显著。首先一个元素不能像类属性一样领有多个类,一个元素只能领有一个惟一的 ID 属性。应用 ID 选择器的办法为井号
#
加上 id 值,例如:#top {...}
- 属性选择器
咱们能够依据元素的属性及属性值来抉择元素,例如:
a[href][title] {...}
- 派生选择器
它又名上下文选择器,它是应用文档 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("菜农曰")
- 链接文本定位
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()
- 局部链接文本
driver.find_element_by_partial_link_text("partialLinkText")
这种形式是对 link_text
的辅助,有时候可能一个超链接文本特地长,如果咱们全副输出既麻烦又不美观
那其实咱们只须要截取一部分字符串让 selenium 了解咱们要选取的内容即可,那么就是应用 partial_link_text 这种形式~
- 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 webdriver
item_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 规范库中曾经提供了:urllib
、urllib2
、httplib
等模块以供 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 codecs
import os
from bs4 import BeautifulSoup
import sys
import json
import numpy as np
import importlib
importlib.reload(sys)
# 给申请指定一个申请头来模仿 chrome 浏览器
global headers
headers = {'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_path
save_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 做架构
的程序猿吧~ 点个关注做个伴,让小菜不再孤独。咱们下文见!
明天的你多致力一点,今天的你就能少说一句求人的话!
我是小菜,一个和你一起变强的男人。💋
微信公众号已开启,小菜良记,没关注的同学们记得关注哦!