python-webdriver로 자동으로 표를 작성하는 예시 코드

일상적인 업무에서 종종 일부 표를 반복해서 작성해야 하는데, 만약 인공적으로 완성한다면, 시간이 걸리고, 네트워크 지연은 사람을 매우 붕괴시킨다.프로그램으로 자동 작성을 실현할 수 있다면 효율은 배 이상 높아지고 여러 대의 컴퓨터에 이식하여 작업 효율을 더욱 높일 수 있다.driver는python의selenium 라이브러리의 자동화 테스트 도구로 브라우저의 조작을 완전히 모의할 수 있으며 복잡한request,post를 처리할 필요가 없어 파충류 초보자에게 매우 친절합니다.

1. 환경 설정


python3.6+selenium 라이브러리+xlrd 라이브러리+xlwt 라이브러리
이 중 xlrd와 xlwt 라이브러리는 excel표의 데이터를 읽는 데 사용됩니다.
브라우저를 열려면 브라우저의driver 파일을 다운로드해야 합니다. 컴퓨터 시스템에 맞는 버전 (max/윈도우즈 64비트/윈도우즈 32비트) 을 선택하십시오.
  ChromeDriver: http://npm.taobao.org/mirrors/chromedriver/
     IEDriver: http://selenium-release.storage.googleapis.com/index.html
다운로드한 드라이버입니다.exe 브라우저 루트 디렉터리와python 루트 디렉터리

2. 웹 페이지 열기


IE 브라우저를 예로 들면, 다음 두 줄의 코드는 IE 브라우저를 열고 우리가 표를 작성해야 하는 사이트를 방문할 수 있다

driver= webdriver.Ie()
driver.get('http://xxxx.com/')
만약에 사이트에 로그인해야 한다면 (표를 작성해야 하는 것은 일반적으로 회사 내부 사이트) 로그인 함수를 하나 더 써서driver를 매개 변수로 호출합니다

driver = login(driver)
드라이버를 반드시 돌려보내야 드라이버가 프로그램의 명령을 계속 받아들일 수 있습니다.

3. 원소 포지셔닝


웹 드라이버의 작업 원리는 웹 페이지의 어떤 요소를 찾아 데이터를 입력하거나 클릭하는 등 조작할 수 있는 것이다.
요소 위치 지정에 관해서는 가능합니다이 블로그 참조
제가 주로 사용하는 원소 포지셔닝 방식은

driver.find_element_by_id('someid')# id 
driver.find_element_by_css_selector("input[value=' '")# input , value ' '
driver.find_element_by_xpath("//span[contains(@style,'COLOR: red')]/span[1]")# style 'COLOR:red' span span 

(1) id를 통해 위치 추적


만약 우리가 웹 폼의 어느 위치에 어떤 값을 기입하거나 단추를 누르려면, 우리는 먼저 개발자 도구로 이 요소의 원본 코드를 확인한 다음에 먼저 id가 있는지 관찰하고, 만약 id가 있다면, 직접 id로 이 요소를 포지셔닝해야 한다.그리고

driver.find_element_by_id('someid').click()# 
driver.find_element_by_id('someid').send_keys('somekeys')# 'somekeys'
driver.find_element_by_id('someid').clear()# 
우리가 하고 싶은 조작을 실현하다.

(2)ccsselector를 통해 위치 추적


만약에 우리가 조작하고자 하는 요소에 ID가 없다면 웹 페이지의 다른 요소와 다른 특징을 찾아야 한다. ccsselector는 매우 유연한 포지셔닝 방식이다. 그 중에서value로 포지셔닝하는 것은 좋은 선택이다.... 에 의하면

driver.find_element_by_css_selector("input[value=' '")
예를 들어 인용부호 중의 input는 모든 웹 요소 (div,span,input,a 등) 로 바꿀 수 있으며, 중괄호 중에는 이 요소의 특정한 속성 (style,id,value,class 등) 이 있고, 등호 뒤에는 이 속성의 값이 있다.
웹 페이지에 ccsselector의 조건을 동시에 충족시키는 요소가 여러 개 있다면,value="확인"input가 여러 개 있다면find_element_by_css_selector는 html 원본 코드 중 가장 앞에 있는 것만 위치하고find_elements_by_css_selector는 원본 코드에서 조건을 충족시키는 모든 요소를 찾고 찾은 요소를 목록으로 되돌려줍니다.예를 들어 웹 페이지에 많은 알림 상자가 튀어나오는데, 우리는 일일이 가서 확인을 해야 한다. 이렇게 조작할 수 있다

list=driver.find_elements_by_css_selector("input[value='   ']")
for l in list:
l.click()
그러나 만약에 이 알림 상자가 중첩되어 나타나는데 맨 윗부분의 알림 상자가 실제로 원본에서 더 뒤에 있는 위치에 있다면 목록에서 첫 번째'확인'원소는 위의 알림 상자에 겹쳐져서 클릭할 수 없다. 이때 수조를 거꾸로 하면 된다. 마지막'확인'원소부터 클릭할 수 있다

query=driver.find_elements_by_css_selector("input[value='   ']")
for q in query[::-1]:
q.click()

(3) xpath를 통해 포지셔닝


xpath 포지셔닝은 비교적 복잡하지만 매우 전면적이다. 이 원소의class,style 속성은 다른 원소와 마찬가지로 한 번에 포지셔닝할 수 있는 특징이 없을 때 우리는 xpath로 우리가 원하는 원소의 부자형제 원소를 먼저 찾은 다음에 우리가 원하는 원소를 포지셔닝할 수 있다.예:

driver.find_element_by_xpath('//*[@class="submit clear"]/input[1]').click()
text =driver.find_element_by_xpath("//input[@value='   ']/../preceding-sibling::div[1]").text
driver.find_elements_by_xpath("//span[contains(@style,'COLOR: red')]/span[1]")
인용부호의//는 상대적인 위치를 표시하고 원본 코드의 어느 곳에서든 찾을 수 있음을 나타낸다.
//이후 모든 요소와 함께 사용할 수 있습니다. *는 모든 요소를 나타냅니다. 즉, 속성에 맞는 위치를 지정하여 모든 요소를 선별합니다.
중괄호 안은 속성의 필터링 조건입니다. @ 이후 속성을 추가할 수 있습니다.contains(@style,'COLOR:red')는 스타일 속성에'COLOR:red'가 포함되어 있음을 나타냅니다. @style='COLOR:red'를 직접 사용하지 않습니다.
왜냐하면 우리가 원본 코드를 심사할 때 이 요소의 스타일 속성은'COLOR:red'라는 하나일 수 있지만 동적 인터페이스의 스타일 속성은 자주 변화하고 프로그램이 실행될 때 직접 사용하면 이 요소를 포지셔닝할 수 없는 것과 같다.
우리는 보통 먼저 어떤 id가 있는 원소를 찾은 다음에 등급 관계를 통해 우리가 진정으로 포지셔닝하고 싶은 원소를 포지셔닝해야 한다. 형제 부자 원소의 포지셔닝에 관해서는 참고하십시오https://www.jb51.net/article/92673.htm
  /..이 원소를 포지셔닝할 수 있는 아버지 원소
/이 요소의 하위 요소를 지정할 수 있습니다.
/preceding-sibling::이 요소의 형 요소를 포지셔닝할 수 있습니다.
/following-sibling::이 요소의 동생 요소를 포지셔닝할 수 있습니다.
예를 들어/input[1]는 하위 요소 중 첫 번째 input,/.../preceding-sibling::div[1] 아버지 원소를 나타내는 오빠 원소 중 첫 번째div

(4) 현재 노드를 통해 위치 추적


때때로 우리는 원소의 현재 상태(선택 여부)를 판단하고 다음 조작을 결정해야 하는 상황에 직면하게 된다. 이때 변수로 현재 노드를 저장해야 한다

LTE=driver.find_element_by_xpath("//input[@id='LTE']/../span[1]"
그리고 get_attribute는 현재 노드 요소의 속성을 얻을 수 있습니다. 이 예에서 요소가 파란색이면 클릭할 필요가 없습니다.코드 구현:

if LTE.get_attribute("style")=="COLOR: blue":
 pass
 else:
 LET.click()
특정 텍스트를 필터링해야 하는 경우:

 red=driver.find_elements_by_xpath("//span[contains(@style,'COLOR: red')]/span[1]")# 
 for r in red:
 if ' ' in r.text:# ‘ '
  r.find_element_by_xpath("./../preceding-sibling::input[1]").click()# ‘./' 
  break
만약 찾은 요소를 스크롤 인터페이스에서 볼 수 있다면, 이때 js로 이 요소에 초점을 맞추면 페이지는 이 요소의 위치로 스크롤됩니다

 target=driver.find_element_by_css_selector("input[value='   ']")
 driver.execute_script("arguments[0].scrollIntoView();", target)
 target.click()

4. 불확정 상황 처리


(1) 나타날 수 있는 탄창


표를 작성하는 과정에서 어떤 곳에는 탄창이 나타날 수도 있고 나타나지 않을 수도 있다. 이때 이 탄창이 무엇이든try로...except 문장 처리로 해결 가능
js가 촉발한 탄창:

 try:
 driver.find_element_by_css_selector("input[value='   ']").click()
 except Exception as e:
 pass
웹 페이지 alert 창:

 try:
 driver.switch_to.alert.dismiss()
 except Exception:
 pass
dismiss () 는 alert 탄창의'취소'항목에 대응하고, accept () 는'확인'항목에 대응하며, driver.switch_to.alert.text는 탄창의 텍스트 내용을 얻을 수 있습니다.

(2) 수량이 일정하지 않은 탄창


위에서 언급한 여러 개의 알림 상자의 상황에 대해query=driver를 사용하지 않습니다.find_elements_by_css_selector ("input [value='확인']) 모든 요소를 한꺼번에 찾아서 순서를 바꾸거나 거꾸로 누르는 것 외에while 순환으로 해결할 수 있습니다

 while(1):
 try:
  driver.find_element_by_css_selector("input[value='   ']").click()
 except Exception as e:
  break

(3) 네트워크 지연


일부 웹 페이지는 조회 정보를 클릭한 후에 일정 시간을 불러와야 한다. 불러오는 웹 페이지는 우리가 다음에 찾고 싶은 요소를 찾을 수 없기 때문에 프로그램이 오류를 보고할 수 있다. 이때 두 가지 해결 방법이 있다.
하나는 고정적으로 일정 시간을 기다리고, 웹 페이지가 불러오기를 기다리는 것이다. 이런 방법의 단점은 기다리는 가장 좋은 시간을 찾기 어렵다는 것이다. 너무 짧으면 페이지가 아직 불러오기 전에 너무 길면 효율에 영향을 미친다.

time.sleep(2)
다른 하나는 while 순환으로 다음 원소를 계속 찾는 거예요.

 while(1):
 try:
  driver.find_element_by_id('continueTrade').click()
  break
 except Exception:
  pass
이런 방법의 전제는 다음에 찾아야 할 원소가 반드시 나타날 것이다

5. 프레임 처리


프레임 처리에 관한 이 블로그는 매우 잘 썼다https://www.jb51.net/article/203425.htm
총괄적으로 말하면 프레임셋은 자르지 않고 프레임은 층층이 자르는 것이다.가장 좋은 것은 일련의 테이블 작성이 끝난 후에 모두 드라이버를 사용하는 것이다.switch_to.default_content () 는 원래 문서로 돌아가서 혼란스럽기 쉽습니다
여기에 프레임이 id가 없을 때 자르는 방법을 조금 더 추가할게요.

 frame= self.driver.find_element_by_xpath("/html/body/div[12]/iframe")# frame , 
 self.driver.switch_to_frame(frame)# 

6. excel 데이터 읽기와 쓰기


excel 데이터는 읽기와 쓰기가 매우 간단합니다. 코드를 보면 됩니다.

def read(file):
 data = xlrd.open_workbook(file)# excel 
 table = data.sheets()[0]# sheet 
 phones = table.col_values(0)# 
 peoples = table.col_values(1)# 

 return phones,peoples

def write(result):
 file=xlwt.Workbook()# excel 
 table = file.add_sheet('sheet1')# sheet
 for i in range(len(result)):# 
 table.write(i,0,result[i][0])
 table.write(i,1,result[i][1])
 table.write(i,2,result[i][2])
 file.save('result.xls')

이는python-webdriver로 자동 작성을 실현하는 예시 코드에 관한 글을 소개합니다. 더 많은 관련python webdriver 자동 작성 내용은 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기