Heim >Backend-Entwicklung >Python-Tutorial >So entfernen Sie durch Login geschützte Websites mit Selenium (Schritt-für-Schritt-Anleitung)

So entfernen Sie durch Login geschützte Websites mit Selenium (Schritt-für-Schritt-Anleitung)

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 10:34:30740Durchsuche

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

Meine Schritte zum Scrapen einer passwortgeschützten Website:

  1. Erfassen Sie die HTML-Formularelemente: Benutzername-ID, Passwort-ID und Anmeldeschaltflächenklasse
  2. - Verwenden Sie ein Tool wie Requests oder Selenium, um die Anmeldung zu automatisieren: Geben Sie den Benutzernamen ein, warten Sie, geben Sie das Passwort ein, warten Sie, klicken Sie auf „Anmelden“
  3. - Sitzungscookies zur Authentifizierung speichern
  4. - Fahren Sie mit dem Scrapen der authentifizierten Seiten fort

Haftungsausschluss: Ich habe eine API für diesen speziellen Anwendungsfall unter https://www.scrapewebapp.com/ erstellt. Wenn Sie es also einfach schnell erledigen möchten, verwenden Sie es, andernfalls lesen Sie weiter.

Lassen Sie uns dieses Beispiel verwenden: Nehmen wir an, ich möchte meinen eigenen API-Schlüssel von meinem Konto unter https://www.scrapewebapp.com/ entfernen. Es befindet sich auf dieser Seite: https://app.scrapewebapp.com/account/api_key

1. Die Anmeldeseite

Zuerst müssen Sie die Anmeldeseite finden. Die meisten Websites geben Ihnen eine Weiterleitung 303, wenn Sie versuchen, auf eine Seite hinter der Anmeldung zuzugreifen. Wenn Sie also versuchen, direkt https://app.scrapewebapp.com/account/api_key zu scrapen, erhalten Sie automatisch die Anmeldeseite https:// app.scrapewebapp.com/login. Dies ist also eine gute Möglichkeit, das Auffinden der Anmeldeseite zu automatisieren, sofern diese noch nicht vorhanden ist.

Ok, jetzt, da wir die Anmeldeseite haben, müssen wir den Ort finden, an dem wir Benutzernamen oder E-Mail sowie ein Passwort und die eigentliche Anmeldeschaltfläche hinzufügen können. Am besten erstellen Sie ein einfaches Skript, das die ID der Eingaben anhand ihres Typs „E-Mail“, „Benutzername“, „Passwort“ und die Schaltfläche mit dem Typ „Senden“ findet. Ich habe unten einen Code für Sie erstellt:

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 verwenden, um sich tatsächlich anzumelden

Jetzt müssen Sie einen Selenium-Webtreiber erstellen. Wir werden Chrome Headless verwenden, um es mit Python auszuführen. So installieren Sie es:

# 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')

Dann loggen Sie sich dann tatsächlich auf unserer Website ein und speichern Sie die Cookies. Wir speichern alle Cookies, aber Sie können die Authentifizierungscookies nur speichern, wenn Sie möchten.

# 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. Cookies speichern

Es ist so einfach wie das Speichern in einem Wörterbuch über die Funktion „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

Speichern Sie die Cookies vom WebDriver

cookies = save_cookies(driver)

4. Holen Sie sich Daten aus unserer angemeldeten Sitzung

In diesem Teil verwenden wir die einfachen Bibliotheksanfragen, Sie können aber auch weiterhin Selenium verwenden.

Jetzt wollen wir die eigentliche API von dieser Seite erhalten: https://app.scrapewebapp.com/account/api_key.

Also erstellen wir eine Sitzung aus der Anforderungsbibliothek und fügen jedes Cookie hinzu. Fordern Sie dann die URL an und drucken Sie den Antworttext aus.

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. Erhalten Sie die tatsächlich gewünschten Daten (BONUS)

Wir haben den Seitentext erhalten, den wir wollten, aber es gibt viele Daten, die uns egal sind. Wir wollen nur den api_key.

Der beste und einfachste Weg, dies zu tun, ist die Verwendung von KI wie ChatGPT (GPT4o-Modell).

Fordern Sie das Modell wie folgt auf: „Sie sind ein erfahrener Scraper und werden nur die angeforderten Informationen aus dem Kontext extrahieren. Ich benötige den Wert meines API-Schlüssels von {context}“

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)

Wenn Sie all das in einer einfachen und zuverlässigen API wünschen, probieren Sie bitte mein neues Produkt https://www.scrapewebapp.com/ aus.

Wenn Ihnen dieser Beitrag gefällt, klatschen Sie mir bitte und folgen Sie mir. Es hilft sehr!

Das obige ist der detaillierte Inhalt vonSo entfernen Sie durch Login geschützte Websites mit Selenium (Schritt-für-Schritt-Anleitung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn