Python

[Python] 파이썬 셀레늄(selenium)을 사용하여 네이버, 다음, 구글, 인스타그램, 페이스북 자동 로그인 및 검색 기능 만드는 방법 : 크롬 브라우저 조작(매크로)

셀레늄을 사용하여 자동으로 웹사이트 열고 특정 키워드를 검색하는 방법에 대해 알아봅니다.

셀레늄을 사용하는 가장 큰 이유는 request를 사용할 경우 페이지가 로드 되기도 전에 종료될 수 도 있으며, 지연될 경우 실패하는 경우가 있음으로, 작업 시간이 오래 걸리는 작업은 셀레니움(selenium)을 사용합니다. 셀레니움은 웹 브라우저 동작을 자동화 할 수 있어서 웹크롤링을 할 때 BeautifulSoup모듈과 함께 자주 사용됩니다.

 

셀레늄을 사용하기 위해 selenium 모듈을 먼저 설치합니다. 명령프롬프트창(cmd)을 열고 pip install selenium명령어를 실행합니다. 저는 이미 설치를 하였음으로 Requirement already satisfied: selenium 설치 경로를 알려주고 있어요.

Microsoft Windows [Version 10.0.19042.685]
(c) 2020 Microsoft Corporation. All rights reserved.

C:pythonWorkspace>
C:pythonWorkspace>
C:pythonWorkspace>pip install selenium
Requirement already satisfied: selenium in c:usersilikeappdatalocalprogramspythonpython39libsite-packages (3.141.0)
Requirement already satisfied: urllib3 in c:usersilikeappdatalocalprogramspythonpython39libsite-packages (from selenium) (1.26.2)

C:pythonWorkspace>

webdriver로 크롬을 호출하기위해서는 chromdriver가 필요합니다. 크롬 드라이버 설치방법은 아래 포스팅을 참고하세요.

 

[Python] 파이썬 selenium WebDriverException오류 해결 : selenium.common.exceptions.WebDriverException: Message: ‘chromedri

selenium 테스트 코드를 실행해보았습니다. 여기저기서 셀레니움, 셀레늄 하길래…궁금했거든요. 그러나 오류를 직면했네요. [파이썬 스크립트] from selenium import webdriver from selenium.webdriver.common…

playground.naragara.com

설치가 완료되었다면 이제 본격적으로 스크립트를 만들어봅니다.

다음 스크립트는 파이썬 스크립트는 파이썬 공식사이트의를 열고 python이라는 키워드로 자동 검색하는 스크립트입니다. send_keys()함수는 input태그의 value 속성의 값을 자동으로 입력해줍니다. find_element_by_name()함수는 태그의 name 속성을 검색할 때 사용합니다. 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe")
driver.implicitly_wait(10)  # seconds
driver.get("http://www.python.org")

elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source

#브라우저 닫기
#driver.close()

find_element_by_name으로 “q”를 지정한 이유를 알아야합니다. python.org사이트에 열어보세요. 검색바가 존재합니다. 그리고 검색바에 안에 타이핑 할 수 있는 입력창이 존재합니다. input 태그의 이름이 “q”로 되어 있기 때문에 find_element_by_name로 해당 태그에 접근이 가능하게 됩니다.


driver 설정시 암시적 대기 10초를 주었습니다. WebDriver에게 즉시 사용할 수 없는 요소를 찾으려고 할 때 일정 시간 동안 DOM을 폴링하도록 지시합니다. 이렇게 설정하게 되면 WebDriver 개체의 수명 동안 암시적 대기가 설정됩니다.

 

폴링(polling)이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다 (위키백과의 폴링 정의)

 

■구글(google) 사이트 자동 검색 기능 구현하기(매크로)

를 자동으로 열고 검색 키워드를 입력하고 찾는 스크립트를 만들어볼까요?

find_element_by_name와 find_element는 사용방법의 차이이며, find_element를 사용하면 훨씬 가독성이 좋다고 생각합니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe")

driver.get("http://www.google.com")

search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("파이썬")
search_box.send_keys(Keys.RETURN)

구글사이트 역시 input태그의 name 속성값이 “q”입니다. 우연의 일치일까요?


 

 

■다음(Daum) 사이트 자동 검색 기능 구현

다음 사이트를 자동으로 열고 검색 키워드를 “파이썬”으로 입력하고 실행해볼까요?

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe")

driver.get("https://www.daum.net/")

search_box = driver.find_element(By.NAME, "q")

search_box.send_keys("파이썬")
search_box.send_keys(Keys.RETURN)

다음 사이트 역시 input태그의 name 속성의 값이 “q”입니다.  개발자가 동일한 사람도 아닐텐데.. 3개의 사이트의 검색창 input태그의 name 속성의 값이 일치하네요. 이런 우연의 일치가 ㅋㅋㅋㅋㅋ 


 

■ 네이버(naver) 사이트 자동 검색 기능 구현하기

네이버 사이트를 자동으로 열고 검색 키워드를 “파이썬”으로 입력하고 실행해볼까요?

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe")

driver.get("http://www.naver.com")

search_box = driver.find_element(By.NAME, "query")

search_box.send_keys("파이썬")
search_box.send_keys(Keys.RETURN)

네이버 사이트의 경우 input태그의 name 속성값은 “query”입니다.


 

 

■인스타그램 자동 로그인 처리 및 키워드 검색

인스타그램에서 검색을 하기 위해서는 로그인이 먼저 필요합니다. 로그인 계정과 비밀번호를 입력하는 input태그에 접근을 하기위해 input태그의 name 속성이나 id 속성값을 찾습니다.


로그인 후 검색창의 input 태그의 name속성 값을 찾아봅니다. 하지만 인스타그램의 경우 name 속성이나 id 속성값은 사용하지 않고 있으며, class태그 속성을 사용합니다. 그럼으로 우리는 클래스 속성(By.CLASS_NAME)으로 접근합니다


파이썬 스크립트는 다음과 같습니다. 자동 로그인 처리를 해 준 후 검색키워드로 검색합니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe")
driver.get("https://www.instagram.com/")

loginid = driver.find_element(By.NAME, "username")
password = driver.find_element(By.NAME, "password")

loginid.send_keys("본인의 인스타그램 로그인계정")
password.send_keys("비밀번호")
password.send_keys(Keys.RETURN)

driver.implicitly_wait(10)  # seconds
search_box = driver.find_element(By.CLASS_NAME, "XTCLo")

search_box.send_keys("남산타워")
search_box.send_keys(Keys.RETURN)

코드를 실행하였으나 여러개의 태그가 존재한 나머지 선택창이 나타납니다.


남산타워를 선택하고 들어간 후 URL 주소를 확인해보니 아래와 같습니다.

www.instagram.com/explore/tags/남산타워/

개인이 만든 태그인 경우 태그(tag)주소로 찾게 되어 있으며,  위치 기준인 경우 locations 기준으로 검색됨을 확인하였습니다.

www.instagram.com/explore/locations/587456739/

 

해시태크를 선점하는 기능이 있나요? 해시태그 최소 등록한 사람이 주인인가요? 잘모르겠네요.

아래 파이썬스크립트는 검색기준을 태그 기준으로 변경하여 검색을 합니다. 

from selenium import webdriver

driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe")

search_param ="남산타워"
url = f'https://www.instagram.com/explore/tags/{search_param}'
driver.get(url)

 

■ 페이스북(facebook) 자동 로그인 처리 및 검색기능 구현하기

인스타그램과 동일한 방법으로 처리합니다. 아이디와 비빌번호 입력하기위한 input태그를 먼저 찾습니다.  로그인버튼을 클릭하여 실행해보고 싶다면 로그인 버튼의 name속성을 찾아서 클릭이벤트를 처리해줍니다. 


스크립트는 다음과 같습니다. send_keys(Keys.RETURN)을 사용하여 로그인처리를 해도 됩니다. 우리는 로그인 버튼을 찾았으니, click()함수를 호출하여 처리합니다. 로그인 후 검색URL로 변경 후 검색하고자 하는 키워드로 검색을 시도합니다.

from selenium import webdriver
from selenium.webdriver.common.by import By 

driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe")

driver.get("https://www.facebook.com/") 

loginid = driver.find_element(By.NAME, "email")
password = driver.find_element(By.NAME, "pass")

loginid.send_keys("본인의 페이스북 로그인계정")
password.send_keys("비밀번호")
#password.send_keys(Keys.RETURN)
loginbutton = driver.find_element(By.NAME, "login").click()

driver.implicitly_wait(20)  # seconds
driver.get("https://www.facebook.com/search/top?q=남산타워")

 

존재하지않는 요소의 값을 찾을 경우 NoSuchElementException: Message: no such element 오류가 발생됩니다.

C:UsersilikeAppDataLocalProgramsPythonPython39python.exe C:/python/Workspace/main.py
Traceback (most recent call last):
  File "C:pythonWorkspacemain.py", line 31, in <module>
    search_box = driver.find_element(By.NAME, "query")
  File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremotewebdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="query"]"}
  (Session info: chrome=87.0.4280.88)

 

사이트의 개편이 발생하면 input 태그의 name 속성값이 변경되거나 삭제될 수 있어요. 그렇기 때문에 어느날 제대로 실행되던 파이썬 스크립트에서 오류가 발생한다면  크롬 개발자도구를 사용하여 확인하셔야합니다.

 

 

[REFERENCE]

selenium-python.readthedocs.io/locating-elements.html

www.selenium.dev/documentation/en/webdriver/web_element/

 

 

[파이썬 더 알아보기]

[프로그래밍/Python] – [Python] 파이썬 웹 크롤링 BeautifulSoup모듈을 사용하여 뉴스 긁어오기: HTML파싱(뉴스 제목, 날짜, 링크,이미지URL)

 

[Python] 파이썬 웹 크롤링 BeautifulSoup모듈을 사용하여 뉴스 긁어오기: HTML파싱(뉴스 제목, 날짜, 링

뉴스타파 사이트의 “세금도둑추적2020” 뉴스 크롤링을 시도해봅니다. 뉴스부분의 HTML을 파싱하기위해서 크롬 브라우저를 열고 newstapa.org 사이트를 열어요. 그리고 난 후 F12키를 눌러 개발자 도구

playground.naragara.com

[프로그래밍/Python] – [Python] 파이썬 BeautifulSoup 설치 오류시 해결 방법 : os.system(), pip install beautifulsoup4

 

[Python] 파이썬 BeautifulSoup 설치 오류시 해결 방법 : os.system(), pip install beautifulsoup4

import 문에 빨간줄이 표시가되어 마우스를 올렸다. BeautifulSoup 모듈을 사용하기위해서는 패키지를 설치해야한다. 클릭하여 자동설치를 시작하였으나 바로 오류가 터졌다. Collecting BeautifulSoup Downlo

playground.naragara.com

 

 

Leave a Reply

error: Content is protected !!