>  기사  >  백엔드 개발  >  Selenium을 사용하여 로그인으로 보호된 웹사이트를 긁는 방법(단계별 가이드)

Selenium을 사용하여 로그인으로 보호된 웹사이트를 긁는 방법(단계별 가이드)

Barbara Streisand
Barbara Streisand원래의
2024-11-02 10:34:30634검색

How to Scrape Login-Protected Websites with Selenium (Step by Step Guide)

비밀번호로 보호된 웹사이트를 긁어내는 단계:

  1. HTML 양식 요소 캡처: 사용자 이름 ID, 비밀번호 ID 및 로그인 버튼 클래스
  2. - 요청이나 Selenium과 같은 도구를 사용하여 로그인을 자동화합니다. 사용자 이름 입력, 대기, 비밀번호 입력, 대기, 로그인 클릭
  3. - 인증을 위해 세션 쿠키 저장
  4. - 인증된 페이지 계속 스크랩

면책조항: https://www.scrapewebapp.com/에서 이 특정 사용 사례에 대한 API를 구축했습니다. 따라서 빨리 끝내고 싶다면 사용하고, 아니면 계속 읽어보세요.

이 예를 사용하겠습니다. https://www.scrapewebapp.com/의 내 계정에서 내 API 키를 스크랩하고 싶다고 가정해 보겠습니다. 이 페이지에 있습니다: https://app.scrapewebapp.com/account/api_key

1. 로그인 페이지

먼저 로그인 페이지를 찾아야 합니다. 대부분의 웹사이트는 로그인 뒤의 페이지에 접근하려고 하면 리디렉션 303을 제공하므로 https://app.scrapewebapp.com/account/api_key를 직접 스크래핑하려고 하면 자동으로 로그인 페이지 https://가 표시됩니다. app.scrapewebapp.com/login. 따라서 아직 제공되지 않은 경우 로그인 페이지 찾기를 자동화하는 좋은 방법입니다.

자, 이제 로그인 페이지가 생겼으니 사용자 이름이나 이메일, 비밀번호, 실제 로그인 버튼을 추가할 위치를 찾아야 합니다. 가장 좋은 방법은 "이메일", "사용자 이름", "비밀번호" 유형을 사용하여 입력의 ID를 찾고 "제출" 유형의 버튼을 찾는 간단한 스크립트를 만드는 것입니다. 아래에 코드를 만들었습니다.

from bs4 import BeautifulSoup


def extract_login_form(html_content: str):
    """
    Extracts the login form elements from the given HTML content and returns their CSS selectors.
    """
    soup = BeautifulSoup(html_content, "html.parser")

    # Finding the username/email field
    username_email = (
        soup.find("input", {"type": "email"})
        or soup.find("input", {"name": "username"})
        or soup.find("input", {"type": "text"})
    )  # Fallback to input type text if no email type is found

    # Finding the password field
    password = soup.find("input", {"type": "password"})

    # Finding the login button
    # Searching for buttons/input of type submit closest to the password or username field
    login_button = None

    # First try to find a submit button within the same form
    if password:
        form = password.find_parent("form")
        if form:
            login_button = form.find("button", {"type": "submit"}) or form.find(
                "input", {"type": "submit"}
            )
    # If no button is found in the form, fall back to finding any submit button
    if not login_button:
        login_button = soup.find("button", {"type": "submit"}) or soup.find(
            "input", {"type": "submit"}
        )

    # Extracting CSS selectors
    def generate_css_selector(element, element_type):
        if "id" in element.attrs:
            return f"#{element['id']}"
        elif "type" in element.attrs:
            return f"{element_type}[type='{element['type']}']"
        else:
            return element_type

    # Generate CSS selectors with the updated logic
    username_email_css_selector = None
    if username_email:
        username_email_css_selector = generate_css_selector(username_email, "input")

    password_css_selector = None
    if password:
        password_css_selector = generate_css_selector(password, "input")

    login_button_css_selector = None
    if login_button:
        login_button_css_selector = generate_css_selector(
            login_button, "button" if login_button.name == "button" else "input"
        )

    return username_email_css_selector, password_css_selector, login_button_css_selector


def main(html_content: str):
    # Call the extract_login_form function and return its result
    return extract_login_form(html_content)

2. Selenium을 사용하여 실제로 로그인

이제 Selenium Webdriver를 만들어야 합니다. Python으로 실행하기 위해 Chrome Headless를 사용할 것입니다. 설치 방법은 다음과 같습니다.

# Install selenium and chromium

!pip install selenium
!apt-get update 
!apt install chromium-chromedriver

!cp /usr/lib/chromium-browser/chromedriver /usr/bin
import sys
sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver')

그런 다음 실제로 당사 웹사이트에 로그인하여 쿠키를 저장하세요. 모든 쿠키는 저장되지만 인증 쿠키는 원하는 경우에만 저장할 수 있습니다.

# Imports
from selenium import webdriver
from selenium.webdriver.common.by import By
import requests
import time

# Set up Chrome options
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

# Initialize the WebDriver
driver = webdriver.Chrome(options=chrome_options)

try:
    # Open the login page
    driver.get("https://app.scrapewebapp.com/login")

    # Find the email input field by ID and input your email
    email_input = driver.find_element(By.ID, "email")
    email_input.send_keys("******@gmail.com")

    # Find the password input field by ID and input your password
    password_input = driver.find_element(By.ID, "password")
    password_input.send_keys("*******")

    # Find the login button and submit the form
    login_button = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
    login_button.click()

    # Wait for the login process to complete
    time.sleep(5)  # Adjust this depending on your site's response time


finally:
    # Close the browser
    driver.quit()

3. 쿠키 저장

driver.getcookies() 함수에서 사전에 저장하기만 하면 됩니다.

def save_cookies(driver):
    """Save cookies from the Selenium WebDriver into a dictionary."""
    cookies = driver.get_cookies()
    cookie_dict = {}
    for cookie in cookies:
        cookie_dict[cookie['name']] = cookie['value']
    return cookie_dict

WebDriver에서 쿠키를 저장하세요

쿠키 = save_cookies(드라이버)

4. 로그인한 세션에서 데이터 가져오기

이 부분에서는 간단한 라이브러리 요청을 사용하지만 셀레늄을 계속 사용해도 됩니다.

이제 다음 페이지에서 실제 API를 얻으려고 합니다: https://app.scrapewebapp.com/account/api_key.

그래서 요청 라이브러리에서 세션을 생성하고 여기에 각 쿠키를 추가합니다. 그런 다음 URL을 요청하고 응답 텍스트를 인쇄하세요.

def scrape_api_key(cookies):
    """Use cookies to scrape the /account/api_key page."""
    url = 'https://app.scrapewebapp.com/account/api_key'

    # Set up the session to persist cookies
    session = requests.Session()

    # Add cookies from Selenium to the requests session
    for name, value in cookies.items():
        session.cookies.set(name, value)

    # Make the request to the /account/api_key page
    response = session.get(url)

    # Check if the request is successful
    if response.status_code == 200:
        print("API Key page content:")
        print(response.text)  # Print the page content (could contain the API key)
    else:
        print(f"Failed to retrieve API key page, status code: {response.status_code}")

5. 원하는 실제 데이터 얻기(보너스)

원하는 페이지 텍스트를 얻었지만 신경 쓰지 않는 데이터가 많습니다. 우리는 api_key만 원합니다.

이를 수행하는 가장 좋고 쉬운 방법은 ChatGPT(GPT4o 모델)와 같은 AI를 사용하는 것입니다.

모델에게 다음과 같이 요청합니다. “당신은 전문 스크래퍼이고 맥락에서 요청된 정보만 추출할 것입니다. {context}에서 내 API 키 값이 필요합니다.

from bs4 import BeautifulSoup


def extract_login_form(html_content: str):
    """
    Extracts the login form elements from the given HTML content and returns their CSS selectors.
    """
    soup = BeautifulSoup(html_content, "html.parser")

    # Finding the username/email field
    username_email = (
        soup.find("input", {"type": "email"})
        or soup.find("input", {"name": "username"})
        or soup.find("input", {"type": "text"})
    )  # Fallback to input type text if no email type is found

    # Finding the password field
    password = soup.find("input", {"type": "password"})

    # Finding the login button
    # Searching for buttons/input of type submit closest to the password or username field
    login_button = None

    # First try to find a submit button within the same form
    if password:
        form = password.find_parent("form")
        if form:
            login_button = form.find("button", {"type": "submit"}) or form.find(
                "input", {"type": "submit"}
            )
    # If no button is found in the form, fall back to finding any submit button
    if not login_button:
        login_button = soup.find("button", {"type": "submit"}) or soup.find(
            "input", {"type": "submit"}
        )

    # Extracting CSS selectors
    def generate_css_selector(element, element_type):
        if "id" in element.attrs:
            return f"#{element['id']}"
        elif "type" in element.attrs:
            return f"{element_type}[type='{element['type']}']"
        else:
            return element_type

    # Generate CSS selectors with the updated logic
    username_email_css_selector = None
    if username_email:
        username_email_css_selector = generate_css_selector(username_email, "input")

    password_css_selector = None
    if password:
        password_css_selector = generate_css_selector(password, "input")

    login_button_css_selector = None
    if login_button:
        login_button_css_selector = generate_css_selector(
            login_button, "button" if login_button.name == "button" else "input"
        )

    return username_email_css_selector, password_css_selector, login_button_css_selector


def main(html_content: str):
    # Call the extract_login_form function and return its result
    return extract_login_form(html_content)

간단하고 안정적인 API에서 이 모든 것을 원하신다면 제 새 제품인 https://www.scrapewebapp.com/을 사용해 보세요

이 글이 마음에 드셨다면 박수와 팔로우 부탁드립니다. 도움이 많이 되네요!

위 내용은 Selenium을 사용하여 로그인으로 보호된 웹사이트를 긁는 방법(단계별 가이드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.