본문 바로가기
✍ 따뜻한 개발 공부

[3주차] 웹개발 종합반 개발일지

by 따따시 2022. 10. 23.

크롤링?

 

크롤링(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)

 

  1. 데려오고싶은 부분에 검사(개발자모드) - copy - copy selector
  2. title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
  3. 위에서 tr 까지만 복사하고
  4. movies=soup.select('#old_content > table > tbody > tr')
  5. for문으로 돌려주면 제목만 나온다.

for movie in movies:

   a = movie.select_one('td.title > div > a')

   if a is not None:

       print(a.text)




  1. alt값만 가져오려면?

#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img

 

  1. 위처럼 먼저 카피 - 카피 셀렉터 한 다음
  2. 이미 movies에서 tr까지는 복사해놨으니, td:nth-child(1) > img 그 뒷부분만 복사

rank = movie.select_one('td:nth-child(1) > img')

  1. 그 안에서 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연결>

  1. 몽고 DB 회원가입하고 db 생성했음
  2. monggo  db 기본코드

from pymongo import MongoClient

client = MongoClient('여기에 URL 입력')

db = client.dbsparta

 

  1. URL은 몽고 db에서 Connect 눌렀을 때 

아래 application code 내용 복붙~!

 

  1. 파이참에 다시 가서 아래 내용대로 입력해서 몽고db에 데이터를 넣어줬음

doc = {

   'name' : 'kildong',

   'age' : 28

}

 

db.users.insert_one(doc)



  1. 데이터 조회하기

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)

 

  1. 데이터 업데이트 

db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

👉 조건 : name이 bobby인 애를 찾아서

     명령 : age를 19로 만들어라

 

  1. 데이터 삭제

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'])

댓글