python windows自动化 爬虫_python selenium 爬虫自动化工作脚本

本文介绍了如何使用Python的selenium库在Windows环境下编写自动化爬虫脚本,针对动态变化的网页进行数据抓取。脚本涉及错误处理、页面元素交互、Excel数据写入等功能,用于处理大量数据的分页查询和网页内容的动态解析。
摘要由CSDN通过智能技术生成

'''内部监控应用平台 自动化工作脚本

难点

1,由于数据量过于庞大,每次查询翻页可能出错需要检查并且重新点击

2,网页的解析,id class等属性是动态变化的。使用xpath和css结合使用

3,涉及到selenium的点击,悬停,输入,截图,三层try块的容错处理

4,涉及到excel的循环写入,一个文件写11张表格,配合selen'''

from time import sleep

import xlrd, xlwt,os, datetime

from lxml import etree

from xlutils.copy import copy as xl_copy #使用python在excel表格中增加新的sheet表

from selenium import webdriver# 导入网页的驱动类

from selenium.webdriver.common.by import By

from selenium.webdriver.common.keys import Keys #就可以模拟键盘操作了

from selenium.webdriver.support.ui import WebDriverWait #依旧失败,截图还是未更新完成的 去掉再测试

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.action_chains import ActionChains

from selenium.common.exceptions import NoSuchElementException,TimeoutException

def write_err_page(html,filepath):

'''把错误码详情页面写入到excel文件,新增表单'''

selector = etree.HTML(html)

infos = selector.xpath("//table[@id='dataGrid']//tr")

data = []

for info in infos: # infos[1:]

cuowumas = info.xpath('td[5]/text()') #出来10行的交易吗名字

suoshus = info.xpath('td[4]/text()') # '错误所属逻辑系统'

jiaoyiliangs = info.xpath('td[6]/text()')

yewulvs = info.xpath('td[7]/text()')

xitonglvs = info.xpath('td[8]/text()')

Time_xiangyings = info.xpath('td[9]/text()')

Time_chulis = info.xpath('td[10]/text()')

changliangs = info.xpath('td[11]/text()')

changlvs = info.xpath('td[15]/text()')

APDEXs = info.xpath('td[16]/text()')

# print(cuowumas,jiaoyiliangs,yewulvs,xitonglvs,Time_xiangyings,Time_chulis,changliangs,changlvs,APDEXs)

for cuowuma,suoshu,jiaoyiliang,yewulv,xitonglv,Time_xiangying,Time_chuli,changliang,changlv,APDEX in zip(cuowumas,suoshus,jiaoyiliangs,yewulvs,xitonglvs, Time_xiangyings,Time_chulis,changliangs,changlvs,APDEXs):

aa = {

'错误码':cuowuma,

'错误所属逻辑系统':suoshu,

'交易量':jiaoyiliang,

'业务成功率':yewulv,

'系统成功率':xitonglv,

'平均响应时间':Time_xiangying,

'平均处理时长':Time_chuli,

'长交易量':changliang,

'长交易率':changlv,

'APDEX':APDEX,

}

data.append(aa)

excelPath = os.path.join(filepath + os.sep + '0应用监控.xls')

book_rb = xlrd.open_workbook(excelPath) #打开监控存储文件

book = xl_copy(book_rb) #xlutils.copy 复制功能,使用python在excel表格中增加新sheet表

sheet_name = selector.xpath("//*[@id='tabs']/ul/li[3]/a/text()")#定位错误码对应名称

sheet_name = sheet_name[0][5:].replace('[','').replace(']','').replace('/','').replace('\\','')

#[5:] 是把‘错误码视图’ 5个字去除,.replace('[','')是因为[]不允许出现在表单命名中

print("表单名称:"+ sheet_name)

try:

sheet = book.add_sheet(sheet_name)

except:

sheet = book.add_sheet("sheet命名出错")

print("excel的sheet表名命名出错请检查--------------异常------")

headers = [k for k in data[0]]# print('>> 标题数据集headers:{0}'.format(headers))

contents = [[v for v in item.values()] for item in data]# print('>> contents:{0}'.format(contents)) # 内容数据集(嵌套list结构 [[1,2,3],[4,5,6],[6,7,8]])

for colIndex in range(len(headers)):# 使用循环将标题headers写入excel第1行(rowIndex = 0)

sheet.write(0, colIndex, headers[colIndex])

for rowIndex in range(1, len(contents)+1):# 步骤5-1:外层for循环控制行数

for colIndex in range(len(headers)):# 步骤5-2:内层for循环控制列数

# 步骤5-3:写入内容数据

sheet.write(rowIndex, colIndex, contents[rowIndex-1][colIndex])

book.save(excelPath)

print('写入错误码表单ok')

def write_main_page(html,filepath):

'''把交易码汇总页面 写入到excel,顺序不稳定版本,需修改成上面的模式'''

selector = etree.HTML(html) #etree.HTML(源码) 识别为可被xpath解析的对象

infos = selector.xpath('//table[@id="dataGrid"]//tr') #取大块内容,尾部啥都不需要,去掉tbody才可以。print(type(infos)) #运行结果

print(len(infos)) #运行结果 11

data = []

for info in infos[1:]: #infos[1:]# print(type(info)) #

#谢主管 经典 xpat测试成功 : "//*[@id='dataGrid']//*[@class='jqgfirstrow'][1]/../tr[2]/td[2]" 取代了动态id定位

jiaoyimas = info.xpath('td[2]/text()') #出来10行的交易吗名字

jiaoyiliangs = info.xpath('td[5]/text()')

yewulvs = info.xpath('td[6]/text()')

xitonglvs = info.xpath('td[7]/text()')

Time_xiangyings = info.xpath('td[8]/text()')

Time_chulis = info.xpath('td[9]/text()')

changliangs = info.xpath('td[10]/text()')

changlvs = info.xpath('td[14]/text()')

APDEXs = info.xpath('td[15]/text()')

# print(jiaoyima,jiaoyiliang,yewulv,xitonglv,Time_xiangying,Time_chuli,changliang,changlv,APDEX)

for jiaoyima,jiaoyiliang,yewulv,xitonglv,Time_xiangying,Time_chuli,changliang,changlv,APDEX in zip(jiaoyimas,jiaoyiliangs,yewulvs,xitonglvs, Time_xiangyings,Time_chulis,changliangs,changlvs,APDEXs):

aa = {

'交易码':jiaoyima,

'交易量':jiaoyiliang,

'业务成功率':yewulv,

'系统成功率':xitonglv,

'平均响应时间':Time_xiangying,

'平均处理时长':Time_chuli,

'长交易量':changliang,

'长交易率':changlv,

'APDEX':APDEX,

}

data.append(aa)

book = xlwt.Workbook(encoding='utf-8')

sheet = book.add_sheet('交易码汇总页100行内')

headers = [k for k in data[0]]

# print('>> 标题数据集headers:{0}'.format(headers))

contents = [[v for v in item.values()] for item in data]

# print('>> contents:{0}'.format(contents)) # 内容数据集(嵌套list结构 [[1,2,3],[4,5,6],[6,7,8]])

for colIndex in range(len(headers)):# 使用循环将标题headers写入excel第1行(rowIndex = 0)

sheet.write(0, colIndex, headers[colIndex])

for rowIndex in range(1, len(contents)+1):# 步骤5-1:外层for循环控制行数

for colIndex in range(len(headers)):# 步骤5-2:内层for循环控制列数

# 步骤5-3:写入内容数据

sheet.write(rowIndex, colIndex, contents[rowIndex-1][colIndex])

book.save(filepath + os.sep + '0应用监控.xls')

print('写入交易码汇总数据(100条内有效)ok')

def wending(locate):

'''稳定函数,如;果页面数据不出现再次点击一次 定位表格第二行第二个元素'''

'''locate: 类型为str,是指定位置的css解析代码,检查这里有没有出现'''

wait = WebDriverWait(driver,80)# locate="#dataGrid > tbody > tr:nth-child(3) > td:nth-child(2)"#定位表格类元素第二行第二个元素

sleep(2)

obj_chaxun = driver.find_element_by_xpath("//*[@id='btnSchName']/i")

try :

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locate)))

except TimeoutException:

obj_chaxun.click() ##查询按钮再次点击

print("页面不加载,超时报错,开始点击第2次---------页面不加载--------------------")

try :

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locate)))

except TimeoutException:

obj_chaxun.click() ##查询按钮再次点击

print("页面不加载,超时报错,执行查询点击第3次--------页面不加载---------------------")

try :

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locate)))

except TimeoutException:

obj_chaxun.click() ##查询按钮再次点击

print("页面不加载,超时报错,执行查询点击第4次--------页面不加载---------------------")

except NoSuchElementException:

obj_chaxun.click() ##查询按钮再次点击

print("NoSuchElementException,执行查询点击第一次---------页面不加载--------------------")

# finally:

# wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locator_form22)))

def get_main_page():

'''获取交易码首页数据,截图并存excel'''

# wait = WebDriverWait(driver,80)

elem_zhanghao = driver.find_element_by_xpath("//*[@id='Content']/div[3]/div[4]/input[1]")

elem_zhanghao.send_keys("xuchangshan.zh")

elem_password = driver.find_element_by_xpath("//*[@id='Content']/div[3]/div[4]/input[2]")

elem_password.send_keys("password5")

elem_denglu = driver.find_element_by_xpath("//*[@id='BtnLogin']")

elem_denglu.click()

sleep(2)

#登陆,点击交易监控

obj1 = driver.find_element_by_xpath("//*[@id='page_container_id']/div[1]/ul/li[2]/a")

obj1.click()

driver.maximize_window()

#下面,点击表格视图

obj2 = driver.find_element_by_xpath("//*[@id='li_tranView']/a")

obj2.click()

sleep(1)

# 遇到问题卡住,需要切换到 iframe id = "iframe-content-id"

driver.switch_to.frame('iframe-content-id')

obj3 = wait.until(EC.presence_of_element_located((By.ID,"appNameRef")))

sleep(2)

obj3.send_keys("P12N-EDTM")

# driver.find_element_by_xpath("//*[@id='btnSchName']/i").click() #系统确实不稳定 点击搜索出现空白,需要点击 实时刷新

obj31 = driver.find_element_by_css_selector("#refreshTimeTd > #refreshTime")

obj31.click()

obj4 = wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='1532']/td[2]")))

obj4.click()#obj4这里智能等待有效

#出现一级菜单 ,下面需要选中视图钻取 + 鼠标悬停

above = driver.find_element_by_css_selector("#menu > li:nth-child(1)")

ActionChains(driver).move_to_element(above).perform() #鼠标悬停

#出现二级菜单 选中交易码视图单击

obj5 = driver.find_element_by_xpath("//*[@id='ui-id-9']") #menu > li:nth-child(1)

obj5.click()

sleep(1)

#选中 更多操作右边的小三角 单击小三角

obj6 = driver.find_element_by_xpath("//*[@id='moreCorBtn']/div/div[3]/button[2]")

obj6.click()

#选中 历史汇总 单击

obj7 = driver.find_element_by_xpath("//*[@id='hisStatTd']/span")

obj7.click()

sleep(1)

#选中 起始日期输入框

obj8 = driver.find_element_by_xpath("//*[@id='hisStatFrom']")

obj8.clear() # obj8.send_keys(Keys.CONTROL,'x') 确定不可代替清空

obj8.send_keys(yesterday0000)

#选中 截止日期输入框

obj9 = driver.find_element_by_xpath("//*[@id='hisStatTo']")

obj9.clear()

obj9.send_keys(yesterday2359)

obj100 = driver.find_element(By.CSS_SELECTOR,"#tablePager_center > table > tbody > tr > td:nth-child(8) > select > option:nth-child(4)")

obj100.click() #控制选择100行

obj_chaxun = driver.find_element_by_xpath("//*[@id='btnSchName']/i") #定位查询按钮

obj_chaxun.click()#定位查询按钮

locate="#dataGrid > tbody > tr:nth-child(3) > td:nth-child(2)"#定位表格类元素第二行第二个元素

wending(locate)

sleep(80)#还没更新到100行的数据出现,已经进行截图,点击错误ma

driver.get_screenshot_as_file(filepath + os.sep + "00汇总页1-15.png") #存储第一页汇总

print("00汇总页1-15,截图成功")

html=driver.page_source

write_main_page(html,filepath) #主页写入到excel

def get_err_page():

'''获取错误视图码数据,并存储excel'''

for i in range(1,100):

if i>10:

obj100 = driver.find_element(By.CSS_SELECTOR,"#tablePager_center > table > tbody > tr > td:nth-child(8) > select > option:nth-child(4)")

obj100.click()#点击选择显示100行

locate="#dataGrid > tbody > tr:nth-child(3) > td:nth-child(2)"#定位表格类元素第二行第二个元素

wending(locate) # sleep(60) #这个sleep半夜12点很稳定就是不够快

else:

pass

locate = "#dataGrid > tbody > tr:nth-child(" + str(i+1) + ") > td:nth-child(2)"#表格内22

wending(locate) #定位交易码汇总表格内容

obj14 = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locate)))

obj14.click()

print("查询结果页,点击行,出现一级菜单")

#出现一级菜单 ,下面选中视图钻取 悬停

obj15 = wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='body']//*[@id='menu']//li[1]/a")))

ActionChains(driver).move_to_element(obj15).perform() #鼠标悬停ok 不可以偷懒,'' 包含""是错误的

print("查询结果页, 悬停, 出现二级菜单")

#选择二级菜单-错误码视图,点击

sleep(1)

obj16 = driver.find_element_by_css_selector("#menu > li:nth-child(1) > ul > li:nth-child(7) > a") #定位成功,又失败5次

obj16.click() # Message: element not visibl

print("点击二级菜单错误码成功")

locate="#dataGrid > tbody > tr:nth-child(2) > td:nth-child(2)" #错误码详情页 定位表格内元素

wending(locate)

js_top = "var q=document.documentElement.scrollTop=0"

driver.execute_script(js_top) #滚动到顶部

driver.switch_to.default_content() #切出frame框架

# driver.execute_script("document.getElementsByClassName('select')[0].scrollIntoView(true);")#f12测试有效,滚动到可见位置 此处失败1次 Id('tabs' 是总览视图 唯一id 测试2次无效一定要具体元素才行,xxx select--------------------------------

driver.execute_script("window.scrollTo(0,0);")#滚动到顶部

# driver.execute_script("var q=document.documentElement.scrollTop=0")------#滚动到顶部-注释试试。

filename = "错误码视图0" + str(i) + "项.png"

driver.get_screenshot_as_file(filepath + os.sep + filename )

print("错误码截图,成功第%d张"%(i))

driver.switch_to.frame('iframe-content-id')

html=driver.page_source

write_err_page(html,filepath)

#回首页 点击顶部 交易码视图(外部数据管理[P12N-EDTM]) css解析网页验证通过,之前都可以的

obj17 = driver.find_element_by_css_selector("#body > div.page-container > div > div:nth-child(1) > div > div > ul > li:nth-child(2)")

obj17.click()

# locate="#dataGrid > tbody > tr:nth-child(3) > td:nth-child(2)"#汇总页定位表格元素第二行第二个元素

# wending(locate)#稳定回到主页目录页,老出错奔溃

sleep(60)

print("返回首页成功")

if __name__ == '__main__':

url='http://11.168.30.11:1380/appmon-web/index.jsp' #建行应用监控平台,外部数据项目

driver = webdriver.Chrome()#返回一个驱动对象,模拟用户的操作行为

wait = WebDriverWait(driver,80)

start_time = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y-%m-%d %H%M') #获取当前日期

yesterday0000 = start_time.split(" ",1)[0] + ' 00:00'

yesterday2359 = start_time.split(" ",1)[0] + ' 23:59'

filepath = os.path.join(os.getcwd(), start_time) #os.path.join(os.getcwd(), '监控错误码.xls')

if not os.path.exists(filepath):

os.mkdir(filepath)

driver.get(url)

get_main_page()#汇总页截图并存储excel

get_err_page()#错误码 截图并存储excel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值