웹사이트에서 데이터를 수집하는 것은 단순히 콘텐츠만 수집하는 것이 아니라 많은 작업이 필요합니다. 제한, 공백 및 기타 정교한 차단을 우회하기 위해서는 Python 데이터 스크래핑과 같은 다양한 추가 방법을 사용해야 합니다.
이 글에서는 Python 스크래핑이 무엇인지 정의하고, 왜 이 도구가 작업에 최적의 도구인지 그 이유를 설명합니다. 또한 Python 데이터 스크래핑 기능을 활용하는 전술에 대해서도 간략하게 설명합니다. 이 모든 것이 가장 안전한 사이트에서도 정보를 검색하는 데 도움이 될 것입니다.
이 도구는 웹사이트에서 데이터를 수집하기 위한 훌륭한 리소스 역할을 하도록 특별히 설계되었습니다. 사용성 외에도 스크랩, 셀레늄, 뷰티풀수프와 같은 Python의 라이브러리는 놀라울 정도로 강력합니다. 그 외에도 스크립트를 계속 개발하고 새로운 사용자에게 지원을 제공하는 활발한 신규 커뮤니티가 있습니다. 이것이 바로 요즘 웹 스크래핑에 Python이 사용되는 이유입니다. 따라서 현재 사용 가능한 주요 전략을 강조해 보겠습니다.
이 블록은 사용자에게 Python에 내장된 보다 정교한 기술을 사용하여 복잡한 웹사이트를 스크랩하는 방법을 보여줍니다. 사용자는 방법을 배우게 됩니다:
이러한 접근 방식은 서버에서 차단되거나 액세스가 거부될 가능성을 최소화하면서 Python 데이터 스크래핑을 효과적으로 수행하는 데 도움이 됩니다.
이제 Python에서 스크래핑을 효과적으로 수행하는 방법에 대해 알아보겠습니다.
수많은 웹사이트가 의도적으로 데이터를 스크랩하는 사람들로부터 정보를 보호하기 위해 캡차 보안 시스템을 도입하여 훌륭한 방어선을 구축하고 있습니다. 이러한 시스템은 2Captcha 또는 안티 캡차 같은 자동 인식 서비스를 사용하거나 머신 러닝을 사용하여 이미지를 인지적으로 식별하는 등 다양한 방법으로 우회할 수 있습니다. 또 다른 가능성은 법원이 정보 수집을 예상하지 않는 수준으로 쿼리 양을 줄이는 것입니다.
쿼리를 덜 적대적으로 만들려면 사용자가 정상적인 행동에 더 가까운 방식으로 행동해야 합니다. 작업 사이에 임의의 타이밍을 도입하고, 사용자-에이전트 전환, 페이지 스크롤, 마우스 포인터 이동, 쓰기 시뮬레이션 등을 할 수 있습니다. Python 스크래핑 도구로 Selenium 또는 Playwright를 사용하면 자동화에 훨씬 더 인간과 유사한 기능을 제공하므로 블록을 피할 수 있습니다.
import random
import requests
url = 'https://google.com'
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'dnt': '1',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
}
headers['user-agent'] = random.choice(user_agents)
response = requests.get(url=url, headers=headers)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 그래픽 인터페이스 없이 브라우저 실행
driver = webdriver.Chrome(options=options)
driver.get("https://google.com")
# XPath로 요소 찾기
element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
# ActionChains을 사용하여 커서 이동
actions = ActionChains(driver)
actions.move_to_element(element).perform()
# 브라우저를 닫습니다
driver.quit()
특정 웹사이트에는 일반 사용자에게는 보이지 않는 추가 요소가 포함되어 있지만 봇이 실수로 이러한 요소를 트리거할 수 있습니다. 이러한 요소에는 숨겨진 양식이 포함되며, 이를 클릭하고 제출하면 사이트에서 봇의 접근을 차단합니다. 데이터를 수집하기 전에 표시: 없음 또는 불투명도: 0과 같은 CSS 스타일 및 속성을 활용하고 이러한 스타일을 사용하지 마세요.
올바른 쿠키나 세션 구성 없이 요청을 하면 특정 사이트에서는 너무 단순한 요청으로 간주하여 반복 요청을 차단합니다. 이 문제를 해결하려면 요청.세션()을 사용하고, 저장된 쿠키를 활용하고, 실제 사용자처럼 행동하세요. 봇이 인식할 수 있도록 User-Agent 헤더를 변경하는 것도 필요합니다.
서버가 응답하지 않거나 일시적으로 오류를 반환하는 경우, 명령을 반복하기 전에 잠시 멈추고 다시 시도하세요. 기하급수적 백오프가 더 바람직하며, 이는 실패할 때마다 대기 시간을 늘리는 것을 의미합니다. 예를 들어 1초, 2초, 4초 등으로 대기 시간을 늘릴 수 있습니다. 이렇게 하면 차단될 가능성이 줄어드는 동시에 웹사이트 제한을 최소화하고 Python을 사용한 데이터 스크래핑 작업량을 줄일 수 있습니다.
import time
import requests
def fetch_with_backoff(url, max_retries=5):
retries = 0
wait_time = 1 # 1초 지연
while retries < max_retries:
try:
response = requests.get(url)
# 요청이 성공하면 결과를 반환합니다
if response.status_code == 200:
return response.text
print(f"Error {response.status_code}. Retrying in {wait_time} sec.")
except requests.exceptions.RequestException as e:
print(f"Connection error: {e}. Retrying in {wait_time} sec.")
# 다시 시도하기 전에 기다리기
time.sleep(wait_time)
# 지연 시간 늘리기
wait_time *= 2
retries += 1
return None
url = "https://google.com"
html = fetch_with_backoff(url)
일부 웹사이트는 콘텐츠를 단계적으로 로드하거나 사용자의 일부 입력을 받아야만 작동할 수 있습니다. 이러한 경우 BeautifulSoup과 같은 라이브러리는 도움이 되지 않을 수 있습니다. 이 경우 Selenium, Puppeteer, Playwright를 사용한 웹 스크래핑이 도움이 될 것입니다. 이러한 라이브러리를 사용하면 일반 사용자처럼 페이지를 열 수 있으므로 버튼을 클릭하고 텍스트를 입력하는 등 페이지의 요소에 참여할 수 있습니다.
사용자가 웹페이지에 액세스할 때까지 자바스크립트를 사용하여 데이터를 표시하지 않는 웹페이지가 있습니다. 이 경우 표준 HTTP 요청이 필요한 모든 정보를 가져오지 못합니다. 셀레늄을 사용하여 이러한 정보를 수집하거나 브라우저 개발자 도구를 사용하여 네트워크 요청을 면밀히 조사할 수 있습니다. 이렇게 하면 숨겨진 API 엔드포인트를 탐지하는 데 도움이 되며, 나중에 번거로움을 최소화하면서 정보를 검색하는 데 활용할 수 있습니다.
압도적인 대다수의 웹사이트는 추가 처리를 위해 자동화된 요청을 서버로 전달합니다. 일부 웹사이트에서는 자동화된 요청을 구별하기 위한 수단으로 TLS 지문을 확인하는 것으로 잘 알려져 있습니다. 즉, 서버는 기술, 암호 및 기타 정교한 연결을 사용하여 TLS/SSL 주의도와 같은 다양한 연결 속성을 연구합니다. 사용자 정의 헤더와 프록시를 활용하여 요청에 연결 속성을 혼합하면 이를 달성할 수 있습니다.
import requests
url = 'username:password@your-proxy'
proxy = 'your-proxy'
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}",
}
response = requests.get(url=url, proxies=proxies)
웹사이트가 공개 API를 제공하는 경우 스크래핑에 의존하지 말고 이를 사용하는 것이 좋습니다. 이 접근 방식은 더 빠르고 안정적이며 차단될 가능성이 적습니다. API 엔드포인트를 찾기 위한 좋은 출발점은 웹사이트의 요청을 확인하는 것이며, 이는 개발자 도구에서 확인할 수 있습니다. API가 없는 경우 HTML 코드로 작업해야 합니다.
웹사이트는 코드를 수정하여 스크래핑을 지연시킬 수 있습니다. 이에 대한 대응책으로 다음을 고려하세요:
경우에 따라 웹사이트에서 Python으로 웹 스크래핑을 하는 것은 이용약관을 위반하거나 특정 관할권에서는 불법으로 간주될 수 있습니다. 데이터를 스크랩하기 전에 robots.txt와 서비스 약관을 사이트 정책과 함께 검토하는 것이 중요합니다. 또한 공개 API를 사용할 수 있는 경우 이를 사용하는 것이 가장 좋습니다. 또한 서버의 부담을 최소화하기 위해 요청 횟수에 제한을 설정하세요.
Python을 사용한 고급 웹 스크래핑은 그 자체로도 장점이 있지만, 올바른 방법으로 수행하는 것도 마찬가지로 중요합니다. 이러한 프로세스의 중요한 측면인 캡차 우회, 사용자 작업 시뮬레이션, 쿠키 및 세션 관리, 허니팟 처리, 비동기 웹 애플리케이션의 데이터 검사에 대해 논의했습니다.
또한 도덕적 측면과 사용 사이트의 관련 계약도 염두에 두세요. 가능한 경우 API 엔드포인트를 활용하고, HTML 구문 분석이 불가피한 경우 모든 가이드라인을 준수하여 차단 및 법적 문제가 발생할 가능성을 줄이세요.
이 웹 스크래핑 튜토리얼 방법을 Python과 함께 사용하면 잠재적인 위험은 크게 줄이고 효율성은 최대로 높일 수 있습니다.
댓글: 0