웹개발 종합반 3주차

weffa·2022년 2월 4일
0

3주차에는 python, 크롤링, mongoDB를 배웠다.

크롤링

api에서 값을 가져올때 requests 라이브러리를 사용하면 좋다
requests 라이브러리를 사용하려면
python인터프리터에서 requests 패키지를 설치하고
아래같은 코드로 값을 가져올 수 있다.

import requests

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

gus = rjson['RealtimeCityAir']['row']

for gu in gus:
	print(gu['MSRSTE_NM'], gu['IDEX_MVL'])

웹에서 가져오려면 bs4라는 패키지를 추가 설치하면 좋다

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('url',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

이게 기본 코드인데 'url'에 자기가 원하는 페이지의 url을 입력하여 사용하면 된다.

사전과제 스터디에서 토이프로젝트에 대해 얘기할 때 명대사 크롤링얘기가 나왔던게 생각나서 연습삼아 네이버 영화에서 명대사를 크롤링 하는 코드를 만들어 봤다.

import requests
from bs4 import BeautifulSoup

aaa='https://movie.naver.com/movie/bi/mi/script.naver?code=62266&order=best&nid=&page='

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(aaa+'1', headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')


bbbbb = soup.select_one('#iframeDiv > div.paging > div').text.replace('다음', '').replace('\n', '').replace('10','').strip()
aaaaa = list(bbbbb)

for i in range(len(aaaaa)):

    ccc = aaaaa[i]
    print(ccc)
    data1 = requests.get(aaa + ccc, headers=headers)
    soup1 = BeautifulSoup(data1.text, 'html.parser')

    lines = soup1.select('#iframeDiv > ul > li')

    for line in lines:
        a = line.select_one('div > p.one_line').text
        b = line.select_one('div > p.char_part > span')

        if b is not None:
            bb = b.text
            print(a, bb)

변수이름을 정하는게 너무 어렵다.

영화마다 등록된 명대사가 한페이지의 10개만 나와있다. 페이지를 넘겨가면서 크롤링을 하고 싶어서 반복문을 사용했다.

페이지가 바뀔때

'https://movie.naver.com/movie/bi/mi/script.naver?code=122527&order=best&nid=&page='

이 url은 동일하고
페이지에 따라서

'https://movie.naver.com/movie/bi/mi/script.naver?code=122527&order=best&nid=&page=1'
'https://movie.naver.com/movie/bi/mi/script.naver?code=122527&order=best&nid=&page=2'
'https://movie.naver.com/movie/bi/mi/script.naver?code=122527&order=best&nid=&page=3'

이런식으로 변한다.
그래서

'https://movie.naver.com/movie/bi/mi/script.naver?code=122527&order=best&nid=&page='

를 변수로 만들고 뒤에 올 숫자들을 반복문으로 바꿔가면서 크롤링하려했다
영화마다 페이지 수가 달라 페이지 수 정보를 가져와서 페이지 수에 맞게 반복문을 돌리려고
처음에 1페이지에 데이터를 가져와서 replace를 이용해서 지저분한 것들을 떼고 리스트로 만들어 줬다.
그리고 리스트에 길이만큼 반복문을 돌렸다.

네이버 영화에서 영화마다 url에서 'code='뒤에 숫자만 다른데 이 숫자만 변수 aaa에서 바꿔주면 된다.

문제는 페이지 정보를 리스트로 만들때 [10]이 안되고 [1,0]으로 된다. 그래서 9페이지까지 밖에 크롤링이 안된다.
더 알아봐야겠다.

mongoDB

Database는 데이터를 잘 찾기위해 사용한다

Database는 크게 두 종류가 있다.

SQL

정형화된 형태로 데이터를 저장

NoSQL

자유로운 형태로 데이터를 저장

우리는 NoSQL형태인 mongoDB를 배웠다

파이썬에서 mongoDB를 조작하기 위해

pymongo, dnspython라는 패키지를 설치하고 아래 코드를 이용해서 연결해준다

from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta

그리고 아래 코드를 이용하여 사용하면 된다

# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
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'})

위에서 연습한 코드 마지막

print(a, bb)

밑에 아래 코드만 추가해서 웹에서 크롤링 한 값은 데이터 베이스에 넣을 수 있었다.

doc = {'line': a, 'characters': bb}
db.lines.insert_one(doc)

0개의 댓글