728x90
반응형
1. beautifulsoup4 패키지 설치 및 크롤링 기본 셋팅
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.nhn?sel=pnt&date=20200303',headers=headers)
# HTML을 BeautifulSoup 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
soup = BeautifulSoup(data.text, 'html.parser')
2. select와 select_one
- select는 결과값이 리스트 형태로 저장되고, select_one은 리스트가 아닌 하나의 값을 가져온다.
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')
* 크롬의 개발자 도구를 활용하기!! 원하는 부분에서 오른쪽 마우스 클릭 후 Copy>Copy selector로 선택자를 복사할 수 있다.
3. 네이버 영화 이름, 순위, 평점 크롤링하기
# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')
# movies (tr들) 의 반복문을 돌리기
for movie in movies:
a_rank = movie.select_one('td.ac > img')
a_tag = movie.select_one('td.title > div > a')
a_score = movie.select_one('td.point')
if a_rank is not None:
rank, title, score = a_rank['alt'], a_tag.text, a_score.text
print(rank, title, score)
4. 웹스크래핑 결과 저장하기
3번에서는 print(rank, title, score)로 출력했지만, 이 부분 대신 Dictionary 형태로 만들어 'movies'라는 데이터베이스에 추가하는 코드를 추가해주면 된다.
doc = {
'rank': rank,
'title': title,
'score': score
}
db.movies.insert_one(doc)
5. 전체 코드
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
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.nhn?sel=pnt&date=20200303',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a_rank = movie.select_one('td.ac > img')
a_tag = movie.select_one('td.title > div > a')
a_score = movie.select_one('td.point')
if a_rank is not None:
rank, title, score = a_rank['alt'], a_tag.text, a_score.text
doc = {
'rank': rank,
'title': title,
'score': score
}
db.movies.insert_one(doc)
6. 결과 확인
Robo 3T에 들어가서 확인해보면 movies라는 Collection에 아래와 같이 크롤링한 네이버 영화 평점 Document들이 들어가 있는 것을 확인할 수 있다!
728x90
반응형