본문 바로가기
공부/Data Analysis

[Python/crawling]BeautifulSoap를 활용한 크롤링 정리

by swon_98 2023. 8. 10.

0. 내가 요약한 프로세스


1. HTML 호출 : requests.get(url, headers)

  • library : requests
  • url에는 크롤링하고 싶은 페이지의 주소
  • headers : 대게 크롤링 요청이 정상적인지 확인하기 위해 사용된다.
headers = {
'referer' : 'https://www.naver.com',
'user-agent' : 'Mozilla/5.0 ~'
}
  • referer : 쉽게 생각하면 크롤링하고 싶은 사이트의 직전 사이트라고 생각하면 된다. 외부에서의 접속이 아니라 이전 사이트에서의 접속이라면 정상적으로 인지
  • HTML내용을 눈으로 보고 싶다면 .text를 활용

2. HTML 파싱 : BeautifulSoup(req.text, parser)

  • library : bs4
  • requests.get()으로 얻어온 HTML은 단순 텍스트 형태이기 때문에, 원하는 정보를 찾아내기 위해 BeautifulSoup 객체로 변환
  • parser는 데이터의 종류는 입력하면 된다. html이외에도 lxml, xml등이 가능하다. html일 경우 ‘html.parser`
from bs4 import BeautifulSoup as bs

soup = bs(req.text, 'html.parser')

print(type(soup))


3. 파싱한 데이터에서 태그 선택 및 데이터 추출 : find_all() find() pd.read_html select_one

  • find_all()과 find() 모두 동일한 인자를 가진다 : find_all(태그명, class_ = class명)
    • 두 가지의 차이점은 find_all()은 조건에 일치하는 태그를 모두 반환, find()는 조건에 맞는 가장 처음에 있는 태그를 반환
    • find_all()은 결과값을 리스트 형태로, find()는 결과 값을 태그 형태로 반환한다.
      • 따라서 find()를 통해 얻은 결과는 보통 find_all을 통해 다시 추출하는 편..
  • select_one()은 첫 번째로 마주치는 결과를 반환한다는 점에서 find()와 유사하지만, 태그를 입력할 때 XML문법을 사용한다는 것이 다릅니다.
    • XML태그 예시 : div.footer_inner>div.nbanner_area - 사진 맨 아래 확인

  • pd.read_html() 로 HTML 테이블을 파싱한 경우 반환 값은 DataFrame들로 구성된 list 이다. 따라서 그 안에서 슬라이싱을 통해 원하는 테이블을 골라서 써야한다.
    • 한글 테이블의 경우 encoding=”euc-kr”을 사용
# pd.read_html(~)리스트에서 1번째에 있는 데이터 프레임을 concat한 모습

df = pd.concat([df, pd.read_html(req.text, encoding = "euc-kr")[0]], ignore_index=True)

data = df.dropna().reset_index(drop=True)


4. 데이터 가공

  • 데이터 가공에서 사용하고자 하는 내용들은 pandas라이브러리 때 배운 내용이므로 생략.