TIL 3 | 스크래핑
TIL_210521
Python
- Python 패키지 활용
- venv는 virtual environment의 약자고 프로젝트별로 패키지를 담는 가상환경을 의미
웹스크랩핑 (크롤링)
- requests로 불러오고 BeautifulSoup으로 솎아냄
requests.get('url',headers=headers)
BeautifulSoup(data.text, 'html.parser')
- soup 객체에는
select()
select_one()
함수가 있음
select()
는 모든 결과를 리스트에 담고, select_one()
은 하나의 요소만 반환
- copy selector로 selector를 가져와 활용
- 크롤링은 정답을 찾아가는게 아니라 되게 만드는 것
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://www.genie.co.kr/chart/top200?ditc=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# 가져온 선택자
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1)
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
genies = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for ff in genies:
rank = ff.select_one('td.number').text[:2].strip()
title = ff.select_one('td.info > a.title.ellipsis').text.strip()
singer = ff.select_one('td.info > a.artist.ellipsis').text
print(rank, singer, singer)
- 코드를 작성할 때는 copy selector가 뭔지, 왜 해야하고 어떻게 잘라 쓰는지 몰랐는데 복습하고 찾아보면서 알게됨
- 코드 하나 하나 실행해보면서 진행하기
DB
- DB에는 SQL과 NoSQL이 있음
- SQL : 행/열 활용, 새로운 데이터를 추가하기가 불편, 정형화된 데이터를 사용하는 방식은 최적화가 잘 되어있음 ex) MySQL, MSSQL, Oracle
- NoSQL : Dictionary 형식, 데이터관리의 유연성 ex) mongoDB
mongoDB
- mongoDB, robo 3t 사용
- robo 3t는 mongoDB를 GUI로 손쉽게 관리하는 툴
- Python에서 mongoDB를 조작하려면 라이브러리 pymongo가 필요
- 기본코드를 임포트해야함
from pymongo import MongoClient #pymongo import
client = MongoClient('localhost', 27017) # 내 컴퓨터에서 사용
db = client.dbsparta # dbsparta라는 이름으로 접속(저장소명)
- 주로
insert
,find
,update
,delete
를 사용
#insert
doc = {'name':'jane','age':21}
db.users.insert_one(doc)
#db안에 users라는 컬렉션안에 insert
#find
db.users.find({'age':21},{'_id':False})
#조건에 해당하는 데이터를 가져옴
db.users.find_one({'name':'bobby'},{'_id':False})
#여러개 있어도 제일 위에 있는 하나만 가져옴
#update
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
db.users.update_many({'name':'bobby'},{'$set':{'age':19}})
#many는 조건에 해당하는 전부를 update
#delete
db.users.delete_one({'name':'bobby'})
db.users.delete_many({'name':'bobby'})
생각
requests.get('url',headers=headers)
BeautifulSoup(data.text, 'html.parser')
select()
select_one()
함수가 있음select()
는 모든 결과를 리스트에 담고, select_one()
은 하나의 요소만 반환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://www.genie.co.kr/chart/top200?ditc=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# 가져온 선택자
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1)
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
genies = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for ff in genies:
rank = ff.select_one('td.number').text[:2].strip()
title = ff.select_one('td.info > a.title.ellipsis').text.strip()
singer = ff.select_one('td.info > a.artist.ellipsis').text
print(rank, singer, singer)
- 코드를 작성할 때는 copy selector가 뭔지, 왜 해야하고 어떻게 잘라 쓰는지 몰랐는데 복습하고 찾아보면서 알게됨
- 코드 하나 하나 실행해보면서 진행하기
from pymongo import MongoClient #pymongo import
client = MongoClient('localhost', 27017) # 내 컴퓨터에서 사용
db = client.dbsparta # dbsparta라는 이름으로 접속(저장소명)
insert
,find
,update
,delete
를 사용#insert
doc = {'name':'jane','age':21}
db.users.insert_one(doc)
#db안에 users라는 컬렉션안에 insert
#find
db.users.find({'age':21},{'_id':False})
#조건에 해당하는 데이터를 가져옴
db.users.find_one({'name':'bobby'},{'_id':False})
#여러개 있어도 제일 위에 있는 하나만 가져옴
#update
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
db.users.update_many({'name':'bobby'},{'$set':{'age':19}})
#many는 조건에 해당하는 전부를 update
#delete
db.users.delete_one({'name':'bobby'})
db.users.delete_many({'name':'bobby'})
210531
확실히 처음 배우던 시점에서의 느낌과 다르다. 머리로 들어오는 정보의 양도 다르고 어느부분을 더 공부해야할지 판단이 선다. 하지만 비효율적으로 느껴지는 부분은 어느정도 넘겨야할듯.
Author And Source
이 문제에 관하여(TIL 3 | 스크래핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@pyt4105/210521TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)