외부서비스에서 제공하는 데이터를 관리용 웹사이트를 이용중인 상황.
하지만 일괄적으로 입력할 데이터 양도 많고 input tag에 값을 일일이 넣을 경우 사이트가 느려지거나 여러 값들을 일일이 넣어줘야하는 번거로운 상황이 있었다.
1. Python requests와 BeautifulSoup4 package 이용
데이터를 입력하고 submit할 때 호출하는 api와 payload(parameters)값들을 추출하였고 웹브라우저 상에서 테스트 시 정상적으로 작동하였지만 requests 패키지를 활용하여 api를 다루다보니 '세션'관련 문제가 발생하였다.
form-data에 id와 pw를 입력하여 post로 전송하였으나 이 역시 마찬가지 였으며, headers의 세팅 또한 웹브라우저 환경과 동일하게 하였으나 마찬가지 였다.
2. python selenium 활용
입력할 값들을 미리 변수에 넣어서 selenium으로 자동화를 하려하였으나, 관리하는 데이터의 값들과 사이트 폼이 달라서 사실상 의미없는 작업이었다.
3. 세션유지를 위한 문제해결 방법!
결론적으로 requests를 활용하여 api를 호출하는 방법이 가장 효과적이었기에, 세션 유지를 하고자 1 + 2 방법을 혼용하였다.
최초엔 selenium으로 해당사이트에 로그인을 한 뒤, session 값을 가져와서 requests로 제어하니 원하던 작업을 진행할 수 있었다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
driver = webdriver.Chrome(service= Service(ChromeDriverManager().install()))
url = "https://test.com"
driver.get(url)
time.sleep(5)
import requests
# 여기에서 로그인 작업을 수행
# 사용자명과 비밀번호 입력
username_element = driver.find_element(By.XPATH, '//*[@id="UserId"]') # 사용자명 입력 필드
password_element = driver.find_element(By.XPATH, '//*[@id="UserPassword"]') # 비밀번호 입력 필드
username_element.send_keys("id")
password_element.send_keys("password")
# 로그인 버튼 클릭
login_button = driver.find_element(By.XPATH, '//*[@id="myForm"]/button') # 로그인 버튼 선택
login_button.click()
# Selenium을 사용하여 페이지 이동 및 추가 작업 수행
# 이제 requests를 사용하여 세션을 유지하면서 추가 요청을 보낼 수 있음
session = requests.Session()
# 필요한 추가 요청 설정, 세션에 쿠키 등을 추가
# 예를 들어, session.cookies.update(driver.get_cookies())를 사용하여 브라우저 쿠키를 세션에 추가
# requests를 사용하여 추가 요청을 보내거나 데이터를 추출
response = session.get("https://test.com/example/list")
response.text
# Selenium에서 세션 쿠키 가져오기
selenium_cookies = driver.get_cookies()
# requests 세션 초기화
session = requests.Session()
# Selenium에서 가져온 세션 쿠키를 requests 세션에 추가
for cookie in selenium_cookies:
session.cookies.set(cookie['name'], cookie['value'])
# requests를 사용하여 추가 요청을 보냄
response = session.get("https://test.com/example/list")
# 요청을 보낼 URL
url = "https://test.com/api/sample"
# POST 요청에 사용할 데이터
data = {
.........
}
response = session.post(url, data=data)
핵심은 마지막 줄 처럼 'requests.post()'가 아닌 'session.post()'로 호출한다는 점!
'Daily Commit > Data Engineering' 카테고리의 다른 글
labelme 에러 : Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0) (0) | 2024.03.05 |
---|---|
postgres 설치 (macOS, Docker, DBeaver) (0) | 2023.12.26 |
[Dataframe] AttributeError: Can only use .dt accessor with datetimelike values (0) | 2023.11.17 |
URL 호출을 통한 데이터 수집과 파이프라인 🚬 (0) | 2023.08.23 |