IT Cookie
Web Crawling 기초 본문
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