본문 바로가기
비트캠프(AI아카데미)/TIL&WIL

[비트캠프 - 클라우드 기반 AlaaS 개발자 과정] 22.11.07.(DAY-16) TIL

by 그냥_살자 2022. 11. 7.

1. 이론

1) 코드 내 이론

크롤링(스크래핑) 기본 세팅

import urllib.request
from urllib.request import urlopen
from bs4 import BeautifulSoup

# 크롤링할 웹페이지 불러오기
soup = BeautifulSoup(urlopen(url), "lxml") #"html.parser","lxml","xml","html5lib" 택1

# html 불러오기
soup.find(name=태그명, attrs={key:value}) # attrs에 class or id
soup.find_all(name=태그명, attrs={key:value}) # 다불러오기

 

 

2) 그 외 이론

크롤링 vs 브라우징(검색)

dif = 사람의 개입이 있으면 브라우징

자료구조 텍스트 집합 정렬 데이터묶기
시퀀스 플레인텍스트 버블정렬 인덱싱
해쉬 하이퍼텍스트 웹(검색) 퀵정렬 매핑

** 네트워크(인터넷) + 데이터 = 웹

**주소창(string)에서 ‘?’ 뒤에 있는 거 = query string

 

 

3) 놓친 거

리스트는 수정 해야할 때는 iterator, 그냥 뽑아 쓸때는 enumerator가 편함??

마크업 vs 마크다운

 

 

2. 코드

<scrapper 패키지>

init

from util.common import Common
from scrapper.view import MenuController

if __name__ == '__main__':
    api = MenuController
    while True:
        menus = ["종료", "벅스뮤직", "멜론뮤직"]
        menu = input("메뉴 선택: ")

        if menu == "0":
            api.menu_0(menus[0])
            break
        elif menu == "1":
            api.menu_1("<https://music.bugs.co.kr/chart/track/day/total>")
        elif menu == "2":
            api.menu_2("<https://www.melon.com/chart/index.htm>")
        else:
            print(" ### 해당 메뉴 없음 ### ")

domain

import urllib.request
from urllib.request import urlopen
from bs4 import BeautifulSoup

"""
지원하는 Parser 종류
"html.parser" : 빠르지만 유연하지 않기 때문에 단순한 HTML문서에 사용합니다.
"lxml" : 매우 빠르고 유연합니다.
"xml" : XML 파일에만 사용합니다.
"html5lib" : 복잡한 구조의 HTML에 대해서 사용합니다.
"""

class BugsMusic: # 함수형이 아닌 객체지향형으로 만든 건 db에 저장하겠다는 뜻

    def __init__(self, url):
        self.url = url

    def scrap(self): # 정석
        soup = BeautifulSoup(urlopen(self.url), "lxml")
        title = {"class" : "title"}
        artist = {"class" : "artist"}
        titles = soup.find_all(name="p", attrs=title)
        artists = soup.find_all(name="p", attrs=artist)
        [print(f"{i+1} {titles[i].find('a').text} {j.find('a').text}\\n") for i,j in zip(range(len(titles)),artists)]

class MelonMusic:

    def __init__(self, url):
        self.url = url
        self.headers = {'User-Agent' : "Mozilla/5.0"}

    def scrap(self):
        soup = BeautifulSoup(urlopen(urllib.request.Request(self.url, headers=self.headers)), "lxml")
        titles = soup.find_all(name="div", attrs={"class" : "rank01"})
        artists = soup.find_all(name="div", attrs={"class" : "rank02"})
        [print(f"{i+1} {titles[i].find('a').text} {j.find('a').text}\\n") for i,j in zip(range(len(titles)),artists)]

view

from scrapper.domains import BugsMusic, MelonMusic

class MenuController(object):

    @staticmethod
    def menu_0():
        print("끗")

    @staticmethod
    def menu_1(arg):
        bugs = BugsMusic(arg)
        bugs.scrap()

    @staticmethod
    def menu_2(arg):
        melon = MelonMusic(arg)
        melon.scrap()

 

3. 하루마무리

크롤링 주간이 시작됐다.

 

크롤링 찍먹이라도 한 과거의 나에게 정말 감사하다.

 

간만에 뇌가 편한 수업을 받아서 그런지 하루종일 정신이 말짱하다.

 

선생님께서 막판에 데이터셋 비슷하게 뭔가 하셨는데 그건 내일의 내가 하겠지.

댓글