Google의 “사람들이 또한 묻는 질문” 섹션 스크래핑 방법

Python을 사용하여 Google의 “사람들이 또한 묻는 질문” 섹션을 스크래핑하는 단계별 가이드.
6 분 읽기
How to Scrape Google's People Also Ask blog image

이 튜토리얼에서는 Google의 “사람들이 자주 묻는 질문” 섹션을 스크래핑하는 Python 스크립트 작성법을 배웁니다. 해당 섹션은 검색어와 관련된 자주 묻는 질문을 포함하며 유용한 정보를 제공합니다.

시작해 보겠습니다!

Google의 “사람들이 또한 묻는 질문” 기능 이해하기

사람들이 또한 묻는 질문“(PAA)은 Google검색 결과 페이지(SERP)에 표시되는 섹션으로, 검색어와 관련된 동적 질문 목록을 제공합니다:

이 섹션은 검색어와 관련된 주제를 더 깊이 탐색하는 데 도움을 줍니다. 2015년경 처음 출시된 PAA는 검색 결과 내에서 확장 가능한 일련의 질문 형태로 나타납니다. 질문을 클릭하면 관련 웹페이지에서 가져온 간략한 답변과 출처 링크가 표시됩니다:

Opening the people also asked fields

“사람들이 자주 묻는 질문” 섹션은 사용자 검색에 따라 지속적으로 업데이트되며 최신 관련 정보를 제공합니다. 드롭다운을 열 때마다 새로운 질문이 동적으로 로드됩니다.

Google ‘사람들이 또한 묻는 질문’ 스크래핑: 단계별 가이드

이 가이드 섹션을 따라 Python 스크립트를 구축하여 Google 검색 결과 페이지(SERP)에서 “사람들이 또한 묻는 질문”을 스크래핑하는 방법을 배워보세요.

최종 목표는 페이지의 “사람들이 또한 묻는 질문” 섹션에 포함된 각 질문의 데이터를 추출하는 것입니다. 구글 자체 스크래핑에 관심이 있다면SERP 스크래핑 튜토리얼을 참고하세요.

1단계: 프로젝트 설정

시작하기 전에 컴퓨터에 Python 3이 설치되어 있는지 확인하세요.설치되어 있지 않다면다운로드하여 실행 파일을 실행하고 설치 마법사를 따르세요.

다음으로 아래 명령어를 사용하여가상 환경이 포함된 Python 프로젝트를 초기화하세요:

mkdir people-also-ask-scraper
cd people-also-ask-scraper
python -m venv env

people-also-ask-scraper 디렉터리는 Python PAA 스크레이퍼의 프로젝트 폴더를 나타냅니다.

선호하는 Python IDE에서 프로젝트 폴더를 로드하세요.PyCharm Community Edition이나Python 확장 기능을 설치한 Visual Studio Code가훌륭한 선택지입니다.

프로젝트 폴더 내에 scraper.py 파일을 생성하세요. 현재는 빈 스크립트이지만 곧 스크래핑 로직이 포함될 것입니다:

the scraper.py file in the project folder

IDE 터미널에서 가상 환경을 활성화하세요. Linux 또는 macOS에서는 다음 명령어를 실행합니다:

./env/bin/activate

Windows에서는 다음 명령을 실행하세요:

env/Scripts/activate

자, 이제 스크레이퍼를 위한 Python 환경이 준비되었습니다!

2단계: 셀레니움 설치

Google은 사용자 상호작용이 필요한 플랫폼입니다. 또한 유효한 Google 검색 URL을 생성하는 것은 어려울 수 있습니다. 따라서 검색 엔진과 작업하는 가장 좋은 방법은 브라우저 내에서 수행하는 것입니다.

다시 말해, “사람들이 또한 묻는 질문” 섹션을 스크래핑하려면 브라우저 자동화 도구가 필요합니다. 이 개념이 생소하다면, 브라우저 자동화 도구는 제어 가능한 브라우저 내에서 웹 페이지를 렌더링하고 상호작용할 수 있게 해줍니다. Python에서 가장 좋은 옵션 중 하나는Selenium입니다!

활성화된 Python 가상 환경에서 아래 명령어를 실행하여 Selenium을 설치하세요:

pip install selenium

seleniumpip 패키지가 프로젝트 종속성에 추가됩니다. 시간이 다소 소요될 수 있으니 기다려 주세요.

이 도구 사용법에 대한 자세한 내용은Selenium을 활용한 웹 스크래핑 가이드를 참고하세요.

훌륭합니다! 이제 Google 페이지 스크래핑을 시작하는 데 필요한 모든 준비가 완료되었습니다!

3단계: Google 홈페이지로 이동하기

scraper.py에서 Selenium을 임포트하고 헤드리스 모드에서 Chrome 인스턴스를 제어할 WebDriver 객체를 초기화합니다:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# 헤드리스 모드에서 Chrome 창 제어
options = Options()
options.add_argument("--headless") # 개발 중에는 주석 처리

# 지정된 옵션으로 웹 드라이버 인스턴스 초기화
driver = webdriver.Chrome(
    service=Service(),
    options=options
)

위의 코드 조각은Chrome웹 드라이버인스턴스를 생성합니다. 이 객체는 프로그래밍 방식으로 Chrome 창을 제어합니다.--headless옵션은 Chrome이 헤드리스 모드로 실행되도록 구성합니다. 디버깅을 위해 해당 줄을 주석 처리하면 자동화된 스크립트의 동작을 실시간으로 관찰할 수 있습니다.

그런 다음get()메서드를 사용하여 Google 홈페이지에 연결합니다:

driver.get("https://google.com/")

스크립트 종료 시 드라이버 리소스를 반드시 해제하세요:

driver.quit()

모든 것을 합치면 다음과 같습니다:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# 헤드리스 모드에서 Chrome 창 제어
options = Options()
options.add_argument("--headless") # 개발 중에는 주석 처리

# 지정된 옵션으로 웹 드라이버 인스턴스 초기화
driver = webdriver.Chrome(
    service=Service(),
    options=options)


# Google 홈페이지에 연결
driver.get("https://google.com/")

# 스크래핑 로직...

# 브라우저 닫기 및 리소스 해제
driver.quit()

훌륭합니다! 이제동적 웹사이트 스크래핑을 시작할 준비가 되었습니다!

4단계: GDPR 쿠키 대화상자 처리

참고: EU(유럽 연합) 지역에 거주하지 않는 경우 이 단계를 건너뛸 수 있습니다.

scraper.py 스크립트를 헤더드 모드로 실행하세요. quit() 명령어가 창을 닫기 전에 Google 페이지가 표시된 Chrome 브라우저 창이 잠시 열립니다. EU에 거주하는 경우 다음과 같은 메시지가 표시됩니다:

The cookie policy for GDPR reasons (EU users)

“Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다.”라는 메시지는 Selenium이 Chrome을 정상적으로 제어하고 있음을 확인시켜 줍니다.

EU 사용자에게는 GDPR 규정으로 인해 쿠키 정책 대화상자가 표시됩니다. 해당되는 경우, 기본 페이지와 상호작용하려면 이 대화상자를 처리해야 합니다. 그렇지 않으면 5단계로 건너뛸 수 있습니다.

시크릿 모드로 Google 페이지를 열고 GDPR 쿠키 대화상자를 검사하세요. 대화상자를 마우스 오른쪽 버튼으로 클릭하고 “검사” 옵션을 선택하세요:

Inspecting the GDPR cookie

다음과 같이 대화상자 HTML 요소를 찾을 수 있습니다:

cookie_dialog = driver.find_element(By.CSS_SELECTOR, "[role='dialog']")

find_element()는 Selenium이 제공하는 메서드로, 다양한 전략을 통해 페이지의 HTML 요소를 찾을 수 있습니다. 이 경우CSS 선택자를 사용했습니다.

다음과 같이 By를 반드시 임포트하세요:

from selenium.webdriver.common.by import By

이제 “모두 수락” 버튼에 집중해 보겠습니다:

Inspecting the "Accept all" button

보시다시피, 해당 버튼의 CSS 클래스가 무작위로 생성된 것으로 보여 쉽게 선택할 방법이 없습니다. 따라서 콘텐츠를 대상으로 하는 XPath 표현식을 사용하여 가져올 수 있습니다:

accept_button = cookie_dialog.find_element(By.XPATH, "//button[contains(., 'Accept')]")

이 명령은 대화 상자에서 “Accept” 문자열을 포함하는 텍스트를 가진 첫 번째 버튼을 찾습니다. 자세한 내용은XPath 대 CSS 선택기 가이드를 참조하세요.

선택적 Google 쿠키 대화상자를 처리하기 위한 전체 구성은 다음과 같습니다:

try:
    # 대화상자 선택 및 쿠키 정책 수락
    cookie_dialog = driver.find_element(By.CSS_SELECTOR, "[role='dialog']")
    accept_button = cookie_dialog.find_element(By.XPATH, "//button[contains(., 'Accept')]")
    if accept_button is not None:
        accept_button.click()
except NoSuchElementException:
    print("쿠키 대화상자가 존재하지 않습니다")

click() 명령어는 “모두 수락” 버튼을 클릭하여 대화 상자를 닫고 사용자 상호작용을 허용합니다. 쿠키 정책 대화 상자가 존재하지 않으면 대신 NoSuchElementException이 발생합니다. 스크립트는 이를 포착하고 계속 진행합니다.

NoSuchElementException을 반드시 임포트하세요:

from selenium.common import NoSuchElementException

잘하셨습니다! 이제 “사람들이 또한 묻는 질문” 섹션이 있는 페이지로 이동할 준비가 되었습니다.

5단계: 검색 양식 제출

브라우저에서 Google 홈페이지로 이동하여 검색 양식을 검사하세요. 검색 양식을 마우스 오른쪽 버튼으로 클릭하고 “검사” 옵션을 선택하세요:

Inspecting the Google search form

이 요소는 CSS 클래스가 없지만, action 속성을 통해 선택할 수 있습니다:

search_form = driver.find_element(By.CSS_SELECTOR, "form[action='/search']")

4단계를 건너뛴 경우, By를 다음으로 임포트하세요:

from selenium.webdriver.common.by import By

폼의 HTML 코드를 확장하여 검색 텍스트 영역을 살펴보세요:

Looking at the textarea of the search bar

이 노드의 CSS 클래스는 무작위로 생성된 것으로 보입니다. 따라서aria-label속성을 통해 선택하세요. 그런 다음send_keys()메서드를 사용하여 대상 검색 쿼리를 입력하세요:

search_textarea = search_form.find_element(By.CSS_SELECTOR, "textarea[aria-label='Search']")
search_query = "Bright Data"
search_textarea.send_keys(search_query)

이 예시에서는 검색어가 “Bright Data”이지만, 다른 검색어도 가능합니다.

폼을 제출하여 페이지 변경을 트리거합니다:

search_form.submit()

훌륭합니다! 제어 중인 브라우저가 이제 “사람들이 또한 묻는 질문” 섹션이 포함된 Google 페이지로 리디렉션됩니다.

헤드드 모드에서 스크립트를 실행하면 브라우저가 닫히기 전에 다음과 같은 화면을 볼 수 있습니다:

executing the script in a headed mode

위 스크린샷 하단의 “사람들이 또한 묻는 질문” 섹션을 확인하세요.

6단계: “사람들이 또한 묻는 질문” 노드 선택

“사람들이 또한 묻습니다” HTML 요소를 검사하세요:

Inspecting the people also ask HTML element

다시 말하지만, 이를 선택하는 쉬운 방법은 없습니다. 이번에는 jscontroller, jsname, jsaction 속성을 가진 <div> 요소를 가져와서 role=heading 속성을 가진 “사람들이 또한 묻습니다” 텍스트가 포함된 div를 찾을 수 있습니다:

people_also_ask_div = WebDriverWait(driver, 5).until(
    EC.presence_of_element_located((
        By.XPATH, "//div[@jscontroller and @jsname and @jsaction][.//div[@role='heading' and contains(., 'People also ask')]]"
    ))
)

WebDriverWait는페이지에서 특정 조건이 충족될 때까지 스크립트를 일시 중지하는 Selenium의 특수 클래스입니다. 위 예제에서는 원하는 HTML 요소가 나타날 때까지 최대 5초 동안 대기합니다. 이는 양식 제출 후 페이지가 완전히 로드되도록 하기 위해 필요합니다.

presence_of_element_located() 내에서 사용된 XPath 표현식은 복잡하지만 “People also ask” 요소를 선택하는 데 필요한 기준을 정확히 설명합니다.

필요한 임포트 문장을 추가하는 것을 잊지 마세요:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

이제 Google의 “사람들이 또한 묻는 질문” 섹션에서 데이터를 스크래핑할 시간입니다!

7단계: “사람들이 또한 묻는 질문” 스크래핑

먼저, 스크랩된 데이터를 저장할 데이터 구조를 초기화합니다:

people_also_ask_questions = []

“사람들이 또한 묻는 질문” 섹션에는 여러 질문이 포함되어 있으므로 반드시 배열이어야 합니다.

이제 ‘사람들이 또한 묻습니다’ 노드의 첫 번째 질문 드롭다운을 살펴봅니다:

Inspecting the first question dropdown

여기서 관심 대상 요소는 “사람들이 또한 묻습니다” 요소 내부에 있는 data-sgrd="true" <div> 의 자식 요소들 중 jsname 속성만 있는 것들임을 확인할 수 있습니다. 마지막 두 자식 요소는 Google이 점유자로 사용하며 드롭다운을 열 때 동적으로 채워집니다.

다음 로직으로 질문 드롭다운을 선택하세요:

people_also_ask_inner_div = people_also_ask_div.find_element(By.CSS_SELECTOR, "[data-sgrd='true']")
people_also_ask_inner_div_children = people_also_ask_inner_div.find_elements(By.XPATH, "./*")
for child in people_also_ask_inner_div_children:
    # 현재 요소가 질문 드롭다운인 경우
    if child.get_attribute("jsname") is not None and child.get_attribute("class") == '':
        # 스크래핑 로직...

요소를 클릭하여 확장:

child.click() 

다음으로, 질문 요소 내부의 콘텐츠에 집중합니다:

Inspecting inside the question elements

질문은 aria-expanded="true" 노드 내부의 <span> 에 포함되어 있습니다. 다음과 같이 스크래핑하세요:

question_title_element = child.find_element(By.CSS_SELECTOR, "[aria-expanded='true'] span")
question_title = question_title_element.text

그런 다음 답변 요소를 검사하세요:

Inspecting the answer element

data-attrid="wa:/description" 요소 내 lang 속성을 가진 <span> 노드의 텍스트를 수집하여 추출하는 방법을 확인하세요:

question_description_element = child.find_element(By.CSS_SELECTOR, "[data-attrid='wa:/description'] span[lang]")
question_description = question_description_element.text

다음으로 답변 상자의 선택적 이미지를 검사합니다:

Inspecting the optional image in the answer box

data-ilt 속성이 있는 <img> 요소의 src 속성에 접근하여 URL을 얻을 수 있습니다:

try:
    question_image_element = child.find_element(By.CSS_SELECTOR, "img[data-ilt]")
    question_image = question_image_element.get_attribute("src")
except NoSuchElementException:
    question_image = None

이미지 요소는 선택 사항이므로 위 코드를try ... except블록으로 감싸야 합니다. 현재 문제에 해당 노드가 존재하지 않으면find_element()가NoSuchElementException을 발생시킵니다. 이 경우 코드가 예외를 처리하고 진행합니다.

4단계를 건너뛴 경우 예외를 임포트하세요:

from selenium.common import NoSuchElementException

마지막으로 소스 섹션을 검사하세요:

Inspecting the source section

<h3> 요소의 상위 <a> 요소를 선택하여 소스 URL을 얻을 수 있습니다:

question_source_element = child.find_element(By.XPATH, ".//h3/ancestor::a")
question_source = question_source_element.get_attribute("href")

스크랩한 데이터를 사용하여 새 객체를 생성하고 people_also_ask_questions 배열에 추가하세요:

people_also_ask_question = {
  "title": question_title,
  "description": question_description,
  "image": question_image,
  "source": question_source
}
people_also_ask_questions.append(people_also_ask_question)

잘하셨습니다! 방금 Google 페이지에서 “사람들이 또한 묻는 질문” 섹션을 스크랩했습니다.

8단계: 스크랩한 데이터를 CSV로 내보내기

people_also_ask_questions를 출력하면 다음과 같은 결과가 표시됩니다:

[{'title': 'Bright Data는 합법적인가요?', 'description': 'Bright Data의 고속 주거용 프록시는 주거용 프록시 네트워크의 업계 표준입니다. 이 네트워크를 통해 사용자는 모든 도시, 국가, 통신사 또는 ASN을 대상으로 제한 및 차단을 우회할 수 있습니다. 합법적으로 획득한 400M+ monthly개의 IP 주소와 99.99%의 가동률을 자랑하므로 신뢰할 수 있습니다.', 'image': 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSU5S3mnWcZeQPc2KOCp55dz1zrSX4I2WvV_vJxmvf9&s', 'source': 'https://www.linkedin.com/pulse/bright-data-review-legit-scam-everything-you-need-know-bloggrand-tiakc#:~:text=Bright Data의 고속 주거용 프록시는,99.99%의 가동률을 자랑합니다.'}, {'title': 'Bright Data는 무엇에 사용되나요?', 'description': "Bright Data는 세계 최고의 웹 데이터 플랫폼으로, 거의 모든 산업 분야의 22,000개 이상의 조직이 공공 데이터 요구를 충족하도록 지원합니다. 당사의 솔루션을 통해 조직은 웹 데이터를 연구, 모니터링 및 분석하여 더 나은 의사 결정을 내릴 수 있습니다.", 'image': None, 'source': "https://brightdata.com/about#:~:text=Bright%20Data%20is%20the%20world's,data%20to%20make%20better%20decisions."}, {'title': 'Bright Data는 합법적인가요?', 'description': "Bright Data의 플랫폼, 기술 및 네트워크(총칭하여 "서비스")는 합법적이고 정당한 목적으로만 사용되며 Bright Data 마스터 서비스 계약의 적용을 받습니다.", 'image': None, 'source': "https://brightdata.com/acceptable-use-policy#:~:text=Bright%20Data's%20platform%2C%20technology%2C%20and,Bright%20Data%20Master%20Service%20Agreement."}, {'title': 'Bright Data는 무료인가요?', 'description': 'Bright Data는 다양한 요구를 충족시키기 위해 네 가지 무료 프록시 솔루션을 제공합니다: 익명 프록시: 이 최고 성능의 익명 프록시를 사용하면 방대한 주거용 IP 네트워크(400M+ monthly개의 IP)를 통해 트래픽을 라우팅하여 진정한 위치를 숨기면서 웹사이트에 익명으로 접근할 수 있습니다.', 'image': None, 'source': 'https://brightdata.com/solutions/free-proxies#:~:text=Bright%20Data%20offers%20four%20free,IPs%2C%20concealing%20your%20true%20location.'}]

물론, 이건 훌륭하지만 다른 팀원들과 쉽게 공유할 수 있는 형식이라면 훨씬 더 좋을 것입니다. 따라서 people_also_ask_questions를 CSV 파일로 내보내세요!

파이썬 표준 라이브러리에서csv패키지를 임포트하세요:

import csv

다음으로, 이 패키지를 사용해 SERP 데이터를 출력 CSV 파일에 채웁니다:

csv_file = "people_also_ask.csv"
header = ["title", "description", "image", "source"]
with open(csv_file, "w", newline="", encoding="utf-8") as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=header)
    writer.writeheader()
    writer.writerows(people_also_ask_questions)

드디어! “사람들이 또한 묻는 질문” 스크래핑 스크립트가 완성되었습니다.

9단계: 모든 것을 합치기

최종 scraper.py 스크립트에는 다음 코드가 포함되어야 합니다:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.common import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import csv

# 헤드리스 모드에서 Chrome 창 제어
options = Options()
options.add_argument("--headless") # 개발 중에는 주석 처리

# 지정된 옵션으로 웹 드라이버 인스턴스 초기화
driver = webdriver.Chrome(
    service=Service(),
    options=options
)

# Google 홈페이지에 접속
driver.get("https://google.com/")

# 선택적 Google 쿠키 GDPR 대화상자 처리
try:
    # 대화상자 선택 및 쿠키 정책 수락
    cookie_dialog = driver.find_element(By.CSS_SELECTOR, "[role='dialog']")
    accept_button = cookie_dialog.find_element(By.XPATH, "//button[contains(., 'Accept')]")
    if accept_button is not None:
        accept_button.click()
except NoSuchElementException:
    print("쿠키 대화상자가 존재하지 않음")

# 검색 양식 선택
search_form = driver.find_element(By.CSS_SELECTOR, "form[action='/search']")

# 텍스트 에리어 선택 및 입력
search_textarea = search_form.find_element(By.CSS_SELECTOR, "textarea[aria-label='Search']")
search_query = "Bright Data"
search_textarea.send_keys(search_query)

# Google 검색을 수행하기 위해 양식 제출
search_form.submit()

# 페이지 변경 후 "People also ask" 섹션이 페이지에 표시될 때까지 최대 5초 대기
# 페이지 변경 후 해당 섹션이 페이지에 표시될 때까지
people_also_ask_div = WebDriverWait(driver, 5).until(
    EC.presence_of_element_located((
        By.XPATH, "//div[@jscontroller and @jsname and @jsaction][.//div[@role='heading' and contains(., 'People also ask')]]"
    )))


# 스크랩된 데이터를 저장할 위치
people_also_ask_questions = []

# 질문 드롭다운 선택 및 반복 처리
people_also_ask_inner_div = people_also_ask_div.find_element(By.CSS_SELECTOR, "[data-sgrd='true']")
people_also_ask_inner_div_children = people_also_ask_inner_div.find_elements(By.XPATH, "./*")
for child in people_also_ask_inner_div_children:
    # 현재 요소가 질문 드롭다운인 경우
    if child.get_attribute("jsname") is not None and child.get_attribute("class") == '':
        # 요소를 확장
        child.click()

        # 스크래핑 로직
        question_title_element = child.find_element(By.CSS_SELECTOR, "[aria-expanded='true'] span")
        question_title = question_title_element.text

        question_description_element = child.find_element(By.CSS_SELECTOR, "[data-attrid='wa:/description'] span[lang]")
        question_description = question_description_element.text

        try:
            question_image_element = child.find_element(By.CSS_SELECTOR, "img[data-ilt]")
            question_image = question_image_element.get_attribute("src")
        except NoSuchElementException:
            question_image = None

        question_source_element = child.find_element(By.XPATH, ".//h3/ancestor::a")
        question_source = question_source_element.get_attribute("href")

        # 스크랩한 데이터로 배열 채우기
        people_also_ask_question = {
          "title": question_title,
          "description": question_description,
          "image": question_image,
          "source": question_source
        }
        people_also_ask_questions.append(people_also_ask_question)

# 스크랩한 데이터를 CSV 파일로 내보내기
csv_file = "people_also_ask.csv"
header = ["title", "description", "image", "source"]
with open(csv_file, "w", newline="", encoding="utf-8") as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=header)
    writer.writeheader()
    writer.writerows(people_also_ask_questions)

# 브라우저 종료 및 리소스 해제
driver.quit()

100줄의 코드로 PAA 스크레이퍼를 완성했습니다!

실행하여 작동하는지 확인하세요. Windows에서는 스크레이퍼를 다음과 같이 실행합니다:

python scraper.py

또는 Linux 또는 macOS에서는 다음 명령을 실행하세요:

python3 scraper.py

스크레이퍼 실행이 완료될 때까지 기다리면 프로젝트 루트 디렉터리에 people_also_ask.csv 파일이 생성됩니다. 파일을 열면 다음과 같은 내용을 확인할 수 있습니다:

Example of a CSV file including the scraped people also ask data

축하합니다, 미션 완료!

결론

이 튜토리얼에서는 Google 페이지의 “People Also Ask” 섹션이 무엇인지, 그 안에 포함된 데이터, 그리고 Python을 사용하여 이를 스크래핑하는 방법을 배웠습니다. 여기서 배운 것처럼, 간단한 스크립트를 작성하여 자동으로 데이터를 가져오는 데는 Python 코드 몇 줄만으로도 충분합니다.

제시된 솔루션은 소규모 프로젝트에는 효과적이지만 대규모 스크래핑에는 실용적이지 않습니다. 문제는 구글이 업계 최고 수준의 반봇 기술을 보유하고 있다는 점입니다. 따라서 CAPTCHA나 IP 차단으로 접근이 차단될 수 있습니다. 또한 이 프로세스를 여러 페이지로 확장하면 인프라 비용이 증가합니다.

그렇다면 Google을 효율적이고 안정적으로 스크래핑하는 것이 불가능하다는 뜻일까요? 전혀 아닙니다!Bright Data의 Google Search API와 같이 이러한 문제를 해결하는 고급 솔루션이 필요할 뿐입니다.

Google Search API는 ‘사람들이 또한 묻는 질문’ 섹션을 포함한 Google SERP 페이지의 데이터를 가져올 수 있는 엔드포인트를 제공합니다. 간단한 API 호출만으로 원하는 데이터를 JSON 또는 HTML 형식으로 얻을 수 있습니다.공식 문서에서 시작하는 방법을 확인하세요.

지금 가입하고 무료 체험을 시작하세요!