TIL no.58 - Back End - Crawling 1

박준규·2019년 10월 23일
0

크롤링은 쉽게 말해
웹에서 원하는 정보를 추출하는 것인데
그 방법이 조직화, 자동화된 방법으로
정보를 추출하는 것을 뜻합니다.

Python을 이용한 크롤링 예제를 살펴보도록 하겠습니다.


일단, requests와 BeautifulSoup이라는 라이브러리가 필요합니다.
request 공식문서(https://realpython.com/python-requests/)
BeautifulSoup 공식문서
(https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.html#name)
를 참조하면서 공부하도록 하겠습니다.


Billboard Chart hot 100을 크롤링 하는 예제를 해보려 합니다.

1위부터 100위까지
순위, 제목, 아티스트 정보를 가져오겠습니다.


requests 라이브러리의 get과 text 메서드와
BeautifulSoup의 html.parser를 이용합니다.

import requests
from bs4 import BeautifulSoup

response = requests.get('https://www.billboard.com/charts/hot-100')

html = response.text

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

그럼 현재 https://www.billboard.com/charts/hot-100
의 HTML 정보가 soup에 들어있습니다.

이제 우리가 원하는 정보인

  • 순위
  • 제목
  • 아티스트
    순으로 정보를 긁어보겠습니다.

정보를 정확하게 받아오기 위해서는 html 파일의 조직 혹은 규칙을 확인합니다.

순위의 규칙은 어떤지 살펴보겠습니다.


같은 클래스의 span태그로 감싸진 것을 확인할 수 있습니다.


다음은 제목의 규칙을 살펴보겠습니다.


역시나 같은 규칙의 span태그로 감싸진 것을 확인할 수 있습니다.


더 정확하게 규칙을 캐치하기 위해 개발자 도구를 이용해
selector를 카피해 확인해 주겠습니다.

먼저 순위에 해당하는 selector를 보면

1의 경우
charts > div > div.chart-list.container > ol > li:nth-child(1) > button > span.chart-element__rank.flex--column.flex--xy-center.flex--no-shrink > span.chart-element__rank__number

2의 경우
charts > div > div.chart-list.container > ol > li:nth-child(2) > button > span.chart-element__rank.flex--column.flex--xy-center.flex--no-shrink > span.chart-element__rank__number

이 selector를 활용해 정보를 변수에 담아보겠습니다.

BeautifulSoup의 select 메서드를 이용합니다.

rank = soup.select(
'li > button > span.chart-element__rank.flex--column.flex--xy-center.flex--no-shrink > span.chart-element__rank__number'
)

song = soup.select(
'li > button > span.chart-element__information > span.chart-element__information__song.text--truncate.color--primary'
)

singer = soup.select(
'li > button > span.chart-element__information > span.chart-element__information__artist.text--truncate.color--secondary'
)

이제 각 변수들(rank, song, singer)에는 CSS selector가 겹치는 태그들이 list 형태로 저장됩니다.

이제 데이터들을 정리해줍니다.

music_chart =[]

for item in zip(rank, song, singer):
	music_chart.append(
		{
			'rank' : item[0].text,
			'song' : item[1].text,
			'singer' : item[2].text
		}
	)

rank의 n번째 요소
song의 n번째 요소
singer의 n번째 요소끼리 묶기 위해
zip함수를 사용했습니다.


  • 참고
    zip함수는 동일한 개수로 이루어진 자료형을 묶어주는 역할을 합니다.
>>>list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

music_chart에 한 요소당 객체를 append합니다. 각 객체는 각 자료들의 text만(태그안의 내용)만을 key의 value로 갖는 형태입니다.

music_chart의 내용을 print해보겠습니다.

for item in music_chart:
	print(f"{item['rank']} | {item['song']} | {item['singer']}")

결과 화면을 보겠습니다.

1 | Truth Hurts | Lizzo
2 | Senorita | Shawn Mendes & Camila Cabello
3 | Someone You Loved | Lewis Capaldi
4 | Circles | Post Malone
5 | No Guidance | Chris Brown Featuring Drake
6 | HIGHEST IN THE ROOM | Travis Scott
7 | Ran$om | Lil Tecca
8 | Bad Guy | Billie Eilish
9 | Panini | Lil Nas X
10 | Bandit | Juice WRLD & YoungBoy Never Broke Again
11 | 10,000 Hours | Dan + Shay & Justin Bieber
12 | Memories | Maroon 5
13 | Goodbyes | Post Malone Featuring Young Thug
14 | Beautiful People | Ed Sheeran Featuring Khalid
15 | I Don't Care | Ed Sheeran & Justin Bieber
16 | Old Town Road | Lil Nas X Featuring Billy Ray Cyrus
17 | Lights Up | Harry Styles
18 | Talk | Khalid
19 | Sunflower (Spider-Man: Into The Spider-Verse) | Post Malone & Swae Lee
20 | Good As Hell | Lizzo
21 | Trampoline | SHAED
22 | On Chill | Wale Featuring Jeremih
23 | Sucker | Jonas Brothers
24 | Only Human | Jonas Brothers
25 | Money In The Grave | Drake Featuring Rick Ross
26 | Playing Games | Summer Walker
27 | Suge | DaBaby
28 | How Do You Sleep? | Sam Smith
29 | Baby | Lil Baby & DaBaby
30 | Ballin' | Mustard Featuring Roddy Ricch
31 | Hot Girl Summer | Megan Thee Stallion, Nicki Minaj & Ty Dolla $ign
32 | Hot | Young Thug Featuring Gunna
33 | You Need To Calm Down | Taylor Swift
34 | Dancing With A Stranger | Sam Smith & Normani
35 | My Type | Saweetie
36 | Prayed For You | Matt Stell
37 | Lover | Taylor Swift
38 | One Thing Right | Marshmello & Kane Brown
39 | Even Though I'm Leaving | Luke Combs
40 | Camelot | NLE Choppa
41 | Heat | Chris Brown Featuring Gunna
42 | 223's | YNW Melly & 9lokknine
43 | Graveyard | Halsey
44 | Lonely Child | YoungBoy Never Broke Again
45 | One Man Band | Old Dominion
46 | Time | NF
47 | Wow. | Post Malone
48 | Good Vibes | Chris Janson
49 | The Git Up | Blanco Brown
50 | Self Control | YoungBoy Never Broke Again
51 | Take What You Want | Post Malone Featuring Ozzy Osbourne & Travis Scott
52 | I Don't Know About You | Chris Lane
53 | Liar | Camila Cabello
54 | BOP | DaBaby
55 | INTRO | DaBaby
56 | F.N | Lil Tjay
57 | Make No Sense | YoungBoy Never Broke Again
58 | VIBEZ | DaBaby
59 | Cash Shit | Megan Thee Stallion Featuring DaBaby
60 | Love You Too Late | Cole Swindell
61 | Hot Girl Bummer | blackbear
62 | Carter Son | YoungBoy Never Broke Again
63 | Enemies | Post Malone Featuring DaBaby
64 | Kinfolks | Sam Hunt
65 | Every Little Thing | Russell Dickerson
66 | Hot Now | YoungBoy Never Broke Again
67 | The Bones | Maren Morris
68 | What Happens In A Small Town | Brantley Gilbert + Lindsay Ell
69 | Living | Dierks Bentley
70 | All Dat | Moneybagg Yo X Megan Thee Stallon
71 | Motivation | Normani
72 | Baby Sitter | DaBaby Featuring Offset
73 | In Control | YoungBoy Never Broke Again
74 | Come Thru | Summer Walker & Usher
75 | Dance Monkey | Tones And I
76 | China | Anuel AA, Daddy Yankee, Karol G, Ozuna & J Balvin
77 | Tip Of My Tongue | Kenny Chesney
78 | Boyfriend | Ariana Grande & Social House
79 | Time I'm On | YoungBoy Never Broke Again
80 | Lalala | Y2K & bbno$
81 | Don't Call Me Angel (Charlie's Angels) | Ariana Grande, Miley Cyrus & Lana Del Rey
82 | Leave Em Alone | Layton Greene, Lil Baby, City Girls & PnB Rock
83 | Remember You Young | Thomas Rhett
84 | Otro Trago | Sech, Darell, Nicky Jam, Ozuna & Anuel AA
85 | TOES | DaBaby Featuring Lil Baby & Moneybagg Yo
86 | Callaita | Bad Bunny & Tainy
87 | Higher Love | Kygo X Whitney Houston
88 | Saint-Tropez | Post Malone
89 | I'll Kill You | Summer Walker Featuring Jhene Aiko
90 | Writing On The Wall | French Montana Featuring Post Malone, Cardi B & Rvssian
91 | Hot Shower | Chance The Rapper Featuring MadeinTYO & DaBaby
92 | What If I Never Get Over You | Lady Antebellum
93 | Heartache Medication | Jon Pardi
94 | Wish Wish | DJ Khaled Featuring Cardi B & 21 Savage
95 | La Cancion | J Balvin & Bad Bunny
96 | Hollywood's Bleeding | Post Malone
97 | We Were | Keith Urban
98 | Slow Dancing In The Dark | Joji
99 | Bad Bad Bad | Young Thug Featuring Lil Baby
100 | Rich As Hell | YoungBoy Never Broke Again

원하는 데이터를 크롤링한 것을 확인할 수 있습니다.

profile
devzunky@gmail.com

0개의 댓글