首页 > 编程语言 > 详细

python selenium 爬虫自动化工作脚本

时间:2019-02-26 11:30:30      阅读:183      评论:0      收藏:0      [点我收藏+]
#coding= utf-8
‘‘‘内部监控应用平台 自动化工作脚本
难点
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)) #运行结果 <class ‘list‘>
    print(len(infos))  #运行结果 11
    data = []
    for info in infos[1:]:  #infos[1:]# print(type(info))  #<class ‘lxml.etree._Element‘>
        #谢主管 经典 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

python selenium 爬虫自动化工作脚本

原文:https://www.cnblogs.com/hawking21/p/10435928.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!