인프런 커뮤니티 질문&답변

Ambition님의 프로필 이미지
Ambition

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 기본편

requests, Beautifulsoup4 사용법 빠르게 알아보기

과제 답안을 보지않고 스스로 구글링해서 만든 웹 크롤링 프로그램(10페이지 단위) 코드입니다.

작성

·

578

0

import requests
from bs4 import BeautifulSoup
import urllib  # 입력받은 input을 url로 변환

def web_crawler(keyword_input, pages=1):
    # headers
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }

    # input -> url 변환
    keyword = urllib.parse.quote(keyword_input)
    print("파이썬 문자열을 url 코드로 변환:", keyword)

    base_url = "https://www.google.com/"

    # 10페이지까지 크롤링
    for page in range(pages):
        start = page * 10
        search_url = f"{base_url}/search?q={keyword}&hl=ko&gl=KR&ceid=KR%3Ako&start={start}"
    
    print("\n검색어와 조합한 url:", search_url)

    # soup을 이용한 웹 크롤링 작업(headers 매핑 중요!)
    response = requests.get(search_url, headers=headers)
    html = response.text

    # 응답 상태 확인
    if response.status_code == 200:
        soup = BeautifulSoup(html, "html.parser")

        # h3 제목 추출
        titles = soup.find_all("h3")
        for title in titles:
            print(title.get_text())
    else:
        print("에러:", response.status_code)


web_crawler("크롤링 잘하고 싶다", 1)

아무래도 구글은 무한스크롤 형식이라 페이지 별로 크롤링하기가 까다롭네요

답변 2

0

import requests
from bs4 import BeautifulSoup
import pyautogui

keyword = pyautogui.prompt("검색어를 입력하세요>>>")
lastpage = pyautogui.prompt("마지막 페이지 번호를 입력해 주세요")
pageNum = 1
for i in range(1,int(lastpage)*10,10):
	print(f"{pageNum}페이지 입니다.=====================")
	response= requests.get(f"https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query={keyword}&start={i}")
	html = response.text
	
	soup = BeautifulSoup(html, 'html.parser')
	links = soup.select(".news_tit")
	
	for link in links:
		title = link.text
		url = link.attrs['href']
		print(title,url)
		pageNum = pageNum+1

위와 같이 코드를 실행시키니, 저는 10페이지까지 크롤링하고 싶은데 1,11,21,31---91페이지 이런식으로 가져와집니다. 뭐가 문제일까요?

Ambition님의 프로필 이미지
Ambition
질문자

파이썬의 range 함수는 다음과 같이 range(start, end, step)로 실행하는데요, 10페이지까지 크롤링하고 싶으시면 단순하게 range(1, int(lastpage))+1)이라고 하시면 됩니다.

0

안녕하세요, 인프런 AI 인턴입니다.

Ambition님의 웹 크롤링 프로그램 코드 공유 감사합니다. 파이썬과 BeautifulSoup을 이용한 기본적인 크롤링 방법을 잘 구현해주셨네요. 구글 검색 결과의 무한 스크롤 특성상 정확히 10페이지 단위로 정보를 가져오는 것에 제약이 있을 수 있습니다. 실제로 페이지 파라미터인 start를 조절하여 크롤링을 시도하는 방식은 정상적인 사용 행태와 다를 수 있으며, 구글의 경우 잦은 요청이나 비정상적인 접근 패턴을 보이는 크롤링을 막기 위한 여러 방어 메커니즘이 있어 이를 고려한 접근이 필요합니다.

또한, 웹 서버에 과도한 요청을 보내는 웹 크롤링은 해당 서버에 부담을 줄 수 있으며, 이는 웹사이트의 이용 약관을 위반할 수도 있습니다. 개발하신 웹 크롤러를 사용할 때는 해당 사이트의 robots.txt 파일을 참고하시어 크롤링 허용 범위를 확인하는 것이 중요합니다.

추가적으로, 크롤링 시에는 대상 웹사이트의 서버 부하를 고려하여 적절한 지연 시간(delay)을 두는 것이 좋으며, 필요에 따라 User-Agent를 설정하는 것 외에도 쿠키나 세션을 관리해야 할 수도 있습니다.

크롤링 관련하여 더 깊이있는 이해를 원하시면, 인프런에서 제공하는 데이터 수집 및 처리 관련 강의를 추천받거나, 로드맵을 통해 체계적으로 학습 계획을 세워보시는 것도 좋은 방법입니다. 필요하신 경우 아래 링크를 이용하여 관련 정보를 확인하실 수 있습니다.

추가적인 질문이나 문의가 있으시면 인프런 홈페이지 내의 문의하기 기능을 통해 직접 문의하시면 됩니다.

Ambition님의 프로필 이미지
Ambition

작성한 질문수

질문하기