셀레니움을 사용해서 쿠팡 가구들을 크롤링 하려하던중
문제가 발생했다.
나는 쿠팡 파트너스 URL을 크롤링 해올 것이기에 크롤링할때 로그인 한 정보가 필요한데 계속해서
사진과 같은 "데이터 요청에 실패하였습니다" 라는 문구가 떳다.
내 첫번째 코드이다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
# Chrome 드라이버 옵션 설정
chrome_options = Options()
# Chrome WebDriver 설정
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
try:
# 쿠팡 파트너스 페이지 접속
driver.get("https://partners.coupang.com/#affiliate/ws/link/0/%EC%84%A0%EB%B0%98")
# 이메일 입력 필드에 이메일 입력
email_input = driver.find_element(By.ID, "login-email-input")
email_input.send_keys("kaak2203@naver.com")
# 비밀번호 입력 필드에 비밀번호 입력
password_input = driver.find_element(By.ID, "login-password-input")
password_input.send_keys("비밀번호")
# 로그인 버튼 클릭 (로그인 버튼의 실제 id 또는 class를 확인하여 수정해야 할 수 있습니다)
login_button = driver.find_element(By.XPATH, "//button[@type='submit']")
login_button.click()
# 페이지 로드를 위해 잠시 대기
time.sleep(5000) # 페이지 로딩 시간에 따라 조절 필요
# 링크 생성 버튼 클릭
generate_link_button = driver.find_element(By.CSS_SELECTOR, "button.ant-btn.hover-btn.btn-generate-link")
generate_link_button.click()
# 클릭 후 동적 컨텐츠 로딩 대기
time.sleep(5000) # 동적 컨텐츠 로딩 시간에 따라 조절 필요
# BeautifulSoup을 이용해 페이지의 HTML을 파싱
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 생성된 링크 추출
generated_link = soup.find("div", class_="unselectable-input shorten-url-input large").text
print(generated_link)
finally:
# WebDriver 종료
driver.quit()

찾아보니 쿠팡에서 크롤링 방지를 설정해놓은 것이고 이것을 undefined로 변경하면 로그인할 수 있다는 것을 알게 되었다.
해서 아래 코드를 추가하니 해결되었다.
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """})
전체코드
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
# Chrome 드라이버 옵션 설정
chrome_options = Options()
# Chrome WebDriver 설정
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """})
try:
# 쿠팡 파트너스 페이지 접속
driver.get("https://partners.coupang.com/#affiliate/ws/link/0/%EC%84%A0%EB%B0%98")
# 이메일 입력 필드에 이메일 입력
email_input = driver.find_element(By.ID, "login-email-input")
email_input.send_keys("kaak2203@naver.com")
# 비밀번호 입력 필드에 비밀번호 입력
password_input = driver.find_element(By.ID, "login-password-input")
password_input.send_keys("비밀번호")
# 로그인 버튼 클릭 (로그인 버튼의 실제 id 또는 class를 확인하여 수정해야 할 수 있습니다)
login_button = driver.find_element(By.XPATH, "//button[@type='submit']")
login_button.click()
# 페이지 로드를 위해 잠시 대기
time.sleep(5000) # 페이지 로딩 시간에 따라 조절 필요
# 링크 생성 버튼 클릭
generate_link_button = driver.find_element(By.CSS_SELECTOR, "button.ant-btn.hover-btn.btn-generate-link")
generate_link_button.click()
# 클릭 후 동적 컨텐츠 로딩 대기
time.sleep(5000) # 동적 컨텐츠 로딩 시간에 따라 조절 필요
# BeautifulSoup을 이용해 페이지의 HTML을 파싱
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 생성된 링크 추출
generated_link = soup.find("div", class_="unselectable-input shorten-url-input large").text
print(generated_link)
finally:
# WebDriver 종료
driver.quit()
반응형
'IT > Project' 카테고리의 다른 글
[GPTs] 단대학식 - 1 (0) | 2024.02.17 |
---|---|
[GPTs] GPTs 묘지 (0) | 2024.02.13 |
[가구찾아] GPTs 가구찾아주는 서비스 만들기 - 1 (0) | 2024.02.06 |
[Project] AI MEDICO 최종 (글 수정중) (0) | 2024.02.02 |
[Project] EZPill 최종 (글 수정중) (0) | 2024.02.02 |