본문 바로가기
TOP
데이터 스킬업/웹크롤링

[파이썬:웹크롤링] #15 셀레니움 크롤링 반복문 with for문 & range

by 티챠림 2022. 6. 23.

[왕초보 웹크롤링 무작정 따라하기] 웹크롤링, 셀레니움, for 반복문, range.


#15 셀레니움 크롤링 반복문 with for문 & range


for반복문과 range()활용법 (바로가기 Click)


피드 1개를 크롤링해봤으니 이번에는 12개 게시물을 클롤링해 보자. 반복행동은  for문을 사용하면 간단하게 만들 수 있다. 반복문을 만들기 위해 먼저 해야할 것은 각 피드 경로의 규칙성을 찾는 것이다. 웹 개발자 도구에서 html을 확인해 보자. 

 

 

 

 

확인해 보면, 3개의 피드가 한개의 열로 구성되어 있고 xpath의 숫자가 규칙적으로 1~3으로 바뀌는 것을 알 수 있다. 맨 마지막 div의 번호는 칸의 순서, 뒤에서 2번 째 div 번호는 열 번호이다. 그렇다면 12개의 피드를 추철하기 위해서는 총 4개 열에서 각 3개 칸의 경로를 반복하는 for문을 만들어야한다. 규칙에 맞춰  두번째 div에 1~4를 넣어주고, 마지막 div에 1~3을 넣어주면 된다.

 

▼ 각 피트 자리의 xpath 경로 '~/article/div[1]/div/div[n]/div[m]

  1번째 칸 2번째 칸 3번째 칸
1열 '//*[@id="react-root"]/div/div/section/main/div/div[4]/article/div[1]/div/div[1]/div[1] //*[@id="react-root"]/div/div/section/main/div/div[4]/article/div[1]/div
/div[1]/div[2]
//*[@id="react-root"]/div/div/section/main/div/div[4]/article/div[1]/div
/div[1]/div[3]
2열 //*[@id="react-root"]/div/div/section/main/div/div[4]/article/div[1]/div
/div[2]/div[1]
//*[@id="react-root"]/div/div/section/main/div/div[4]/article/div[1]/div
/div[2]/div[2]
//*[@id="react-root"]/div/div/section/main/div/div[4]/article/div[1]/div
/div[2]/div[3]
3열 //*[@id="react-root"]/div/div/section/main/div/div[4]/article/div[1]/div
/div[3]/div[1]
//*[@id="react-root"]/div/div/section/main/div/div[4]/article/div[1]/div
/div[3]/div[2]
//*[@id="react-root"]/div/div/section/main/div/div[4]/article/div[1]/div
8/div[3]/div[3]

*html 경로는 보안을 위해 계속 변경되느 코드딩 할때 마다 확인해줘야 함

 

 

 

  for반복문과 range()활용법

일정 범위의 숫자를 만들어 주는 메소드는 range이다. 예를 들어, range(1, 10, 2)1이상 10미만, 숫자 2를 간격의 범위를 나타내며  '1, 3, 5, 7, 9'이 된다. 괄호의 앞에서부터 '시작 숫자, 마지막 숫자, 숫자 간격'을 나타낸다. 이를 활용하면 규칙성을 갖는 html 경로에 대한 반복문을 만들 수 있다. 우리가 만들려는 경로는 1~4번 열, 1~3번 칸이므로 range(1,5)range(1,4)로 하면 된다. 반복문을 만들었을 때 어떻게 작동할지 생각해보면 아래 표와 같다.

 

알고리즘 n에  숫자 1대입 m에 숫자 1대입 '//article/div[1]/div/div[{0}]/div[{1}]'.format('1', '1')
m에 숫자 2대입 '//article/div[1]/div/div[{0}]/div[{1}]'.format('1', '2')
m에 숫자 3대입 '//article/div[1]/div/div[{0}]/div[{1}]'.format('1', '3')
...    
n에  숫자 4대입 m에 숫자 1대입 '//article/div[1]/div/div[{0}]/div[{1}]'.format('4', '1')
m에 숫자 2대입 '//article/div[1]/div/div[{0}]/div[{1}]'.format('4', '2')
m에 숫자 3대입 '//article/div[1]/div/div[{0}]/div[{1}]'.format('4', '3')

 

 

 

이러한 반복 구조를 for문은 열 번호 n이 1~4까지의 범위를 갖는 반복문 for n in range(1,5)이고, 칸 번호 m이 1~3까지의 범위를 갖는 반복문 for n in range(1,4)으로 만들 수 있다. 그리고 열 번호 n의 반복은 칸 번호 m의 반복 이후에 진행되어 야하기 때문에, 열번호 반복문이 칸 번호 반복문 보다 상위구조가 된다.

for n in range(1, 5):  #열 번호
    for m in range(1,4):  #칸 번호

 

 

 

범위를 정해줬으면 각 경로에 숫자를 넣어줘야 한다. 문자열에 특정 문자를 넣어주는 방법은 .format()이다. 문자를 넣어줄 곳에 { }을 넣어주고, 문자열의 뒤에 .format('들어갈 문자')를 넣어주면 된다. 피드 경로에 대해서 '~/div[{}]/div[{}]'.format('n', 'm')으로 하면 된다. { }안에  .format()안의 문자가 순서대로 대입된다. 그리고 만들어 뒀던 마우스오버 코드를 반복문 아래 넣으면 12개의 피드에 각각 마우스 오버가 실행되는 것을 확인할 수 있다.

for n in range(1, 5):
    for m in range(1,4):
        pead_path = '~div[{}]/div[{}]'.format(n,m)
      	
        #마우스 오버 코드
        act = ActionChains(dr)
        pead = dr.find_element_by_xpath(pead_path)
        act.move_to_element(pead).perform()
        time.sleep(1)

 

 

댓글