Posts 记一次工单数据爬取自动化excel输出脚本制造
Post
Cancel

记一次工单数据爬取自动化excel输出脚本制造

用知识的土壤来填埋这些坑洞

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

python通过len()函数返回字符串的长度。

写脚本时遇到几个比较坑的点:

1、在for里面执行模块后进行close关闭标签页时会产生错误,排查后,发现在跳出循环模块后使用标签页切换,就可以执行close,说明在模块内的标签页切换对于for循环是无效,需要再进行标签页切换。

1
wd.switch_to.window(handles[-1])  

2、切换iframe有些是没有id或那么的,需要用定位赋值后,再进行切换。

1
2
to_iframe = wd.find_element_by_xpath('//*[@id="xxxx"]/div/div[2]/div[2]/iframe') 
wd.switch_to.frame(to_iframe) #切换右侧的iframe

3、在执行点击操作时Click时,调用click() 后无效,但全局使用的时候没问题,模块内使用就无效,查了好久,没查出来原因,后来想了想,我直接不用不就行了,我的动作想要点击,那我不一定要点击,我可以按放啊,所以我用了:

1
2
3
inquire = wd.find_element_by_xpath('//*[@id="xxxxx"]/span')
ActionChains(wd).click_and_hold(inquire).perform() #鼠标左键按下的操作
ActionChains(wd).release(inquire).perform()  #鼠标释放

4、有些执行失败和网页的加载有关,虽然已经使用了implicitly_wait(),但还是难保有其他问题,所以在每个动作后加time能规避很多bug。

部分源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains   #操作鼠标
import xlrd  
from xlutils.copy import copy   #写入库

def obtain(obtain_sv):
    handles = wd.window_handles
    wd.switch_to.window(handles[-1])  #切换到最新标签页
    print(wd.title)
    time.sleep(1)
    wd.switch_to.frame('xxxxx')  #切换到左侧的iframe
    wd.find_element_by_id('xxxxx').click()  #点击服务单查询
    time.sleep(2)
    to_iframe = wd.find_element_by_xpath('//*[@id="xxxxx"]/div/div[2]/div[2]/iframe') 
    wd.switch_to.frame(to_iframe) #切换右侧的iframe
    time.sleep(1)
    enter = wd.find_element_by_id('xxxxx')  
    enter.clear()
    enter.send_keys(obtain_sv) #输入
    time.sleep(1)
    inquire = wd.find_element_by_xpath('//*[@id="xxxxx"]/span')
    ActionChains(wd).click_and_hold(inquire).perform() #鼠标左键按下的操作
    ActionChains(wd).release(inquire).perform()  #鼠标释放
    time.sleep(6)
    Click = wd.find_element_by_xpath('//*[@id="xxxxx"]/div/a') 
    ActionChains(wd).click_and_hold(Click).perform() #鼠标左键按下的操作
    time.sleep(1)
    ActionChains(wd).release(Click).perform()  #鼠标释放
    wd.switch_to.default_content() #跳出frame
    time.sleep(1)
    handles = wd.window_handles
    wd.switch_to.window(handles[-1])
    print(wd.title)
    time.sleep(1)
    applicant = wd.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[2]/div[2]/table/tbody/tr[2]/td[2]').text #申请人
    time.sleep(1)
    Department = wd.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[2]/div[2]/table/tbody/tr[3]/td[2]').text  #部门
    time.sleep(1)
    principal = wd.find_element_by_xpath('/html/body/div[1]/div[4]/div/div[2]/div[2]/div/div/div[2]/div[4]/div[2]/div/table/tbody/tr[4]/td[4]/div').text   #负责人
    time.sleep(1)
    #  写入数据
    try:
        ws.write(applicant_Row, applicant_List, applicant)
        ws.write(Department_Row, Department_List, Department)
        ws.write(principal_Row, principal_List, principal) 
    except(BaseException) as error: 
        print (error)
    time.sleep(1)

# 创建 WebDriver 对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome('xxxxx\chromedriver.exe')
time.sleep(4)
# 设置最大等待时长为 10秒,定位参数时每半秒查一次
wd.implicitly_wait(10)
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://xxxxxx/')
#窗口最大化
time.sleep(1)
wd.maximize_window()
wd.find_element_by_class_name('xxxxx').click()  #点击后台
time.sleep(1)

#读
input_file_name = 'xxxxx.xls'
excel = xlrd.open_workbook(input_file_name)
table = excel.sheets()[0]  # 获得第一个sheet的对象
biaotou= table.col_values(22)[1:]   #从23列第二行开始

#写
# 将操作文件对象拷贝,变成可写的workbook对象
new_excel = copy(excel)
# 获得第一个sheet的对象
ws = new_excel.get_sheet(0)

applicant_Row = 0 #初始化忽略第一行
Department_Row = 0
principal_Row = 0
applicant_List = 21 
Department_List = 19
principal_List = 20

for value in biaotou:
    applicant_Row+=1 
    Department_Row+=1
    principal_Row+=1
    if value != u'' and len(value) == 12:
        obtain(value)
        handles = wd.window_handles
        wd.switch_to.window(handles[-1])
        print(wd.title)
        wd.close()
        handles = wd.window_handles
        wd.switch_to.window(handles[-1])
        print(wd.title)
        
new_excel.save('new_mcw_test.xlsx')
time.sleep(2)
wd.quit()

参考资料

python中使用xlrd、xlwt操作excel表格详解
如何写入数据到已经存在的Excel文件
xlutils模块使用

This post is licensed under CC BY 4.0 by the author.

Contents

记一次TLS1.2协议排查记录

CompTIA-Security+考试心得

Comments powered by Disqus.