면책조항: https://www.scrapewebapp.com/에서 이 특정 사용 사례에 대한 API를 구축했습니다. 따라서 빨리 끝내고 싶다면 사용하고, 아니면 계속 읽어보세요.
이 예를 사용하겠습니다. https://www.scrapewebapp.com/의 내 계정에서 내 API 키를 스크랩하고 싶다고 가정해 보겠습니다. 이 페이지에 있습니다: https://app.scrapewebapp.com/account/api_key
먼저 로그인 페이지를 찾아야 합니다. 대부분의 웹사이트는 로그인 뒤의 페이지에 접근하려고 하면 리디렉션 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()
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(드라이버)
이 부분에서는 간단한 라이브러리 요청을 사용하지만 셀레늄을 계속 사용해도 됩니다.
이제 다음 페이지에서 실제 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}")
원하는 페이지 텍스트를 얻었지만 신경 쓰지 않는 데이터가 많습니다. 우리는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!