IT Cookie

Web Crawling 기초 본문

SW/Python

Web Crawling 기초

ahhyeon 2023. 3. 13. 21:01

1. 크롤링(Crawling)이란?

크롤링을 하려면 남들이 만들어놓은 라이브러리를 사용해야한다.
이것을 파이썬에서는 패키지라고 부름
즉, 패키지 설치는 외부 라이브러리를 설치한다는 뜻을 의미한다.

 

  • 웹사이트에서 원하는 정보를 수집하는 기술
  • 웹페이지를 가져와서, 웹페이지를 구성하는 HTML / CSS 코드를 파싱하고, 필요한 데이터만 추출함
파싱(parsing) : 데이터를 분해, 분석해서 원하는 형태로 조립하고 다시 빼내는 것

2. 라이브러리 사용

  • import 라이브러리명을 코드 최상단에 적을 것
import requests
  • import 후, 해당 라이브러리 안에 있는 함수는 라이브러리명.함수명 으로 호출
  • 라이브러리 내의 특정 함수만 다음과 같이 import 할 수 있다.
    • 이때는, 해당 함수명으로만 호출하면 됨
from bs4 import BeautifulSoup

3. 웹 크롤링 세팅

1) 웹페이지 가져오기

네이버 영화 페이지(2023.03.12)
 

랭킹 : 네이버 영화

영화, 영화인, 예매, 박스오피스 랭킹 정보 제공

movie.naver.com

  • data = requests.get(주소)
    • 변수에 가져온 웹페이지가 저장됨
    • 변수 이름은 data로 정함
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?
sel=pnt&date=20230312',headers=headers)

 

TIP. 서버에서 제대로된 html 정보를 주지 않을때(접속 차단) 해결하는 방법

  • Naver 크롤링을 진행할때 자주 나오는 오류
  • headers 정보에 User-Agent 를 넣어줄 것!
헤더(header)
접속하는 사람/프로그램에 대한 정보를 가짐.
정보는 한 가지 항목이 아닌 여러가지 항목이 들어갈 수 있기에 복수형태로 headers 로 입력
크롬 브라우저로 지정
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

2) 웹페이지 파싱하기(분석)

  • 웹페이지의 HTML / CSS 언어를 분석해서 구조화
    • data에 웹페이지 객체가 저장, 웹페이지 데이터를 data.text에 내부변수에서 불러옴
    • data에서 받은 HTML 문서를 text(문자열) 형식으로 반환
      • 파이썬이 읽을 수 있는 태그 기반 html 구조로 변환
soup = BeautifulSoup(data.text, 'html.parser')

3) 원하는 데이터 선택하기

  • 웹페이지가 HTML / CSS로 구성, CSS Selector 문법으로 필요한 데이터를 선택
태그 안의 텍스트를 찍고 싶을 땐 → 태그.text
태그 안의 속성을 찍고 싶을 땐 → 태그['속성']

 

  • soup.select() 함수를 사용해서 해당데이터를 리스트 형태로 가져옴
  • 반복문으로 추출하고 rank, title, star 로 실제 데이터를 가져올 수 있다
BeautifulSoup 내 select에 미리 정의된 다른방법

 

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')​
크롬 개발자도구를 참고하기
  • 원하는 부분에서 마우스 오른쪽 클릭
  • 검사 원하는 태그에서 마우스 오른쪽 클릭 Copy
  • Copy selector로 선택자를 복사할 수 있음

# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies (tr들) 의 반복문을 돌리기
for movie in movies:
    # movie 안에 a 가 있으면,
    a = movie.select_one('td.title > div > a')
    if a is not None:
        # a의 text를 찍어봄
        title = a.text
        # 한 개만 가져오고 싶은 경우
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text
        
        print(rank, title, star)

4) 완성

[코드]

import requests
from bs4 import BeautifulSoup

# URL을 읽어서 HTML를 받아오기
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20230312',headers=headers)

# 웹페이지 파싱하기
soup = BeautifulSoup(data.text, 'html.parser')

# select 이용, tr들 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies(tr들)의 반복문
for movie in movies:
    a = movie.select_one('td.title > div > a')
    if a is not None:
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text
        
        print(rank, title, star)

 

 

 

 

 

 

'SW > Python' 카테고리의 다른 글

가상환경 Virtualenv  (1) 2023.03.13
Web Crawling 활용  (0) 2023.03.13
[Python 문법] 함수  (0) 2023.03.07
[Python 문법] 반복문  (0) 2023.03.07
[Python 문법] 조건문  (0) 2023.03.07
Comments