크롤링?
크롤링(crawling)은 '기다'라는 뜻의 crawl의 명사형인데, 소프트웨어와 같은 무언가가 인터넷을 돌아다니며 정보를 수집해 오는 작업을 의미
html을 크롤링해서 가져왔다쳐도, 그 안에서 내가 추출하고 싶은 부분을
어떻게 쉽게 뽑아낼 수 있냐
=> beautifulsoup이라는 라이브러리!
import requests
from bs4 import BeautifulSoup
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=20210829',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# 코딩 시작
print(soup)
- 데려오고싶은 부분에 검사(개발자모드) - copy - copy selector
- title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
- 위에서 tr 까지만 복사하고
- movies=soup.select('#old_content > table > tbody > tr')
- for문으로 돌려주면 제목만 나온다.
for movie in movies:
a = movie.select_one('td.title > div > a')
if a is not None:
print(a.text)
- alt값만 가져오려면?
#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
- 위처럼 먼저 카피 - 카피 셀렉터 한 다음
- 이미 movies에서 tr까지는 복사해놨으니, td:nth-child(1) > img 그 뒷부분만 복사
rank = movie.select_one('td:nth-child(1) > img')
- 그 안에서 alt값만 추출하고 싶으면
print(rank['alt']) # alt값만 추출하고 싶으면 저렇게 작성
위처럼 해도 되고
아니면, 바로 rank = movie.select_one('td:nth-child(1) > img')[‘alt’]
라고 붙여줘도 되고
—---------------------------
<뷰티플수프 코드 복습>
import requests
from bs4 import BeautifulSoup
👉 먼저 임포트해주고
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=20210829',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
👉 여기까진 원래 설정된 기본 골격
# 코딩 시작
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title.text) #text만 추출
print(title['href']) #href부분 추출
👉 제목을 먼저 추출해오려고, soup.select_one (1개만 추출해오겠다) 사용
전체를 데려오고, 그 중에 text내용만 추출한다.
그 중에 href내용만 추출한다.
#2위, 3위 타이틀들도 카피 셀렉터 해오면?
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a
movies=soup.select('#old_content > table > tbody > tr')
👉 movies에는 tr까지 복사해오기
for movie in movies:
a = movie.select_one('td.title > div > a')
👉 for문으로 돌리기 (List + 반복문)
if a is not None:
👉 코드 내용 안에 세로 작대기 표시가 None이라고 뜨는 게 있어서 그걸 if로 걸러준것
title = a.text
rank = movie.select_one('td:nth-child(1) > img')['alt']
star = movie.select_one('td.point').text
👉 3가지 추출 작업하기
- title은 text만 추출하고
- rank는 alt의 내용만 추출
- star는 text 추출
print(title,rank,star)
<monggo DB연결>
- 몽고 DB 회원가입하고 db 생성했음
- monggo db 기본코드
from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta
- URL은 몽고 db에서 Connect 눌렀을 때
아래 application code 내용 복붙~!
- 파이참에 다시 가서 아래 내용대로 입력해서 몽고db에 데이터를 넣어줬음
doc = {
'name' : 'kildong',
'age' : 28
}
db.users.insert_one(doc)
- 데이터 조회하기
all_users = list(db.users.find({},{'_id':False}))
for user in all_users:
print(user)
여기서 ‘_id’:False 는 id 값이 몽고db에서 자동으로 생성하는 건데,
이걸 우리는 볼 필요가 없으니 False로 설정해놓는 것
👉 만약 name이 bobby인 데이터만 가져오고 싶다면?
user = db.users.find_one({'name':'bobby'})
print(user)
- 데이터 업데이트
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
👉 조건 : name이 bobby인 애를 찾아서
명령 : age를 19로 만들어라
- 데이터 삭제
db.users.delete_one({'name':'bobby'})
👉 조건 : name이 bobby인 애를 삭제해라
<몽고db 정리>
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))
# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# 지우기 - 예시
db.users.delete_one({'name':'bobby'})
#가버나움 평점만 가져오기
gbnaum = db.movies.find_one({'title':'가버나움'})
print(gbnaum['star'])
gbnaumstar=gbnaum['star']
print(gbnaumstar)
#가버나움과 같은 평점인 영화 가져오기
all_movies = list(db.movies.find({'star' : gbnaumstar},{'_id':False}))
for m in all_movies:
print(m['title'])
'✍ 따뜻한 개발 공부' 카테고리의 다른 글
[Ajax] Json /Ajax 정의와 기본 API 데이터 가져오기 ( 서울시 openAPI로 실시간 미세먼지 데이터 가져오기) (0) | 2022.10.25 |
---|---|
[4주차] 웹개발 종합반 개발일지 (0) | 2022.10.25 |
[2주차] 웹개발 종합반 개발일지 (0) | 2022.10.22 |
[1주차] 웹개발 종합반 개발일지 (0) | 2022.10.20 |
[CSS] ellipsis 기능 / 넘치는 문장 말줄임으로 표시하기 (0) | 2022.09.15 |
댓글