페이지네이션(Pagination)이란?
- 많은 정보를
인덱스로 구분
하는 기법.- 우리가 흔히 아는
웹 페이지의 페이지 번호
를 말한다.- 대부분의 웹 페이지들이
URL?page={i}
로 URL 뒤에Query String
으로페이지 번호
를 보낸다.
질문 제목
들을 추출한다고 가정하였을 때 검사
혹은 개발자 도구(F12)
를 통해 질문 제목
의 위치를 파악한다.li
태그 중 question-list-item
이라는 class
에 포함되어 있는 것을 알 수 있으며 h4
의 context
임을 파악할 수 있다. 단 하나의 데이터
가 아닌 question-list-item
이라는 class
로 여러 개의 데이터
가 묶여 있음을 알 수 있다.find_all
을 통해 class
를 호출해 주고 그 안의 h4.text
추출해야 한다.user_agent
를 우리가 설정해서 보내 줄 수 있다.get
에 두 번째 인자로 user_agent
의 값을 보내 주면 된다.user_agent = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"}
import requests
from bs4 import BeautifulSoup
# 두 번째 인자로 들어가는 것은 header
res = requests.get("https://qna.programmers.co.kr/", user_agent)
context = BeautifulSoup(res.text, "html.parser")
태그 이름
으로만 데이터를 추출할 경우 웹 페이지에는 같은 태그 이름이 많기 때문에 잘못된 데이터가 추출될 수도 있다. class나 id명
을 사용하여 좀 더 정확한 데이터를 추출
할 수 있다.질문 제목 리스트
의 경우 li
태그의 question-list-item
이라는 class
에 존재한다.question-list-item
이라는 class
는 하나가 아니라 여러 질문이 존재하기 때문에 여러 개이고, 이때는 find_all
을 사용해야 한다.questions = context.find_all("li", "question-list-item") #먼저 find_all을 통해서 question-list-item의 리스트를 만들어 준다
for question in questions:
print(question.find("div", "question").find("div", "top").h4.text) #질문 목록의 제목만 추출해 줄 수 있도록 h4.text로 조회해 준다.
이 코드를 통해 우리는 .find("태그 이름", "클래스명")
을 내부를 타고, 타고 중첩적으로 가능하다는 것을 알 수 있다. 다만 .find_all
은 중첩적인 사용이 불가하다. .find_all
을 중첩적으로 사용할 경우, AttributeError
가 발생한다.
#output
질문 제목
을 호출하기 위해서는 특정 페이지
를 지정해 주어도 되고, 1페이지부터 5페이지
까지의 질문 제목을 추출하고 싶다면 for문
을 사용해 주면 된다.url
안에 ?page=i
라는 Query String
으로 페이지를 이동할 수 있다는 점을 이용한다.import time #인터벌 시간을 두기 위한 호출
for i in range(1, 6): # 1페이지부터 5페이지까지의 정보만
res = requests.get("https://qna.programmers.co.kr/?page={}".format(i), user_agent) #query string의 값을 for문을 통해 1부터 5까지 보내 준다.
soup = BeautifulSoup(res.text, "html.parser")
questions = soup.find_all("li", "question-list-item")
for question in questions:
print(question.find("div", "question").find("div", "top").h4.text)
time.sleep(0.5) #0.5초의 인터벌을 준다.
1페이지부터 5페이지까지의 질문 제목
이 추출된다.