前言
在着手完成工程时,需要思考自己需要什么工具,比如这次这个项目,我们最终需要的信息是在http://rank.kongzhong.com/rankweb/wowstop.html?vid=4276041424
![](https://img.haomeiwen.com/i14361930/1437ab8f1219aba9.png)
![](https://img.haomeiwen.com/i14361930/a125c0b274f6959e.png)
再然后
![](https://img.haomeiwen.com/i14361930/585ec303db20b500.png)
最后我想要的信息才会显示出来
![](https://img.haomeiwen.com/i14361930/08f6b84303536a3d.png)
一个一个做,不但没有效率,而且容易出错,为此,写一个自动化爬虫是必不可少的,这个是用来干嘛的呢,主要是用来模拟浏览器点击,最后实现数据截取,因此跟大家介绍作为自动化测试的模块selenium。
第一部分 自动化工具selenium
pip安装selenium,import之,
driver =webdriver.Chrome() #自动化测试所选用浏览器
我选用Chrome内核,也就是谷歌浏览器,自动化测试工具需要下载Chromedriver到指定目录下,网址http://npm.taobao.org/mirrors/chromedriver/,需要注意的是,要与你现在浏览器版本匹配,其实这个问题只有老式的内核才会有,现在新版浏览器Chromedriver已经一一对应,对应版本信息可以在notes.txt中找到
![](https://img.haomeiwen.com/i14361930/f3bb268b4f0d16a0.png)
如果实在不清楚,可以参考下面这个关系表
ChromeDriver v2.43 (2018-10-16)----------Supports Chrome v69-71
ChromeDriver v2.42 (2018-09-13)----------Supports Chrome v68-70
ChromeDriver v2.41 (2018-07-27)----------Supports Chrome v67-69
ChromeDriver v2.40 (2018-06-07)----------Supports Chrome v66-68
ChromeDriver v2.39 (2018-05-30)----------Supports Chrome v66-68
ChromeDriver v2.38 (2018-04-17)----------Supports Chrome v65-67
ChromeDriver v2.37 (2018-03-16)----------Supports Chrome v64-66
ChromeDriver v2.36 (2018-03-02)----------Supports Chrome v63-65
ChromeDriver v2.35 (2018-01-10)----------Supports Chrome v62-64
至此selenium准备完毕
selenium常见函数用法
driver.maximize_window() #最大化窗口
driver.get('网址') #输入浏览器网址
driver.page_source #获取当前页面的源代码,相当于requests一样(就是因为这个东西才提醒我可以实现爬虫,非常重要!)
driver.window_handles #获取当前所有网页页面,返回的是一个列表,这个主要是用来选择页面间的切换,比如你进入一个新页面,想要回退到上一个页面,就要用到这个功能。
driver.current_window_handle #获取当前页面位置,同上搭配使用
driver.switch_to.window(handle) #跳转到指定窗口,同上搭配使用
接下来讲述selenium的定位按钮,这个东西主要是模拟鼠标点击、输入等操作,为此我们必须定位到需要的位置,具体位置和定位方式,你可以在需要的信息处,右键点击审查看到。
![](https://img.haomeiwen.com/i14361930/cc41fce2510228ca.png)
关于定位方式:展开讲述比较麻烦,因为定位方式和每个人的习惯都不大一样,你可以在网上搜到很多selenium的定位方法,下面列举了几种例子仅供参考。
id 定位
driver.findElement(By.id(“id的值”));
name定位
driver.findElement(By.name(“name的值”));
链接的全部文字定位
driver.findElement(By.linkText(“链接的全部文字”));
链接的部分文字定位
driver.findElement(By.partialLinkText(“链接的部分文字”));
css 方式定位
driver.findElement(By.cssSelector(“css表达式”));
xpath 方式定位
driver.findElement(By.xpath(“xpath表达式”));
Class 名称定位
driver.findElement(By.className(“class属性”));
TagName 标签名称定位
driver.findElement(By.tagName(“标签名称”));
Jquery方式
Js.executeScript(“return jQuery.find(“jquery表达式”)”)
但实际上我在工程中在这个位置并不能用普通的findElenment方法,因为这个位置是实现自动化爬取得关键——findElenments(注意后面有个s,新人往往会搞错这两个这个跟前者很像,但他返回的是一个列表)
接下来再模拟普通的点击就可以了。
以下是本人的selenium代码部分
#-*- coding:utf-8 -*-
from selenium import webdriver #webdriver就是加载你的浏览器驱动,比如我使用的是谷歌,就是Chrome
from selenium.webdriver.common.by import By #这几个东西都是固定的,是智能等待所需要用到的
from selenium.webdriver.support.ui import WebDriverWait #这几个东西都是固定的,是智能等待所需要用到的
from selenium.webdriver.support import expected_conditions as EC #这几个东西都是固定的,是智能等待所需要用到的
import time
import re
import os
driver =webdriver.Chrome() #启动自动化浏览器Chrome 并赋值
driver.maximize_window() #最大化窗口
driver.get('http://rank.kongzhong.com/rankweb/wowstop.html?vid=4276041424')#让浏览器登录到目标地址
try:
element = WebDriverWait(driver, 3,0.5).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
) #try finally是固定语法,为什么要加这个,是因为服务器响应是需要时间的,根据你的网速而定,因此你必须要等到服务器响应完毕,才能接下来做这一步,当然你直接time.sleep也可以,而这个就是智能等待,还有智能等待不是time,不用每步加一个!智能等待不是time,不用每步加一个!
finally:
player_ID = driver.page_source #此处保留当前页面信息,用于后面获得玩家ID名称
#target = "_blank" > 别扭了吃炮弹补脑啊 < / a > #给大家看看这个网页中的源码,就是接下来的定位和检索目标
compile = re.compile("\"_blank\">(.*?)<") #这是正则表达式,必须要和后面的定位方法对齐,所以筛选逻辑和后者非常像
player_text = re.findall(compile, str(player_ID)) #正则必须要匹配字符串,稍微变换一下数据类型
elements = driver.find_elements_by_css_selector("a[target='_blank']") #定位按钮选用css方法,find_elements,不知道的同学可以去网上查用法
for i in range(len(elements)): #循环elements,这是一个列表,也就是所有应该点击的玩家名单
elements[i].click() #依次进入每个玩家的名单
windows = driver.current_window_handle #这个前面说到过,是用来跳转窗口的,因为你点击之后,是生成一个新页面。如果你用定位按钮,机器只会傻乎乎的停留在最开始的页面
all_handles = driver.window_handles #获取当前所有窗口,返回的是一个地址
for handle in all_handles:
if handle != windows:
driver.switch_to.window(handle) #简单的逻辑意思是,如果当前窗口不是windows,则跳转到handle,直到是当前操作的窗口为止
driver.find_element_by_id("shiptablebtn").click() #模拟点击舰船成绩那一栏
time.sleep(2) #主要是让这个过程可视化,让我能监控到机器操作,实际上我觉得模拟人工操作这一点还是很重要的,毕竟速度太快不厚道···
driver.find_element_by_css_selector("tr[vid='4276041424']").click() #点开详细信息,得到目标战斗信息
time.sleep(3) #同上
page = driver.page_source #收集资料
with open("textdata",'a',encoding="utf-8") as local: #这是我用来保存的方法
compile2 = re.compile("<td>(2018-\d\d-\d\d)</td>.*?<td>(\d)</td>.*?class=\"int\"\stitle=.*?<td\sclass=\"int\spercent\">([\d][\d][\d]%).*?")
# < td class ="double1 percent" > 100.0 % < / td >
# < span id = "nick" > 别扭了吃炮弹补脑啊 < / span
datafindall = re.findall(compile2, page)
for item in datafindall:
local.write(str(item))
local.write("\n")
ospath = "F:/pycharm data/自动化测试/textdata" #重命名文件名称,这是旧文件目录,你们可以稍微修改一下
ospath_new = "F:/pycharm data/自动化测试/资料/%s" % player_text[i] # 4.这段代码是用来智能化命名文本名称的
os.rename(ospath, ospath_new)
driver.switch_to.window(all_handles[0]) #all_handles[0]实际上就是第一页
time.sleep(2)
print("执行完毕")
driver.quit() #退出
网友评论