2022. 2. 24. 10:31ㆍProgramming/python
로그인 한 후 데이터를 긁어와야 하는 웹 페이지는 어떤 식으로 데이터를 긁어와야 할까??
이것 저것 찾아보다가 selenium이란 패키지를 발견했다.
selenium은 headless (브라우저를 띄우지 않고 브라우저처럼 행동하는 것) chrome을 이용해서 실제 사용자가 액션을 취한 것처럼 동작시키는 작업을 한다.
기본 작업 방법은 다음과 같다.
1. chrome driver 설치
2. crawling 관련 패키지 설치
3. selenium으로 로그인 후 세션 찾기
4. 세션을 python requests 세션에 넣은 후 api 호출하기.
1. 우선 selenium을 사용하기 위해서는 chrom driver를 설치해야 한다. 해당 환경은 mac이라서 brew를 이용해서 아래와 같이 설치했다.
$> brew install chromedriver
2. crawling 관련 패키지를 설치하자.
$> pip3 install selenium==3.141 bs4 requests
셀레니움의 경우 최신 버전으로 설치할 경우 먼가 함수 동작 방식이 바껴서 사용하기가 불편했다. 그래서 3.141 버전으로 고정시켜줬다.
3. selenium으로 로그인 하고 세션 찾기.
import json
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
login_html = '로그인 할 페이지'
crawl_api = "크롤할 api"
options = webdriver.ChromeOptions()
# headless 옵션 설정
options.add_argument('headless')
options.add_argument("no-sandbox")
# 브라우저 윈도우 사이즈
options.add_argument('window-size=1920x1080')
# 사람처럼 보이게 하는 옵션들
options.add_argument("disable-gpu") # 가속 사용 x
options.add_argument("lang=ko_KR") # 가짜 플러그인 탑재
options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36') # user-agent 이름 설정
# 드라이버 생성
driver = webdriver.Chrome(options=options)
driver.get(login_html)
driver.implicitly_wait(3)
driver.find_element_by_xpath('id 넣을 tag의 xpath').send_keys('입력할 id')
driver.find_element_by_xpath('password 넣을 tag의 xpath').send_keys('입력할 password')
driver.find_element_by_xpath('로그인 버튼의 xpath').click()
_cookies = driver.get_cookies()
cookie_dict = {}
for cookie in _cookies:
cookie_dict[cookie['name']] = cookie['value']
특별히 언급할 내용이라면, find_element_by_xpath 부분인데 해당 매서드 이외에도 find_element_by_id, find_element_by_name 등으로도 엘리먼트를 찾을 수 있다. xpath의 경우 찾고자 하는 엘리먼트 (예를 들면 id 입력 edit box)에서 마우스 오른쪽 버튼을 누른 후 검사 버튼을 누르면 아래와 같은 개발자 화면이 나타난다. 해당 개발자 화면에서 활성화된 tag에서 다시 한번 마우스 오른쪽 버튼을 누르고 Copy > Copy XPath 메뉴를 클릭하면 해당 XPath가 클립보드로 저장이 된다.
id, password, 로그인 버튼 모두 위와 같은 방식으로 XPath를 얻어오면 된다.
이렇게 로그인 버튼 클릭까지 성공했다면 driver.get_cookies()를 통해 현재 연결된 쿠키 정보를 얻어올 수 있다.
4. 위에서 얻어온 쿠키 정보를 python requests 세션에 넣은 후 api 호출하자.
session = requests.Session()
headers = {'User-Agent': 'Mozila/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'}
session.headers.update(headers)
session.cookies.update(cookie_dict)
headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
res = session.post(crawl_api, headers=headers, data=data)
json_obj = json.loads(res.text)
print(json_obj)
driver.quit()
requests 세션을 만든 후 각각 세션과 쿠키 정보를 업데이트 하자.
이렇게 업데이트 된 session 객체를 이용해서 crawl_api를 호출하면 로그인 된 상태에서 해당 api를 호출하는 것과 같은 결과를 가져올 수 있다.
마지막엔 꼭 driver.quit를 해주자.