Heim >Backend-Entwicklung >Python-Tutorial >So entfernen Sie durch Login geschützte Websites mit Selenium (Schritt-für-Schritt-Anleitung)
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
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()
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)
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}")
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!