python-webdriver로 자동으로 표를 작성하는 예시 코드
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 자동 작성 내용은 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.