상세 컨텐츠

본문 제목

크롤링(1)

카테고리 없음

by teminam 2023. 6. 9. 17:48

본문

 

(75 Audio Lessons) Daily English Conversation Practice | Questions and Answers By Topics

Daily English Conversation Practice - Questions and Answers by TopicYou have troubles making real English conversations? You want to improve your Spoken English quickly? You are too busy to join in any English speaking course?Don’t worry. Let us help you

basicenglishspeaking.com

    반도체 산업에서 크롤링과 스크레이핑의 활용방식

        1. 반도체 시장 동향 분석: 반도체 시장은
        기술적인 발전과 경쟁이 심화되는 산업입니다.
        크롤링과 스크레이핑을 통해 반도체 시장에 대한
        보고서, 산업 동향, 기업 뉴스 등을 수집하여
        시장 동향을 파악하고 경쟁사의 활동을 추적할 수
        있습니다.

        2. 반도체 제품 정보 수집: 반도체 제조사들은
        제품 정보를 자사 웹사이트에 공개하고 있습니다.
        크롤링과 스크레이핑을 활용하여 반도체 제품의
        사양, 성능, 가격 등을 수집하여 제품 비교 및
        평가에 활용할 수 있습니다.

        3. 기술 동향 및 연구 정보 수집: 반도체 기술은
        지속적인 연구와 개발이 이루어지고 있습니다.
        연구 논문, 특허 정보, 학회 발표 자료 등을
        크롤링하여 최신 기술 동향과 연구 결과를 파악할
        수 있습니다. 이를 통해 기술적인 혁신에 대한
        통찰력을 얻고 경쟁력을 강화할 수 있습니다.

        4. 반도체 부품 가격 모니터링: 반도체 제조에
        사용되는 부품의 가격 변동은 생산 비용에 영향을
        미칩니다. 크롤링과 스크레이핑을 활용하여
        반도체 부품 공급 업체의 웹사이트나 온라인 거래
        플랫폼에서 가격 정보를 수집하고 분석함으로써
        원가 관리에 도움을 줄 수 있습니다.

    배터리 산업에서 크롤링과 스크레이핑의 활용방식

        1. 원자재 가격 모니터링: 배터리 제조에
        사용되는 원자재의 가격 변동은 생산 비용에
        직접적인 영향을 미칩니다. 크롤링과
        스크레이핑을 활용하여 원자재 공급 업체
        웹사이트나 온라인 거래 플랫폼에서 원자재 가격
        정보를 수집하고 분석함으로써 가격 변동에 대한
        정보를 신속하게 파악할 수 있습니다.

        2. 배터리 기술 및 성능 분석: 배터리 산업은
        지속적인 기술 개발과 연구가 이루어지는
        분야입니다. 크롤링과 스크레이핑을 통해 배터리
        기술 동향, 연구 논문, 특허 정보 등을 수집하여
        최신 기술 동향과 성능 개선 방향을 파악할 수
        있습니다.

        3. 시장 조사 및 경쟁사 분석: 배터리 시장은
        빠르게 성장하고 변화하는 산업입니다. 크롤링과
        스크레이핑을 통해 배터리 시장에 대한 보고서,
        시장 조사 데이터, 경쟁사의 제품 정보 및 가격
        등을 수집하여 시장 동향을 파악하고 경쟁력을
        분석할 수 있습니다.

        4. 고객 피드백 및 리뷰 분석: 배터리 제품의
        고객 피드백, 리뷰, 평가 등은 제품 개선 및
        마케팅에 중요한 정보를 제공합니다. 크롤링과
        스크레이핑을 활용하여 온라인 상점, 소셜
        미디어, 제품 리뷰 사이트 등에서 고객 피드백을
        수집하고 분석함으로써 제품 개선 및 고객 만족도
        향상에 기여할 수 있습니다.

1. Basic English Speaking

import requests # 파이썬에서 HTTP 요청을 보내기 위한 라이브러리
from bs4 import BeautifulSoup # HTML 및 XML 문서를 파싱하고 검색하기 위한 라이브러리
request = requests.get(site)  # requests.get() 함수를 사용하여 해당 URL에 GET 요청을 보냅니다.
print(request)  # 응답코드를 보여줌 # 요청에 성공하면, 웹 페이지의 내용을 가져옵니다. 이 내용은 response 객체에 저장됩니다.
# print(request.text)  # HTML/ CSS를 잔뜩 들고옴

soup = BeautifulSoup(request.text)
# 추출된 텍스트를 BeautifulSoup의 BeautifulSoup 함수에 전달하여 파싱합니다. 이를 위해 두 번째 인자로 'html.parser'를 사용합니다.
# 파싱된 HTML 문서를 soup 객체에 저장합니다. 이제 soup 객체를 사용하여 원하는 정보를 검색하고 추출할 수 있습니다.
divs = soup.find('div', {'class':'thrv-columns'})  # 단일 테그를 가지고 옴 # 키 벨류로 가지고 오고, div로 이루어지면서 뒤의 이름으로 이루어진 div
print(divs)

# 안에 있는 엥커태그를 다 갖고 오고싶을때
links = divs.findAll('a')
print(links)
# BeautifulSoup의 findAll() 또는 find_all() 메서드를 사용하여 HTML 문서 내에서 <a> 태그를 찾는 부분입니다.
# 앵커태그를 다 가지고 와서 컴마를 기준으로 리스트에 저장

# 텍스트만 빼서 보고 싶다. for문 이용
for link in links:
  print(link.text)

 

subject = []

for link in links:
  subject.append(link.text)
# 서브젝트 안에 리스트로 들어감
len(subject)

print('총', len(subject), '개의 주제를 찾았습니다')
for i in range(len(subject)):
  print('{0:2d}, {1:s}'.format(i+1, subject[i]))

# subject라는 리스트에 저장된 주제들을 출력하는 기능을 수행
# 주제의 번호와 내용을 출력합니다. '{0:2d}, {1:s}'는 형식 지정 문자열로, 첫 번째 인자 i+1은 2자리의 정수로, 두 번째 인자 subject[i]는 문자열로 포맷됩니다.
# i+1은 1부터 시작하는 주제 번호를 표시하고, subject[i]은 해당 주제의 내용을 표시합니다.
# 따라서 주어진 코드는 subject 리스트에 저장된 주제들을 번호와 함께 출력하는 역할을 수행합니다.
총 75 개의 주제를 찾았습니다
 1, Family
 2, Restaurant
 3, Books
 4, Travel
 5, Website
 6, Accident
 7, Childhood memory
 8, Favorite rooms
 9, Presents
10, Historical place
11, Newspaper/ Magazine
12, A memorable event
13, A favorite subject
14, A museum
15, A favorite movie
16, A foreign country
17, Parties
18, A teacher
19, A friend
20, A hotel
21, A letter
22, Hobbies
23, Music
24, Shopping
25, Holiday
26, Animals
27, A practical skill
28, Sport
29, A School
30, Festival
31, Food
32, Household appliance
33, A music band
34, Weather
35, Neighbor
36, Natural scenery
37, Outdoor activities
38, Law
39, Pollution
40, Traffic jam
41, TV program
42, Architect/ Building
43, Electronic Media
44, Job/ Career
45, Competition/ contest
46, A garden
47, Hometown
48, Clothing
49, Advertisement
50, A project
51, A wedding
52, A Coffee shop
53, Culture
54, Transport
55, Politician
56, Communication
57, Business
58, Computer
59, Exercise
60, Goal/ ambition
61, Art
62, Fashion
63, Jewelry
64, Cosmetic
65, Indoor Game
66, Phone conversation
67, Learning A Second language
68, A Creative Person
69, A celebrity
70, A Health Problem
71, Technological advancements
72, A Landmark
73, Handcraft Items
74, Plastic Surgery
75, Success
 
 

2. 다음 뉴스기사


def daum_new_title(new_id):
  url = 'https://v.daum.net/v/{}'.format(new_id)
  request = requests.get(url)
  soup = BeautifulSoup(request.text)
  title = soup.find('h3', {'class':'tit_view'})
  if title:
    return title.text.strip()
  return '제목없음'
daum_new_title('20230601093610464')

    다음 뉴스 페이지에서 뉴스 제목을 가져오는 함수인 daum_new_title()을 정의하는 파이썬 코드입니다.
    코드를 살펴보면 다음과 같습니다:

      1. def daum_new_title(new_id):: daum_new_title() 함수를 정의합니다.
       new_id라는 매개변수를 받습니다. 이 매개변수는 다음 뉴스의 고유 식별자를 나타냅니다.

      2. url = 'https://v.daum.net/v/{}'.format(new_id): 주어진 new_id를
       사용하여 뉴스 페이지의 URL을 생성합니다.

      3. request = requests.get(url): 생성한 URL에 GET 요청을 보내고,
      request 변수에 응답 객체를 저장합니다.

      4. soup = BeautifulSoup(request.text): 응답 객체의 텍스트를
      BeautifulSoup으로 파싱하여 soup 객체를 생성합니다.

      5. title = soup.find('h3', {'class':'tit_view'}): soup 객체에서 h3
      태그이면서 class 속성이 'tit_view'인 요소를 찾아서 title 변수에 할당합니다.

      6. if title:: title이 존재하는지 확인합니다. 존재한다면, 뉴스 제목이
      존재하는 것이므로 다음 단계를 실행합니다.

      7. return title.text.strip(): title 객체의 텍스트를 가져와서 양쪽 공백을
       제거한 후 반환합니다.

      8. return '제목없음': title이 존재하지 않는 경우, '제목없음'을 반환합니다.

      9. daum_new_title('20230601093610464'): daum_new_title() 함수에
      '20230601093610464'라는 뉴스 ID를 전달하여 해당 뉴스의 제목을 가져옵니다.

    따라서 주어진 코드는 daum_new_title() 함수를 사용하여
    주어진 다음 뉴스 ID에 해당하는 뉴스의 제목을 가져오는 역할을 수행합니다.

3. 벅스 뮤직 차트

request = requests.get('https://music.bugs.co.kr/chart')
soup = BeautifulSoup(request.text)
titles = soup.findAll('p', {'class':'title'})
# print(titles)
artists = soup.findAll('p', {'class':'artist'})
# print(artists)
# for i in range(len(titles)):
#   title = titles[i].text.strip()
#   artist = artists[i].text.strip()
#   print('{0:3d}위 {1} - {2}'.format(i+1, artist, title))
# 이 코드는 37위 크리스토퍼에서 엔터키가 자동으로 먹어서 이상하게 구분이 됨. 따라서, .split('\n')[0] 을 붙여야 함

for i in range(len(titles)):
  title = titles[i].text.strip()
  artist = artists[i].text.strip().split('\n')[0]
  print('{0:3d}위 {1} - {2}'.format(i+1, artist, title))
  # 깔끔하게 정렬
  # 이 코드는 타이틀에 의해서만 반복문을 돌림

    .split('\n')은 문자열을 줄 바꿈(\n)을 기준으로 분할하여 리스트로 반환하는
    메서드입니다. 따라서 artists[i].text.strip().split('\n')은 artists[i]
    요소의 텍스트를 가져와서 줄 바꿈을 기준으로 분할한 결과를 리스트로 반환합니다.

    이후 [0]을 사용하여 리스트의 첫 번째 요소를 선택합니다. 인덱스 0은
    리스트에서 첫 번째 항목을 나타내므로, .split('\n')[0]은 리스트에서 첫 번째 줄의 문자열을 가져옵니다.

    주어진 코드에서 artist = artists[i].text.strip().split('\n')[0]은 artists
    리스트의 i번째 요소에서 텍스트를 가져온 후 양쪽 공백을 제거하고, 그 결과를
    줄 바꿈을 기준으로 분할한 리스트에서 첫 번째 줄의 문자열을 artist 변수에
    할당하는 역할을 수행합니다.

    이렇게 함으로써 가수 이름 문자열에 줄 바꿈 문자열이 포함되어 있는 경우 첫
    번째 줄의 가수 이름만을 추출할 수 있습니다.
# zip함수를 이용하여, artists와 titles로 for문 돌리기
# 강사님 코드(enumerate 사용)
for i, (t, a) in enumerate(zip(titles, artists)): # enumerate를 이용해서 index도 같이 추출할 수 있다.
  title = t.text.strip()
  artist = a.text.strip().split('\n')[0]
  if (i+1) % 10 == 1:
    print('\n')
  print('{0:3d}위 곡 {1} - {2}'.format(i+1, artist, title))
  1위 곡 (여자)아이들 - 퀸카 (Queencard)
  2위 곡 aespa - Spicy
  3위 곡 IVE (아이브) - I AM
  4위 곡 LE SSERAFIM (르세라핌) - UNFORGIVEN (feat. Nile Rodgers)
  5위 곡 IVE (아이브) - Kitsch
  6위 곡 FIFTY FIFTY - Cupid
  7위 곡 세븐틴(SEVENTEEN) - 손오공
  8위 곡 LE SSERAFIM (르세라핌) - 이브, 프시케 그리고 푸른 수염의 아내
  9위 곡 NewJeans - Hype Boy
 10위 곡 NewJeans - Ditto


 11위 곡 지수(JISOO) - 꽃
 12위 곡 aespa - Thirsty
 13위 곡 이채연 - KNOCK
 14위 곡 NewJeans - Attention
 15위 곡 NewJeans - OMG
 16위 곡 Charlie Puth(찰리 푸스) - Dangerously
 17위 곡 STAYC(스테이씨) - Teddy Bear
 18위 곡 IVE (아이브) - After LIKE
 19위 곡 Charlie Puth(찰리 푸스) - I Don’t Think That I Like Her
 20위 곡 IVE (아이브) - LOVE DIVE


 21위 곡 H1-KEY (하이키) - 건물 사이에 피어난 장미 (Rose Blossom)
 22위 곡 (여자)아이들 - Allergy
 23위 곡 LE SSERAFIM (르세라핌) - ANTIFRAGILE
 24위 곡 윤하(Younha/ユンナ) - 사건의 지평선
 25위 곡 DK(디셈버) - 심(心)
 26위 곡 던 (DAWN) - 빛이 나는 너에게
 27위 곡 박재정 - 헤어지자 말해요
 28위 곡 LE SSERAFIM (르세라핌) - FEARLESS
 29위 곡 멜로망스(MeloMance) - 사랑인가 봐
 30위 곡 허각 - 물론


 31위 곡 Christopher(크리스토퍼) - When I Get Old
 32위 곡 DAY6 (데이식스) - 한 페이지가 될 수 있게
 33위 곡 부석순(SEVENTEEN) - 파이팅 해야지 (Feat. 이영지)
 34위 곡 Charlie Puth(찰리 푸스) - That’s Not How This Works (feat. Dan + Shay)
 35위 곡 aespa - Salty & Sweet
 36위 곡 NMIXX - Love Me Like This
 37위 곡 BLACKPINK - Shut Down
 38위 곡 (여자)아이들 - TOMBOY
 39위 곡 IVE (아이브) - ELEVEN
 40위 곡 윤하(Younha/ユンナ) - 오르트구름


 41위 곡 지올팍(Zior Park) - CHRISTIAN
 42위 곡 임재현 - Heaven(2023)
 43위 곡 BLACKPINK - Pink Venom
 44위 곡 FIFTY FIFTY - Cupid (Twin Ver.)
 45위 곡 (여자)아이들 - Nxde
 46위 곡 NCT DREAM - Candy
 47위 곡 볼빨간사춘기 - FRIEND THE END
 48위 곡 The Kid LAROI - STAY
 49위 곡 박재범 - Candy (Feat. Zion.T)
 50위 곡 비투비 - 나의 바람 (Wind And Wish)


 51위 곡 성시경 - 너의 모든 순간
 52위 곡 멜로망스(MeloMance) - 찬란한 하루
 53위 곡 10CM - 그라데이션
 54위 곡 이무진 - 잠깐 시간 될까
 55위 곡 STAYC(스테이씨) - Poppy (Korean Ver.)
 56위 곡 경서예지 - 다정히 내 이름을 부르면
 57위 곡 BIG Naughty (서동현) - 정이라고 하자 (Feat. 10CM)
 58위 곡 임영웅 - 사랑은 늘 도망가
 59위 곡 Charlie Puth(찰리 푸스) - That's Hilarious
 60위 곡 aespa - 도깨비불 (Illusion)


 61위 곡 경서 - 나의 X에게
 62위 곡 폴킴(Paul Kim) - 모든 날, 모든 순간 (Every day, Every Moment)
 63위 곡 김민석 (멜로망스) - 취중고백
 64위 곡 #안녕 - 해요 (2022)
 65위 곡 잔나비 - 주저하는 연인들을 위해
 66위 곡 태연 (TAEYEON) - INVU
 67위 곡 폴킴(Paul Kim) - 한강에서 (Feat. BIG Naughty)
 68위 곡 NewJeans - Cookie
 69위 곡 Justin Bieber(저스틴 비버) - Off My Face
 70위 곡 테이(Tei) - Monologue


 71위 곡 태양 - VIBE (feat. Jimin of BTS)
 72위 곡 Sam Smith(샘 스미스) - Unholy
 73위 곡 NCT 도재정 - Perfume
 74위 곡 WSG워너비 (가야G) - 그때 그 순간 그대로 (그그그)
 75위 곡 Red Velvet (레드벨벳) - Feel My Rhythm
 76위 곡 10CM - 부동의 첫사랑
 77위 곡 아이유(IU) - 드라마
 78위 곡 방탄소년단 - Dynamite
 79위 곡 지아(Zia) - 사랑..그게 뭔데
 80위 곡 주호 - 내가 아니라도


 81위 곡 우디(Woody) - Say I Love You
 82위 곡 BIGBANG (빅뱅) - 봄여름가을겨울 (Still Life)
 83위 곡 BE'O (비오) - LOVE me
 84위 곡 아이유(IU) - strawberry moon
 85위 곡 지코 (ZICO) - 새삥 (Prod. ZICO) (Feat. 호미들)
 86위 곡 aespa - I'm Unhappy
 87위 곡 Crush - Rush Hour (Feat. j-hope of BTS)
 88위 곡 10CM - 딱 10CM만
 89위 곡 카라(Kara) - WHEN I MOVE
 90위 곡 이영지 - NOT SORRY (Feat. pH-1) (Prod. by Slom)


 91위 곡 우디(Woody) - Nostalgia
 92위 곡 태양 - 나의 마음에 (Seed)
 93위 곡 볼빨간사춘기 - Love story
 94위 곡 CIX (씨아이엑스) - Save me, Kill me
 95위 곡 Charlie Puth(찰리 푸스) - Left and Right (Feat. Jung Kook of BTS)
 96위 곡 aespa - Welcome To MY World (Feat. nævis)
 97위 곡 CIX (씨아이엑스) - Color
 98위 곡 주주 시크릿 - 밤이 무서워요 (Lonely Night)
 99위 곡 BE'O (비오) - 자격지심 (Feat. ZICO)
100위 곡 CIX (씨아이엑스) - Curtain Call
 
```
    zip() 함수는 동일한 길이의 여러 개의 리스트를 묶어서 함께 반복할 수 있도록
    해줍니다. 위 코드에서는 titles와 artists 리스트를 zip() 함수로 묶어서
    반복하면서 각 노래의 제목과 가수를 동시에 가져옵니다.
 
    루프의 각 반복에서 title과 artist 변수는 titles와 artists 리스트의 해당
    요소들을 순차적으로 참조합니다. 그 후, 코드는 기존과 동일하게 제목과 가수
    이름을 추출하여 포맷하여 출력합니다.
 
    이렇게 함으로써 zip() 함수를 사용하여 titles와 artists 리스트를 함께
    사용하여 반복할 수 있습니다.
```

 

4. 멜론차트

  • https://www.melon.com/chart/index.htm
  • robots.txt: 웹사이트에 크롤러 같은 로봇들의 접근을 제어하기 위한 규약을 적어놓은 파일.
  • 권고안이라 지킬 의무는 없음. 그치만 윤리적 문제.

print(request)

# <Response [406]>  페이지를 찾을 수 없음. 400번때
# 멜론은 일반 크롤러들에게 방어막을 침
# header를 추가해줘야 함

    HTTP 응답 상태 코드는 웹 서버가 클라이언트에게 반환하는 코드로, 요청이
    성공적으로 처리되었는지를 나타냅니다. 일반적으로 가장 많이 사용되는 응답
    상태 코드는 다음과 같습니다:

    200 OK: 요청이 성공적으로 처리되었음을 나타냅니다. 이는 클라이언트의 요청이
    서버에서 올바르게 처리되었고 요청에 대한 적절한 응답이 반환되었음을
    의미합니다.

    400 Bad Request: 클라이언트의 요청이 잘못되었거나 서버가 이해할 수 없는
    형식으로 되어 있음을 나타냅니다. 예를 들어, 잘못된 매개변수 또는 유효하지
    않은 요청 형식 등이 포함될 수 있습니다.

    401 Unauthorized: 클라이언트가 인증되지 않았거나 유효한 인증 자격 증명을
    제공하지 않았음을 나타냅니다. 서버는 요청을 거부하거나 인증을 요구할 수
    있습니다.

    403 Forbidden: 클라이언트가 요청한 리소스에 대한 액세스 권한이 없음을
    나타냅니다. 서버는 클라이언트의 요청을 이해하였지만, 요청된 작업을 수행할
    권한이 없는 경우에 이 응답 상태 코드를 반환할 수 있습니다.

    404 Not Found: 클라이언트가 요청한 리소스를 찾을 수 없음을 나타냅니다. 즉,
    요청한 URL이 서버에서 처리되지 않는 경우에 이 응답 상태 코드가 반환됩니다.

    위에서 언급한 상태 코드는 몇 가지 예시일 뿐이며, HTTP 응답은 다양한 상태
    코드를 반환할 수 있습니다. 각 상태 코드는 특정한 의미와 클라이언트에 대한
    의도를 가지고 있으며, 클라이언트는 이를 확인하여 적절한 조치를 취할 수
    있습니다.
# User-Agent:
# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
request = requests.get('https://www.melon.com/chart/index.htm', headers=header)
print(request)
# <Response [200]>|
# 이제 응답이 옴

    멜론 웹사이트에 들어가서 크롤링 하려는데,
    request = requests.get('https://www.melon.com/chart/index.htm')
    print(request)  이렇게 코드를 쳤을때는 <Response [406]>가 뜨는데,

    멜론 사이트 들어가서 Network의 Request Headers의 User-Agent 값을 header에 담았더니 다음과 같은 응답이 떴어
    header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
    request = requests.get('https://www.melon.com/chart/index.htm', headers=header)
    print(request)
    <Response [200]>

    이 이유를 코드랑 같이 설명해줘

    ---------------------------------

    : HTTP 응답 상태 코드 406은 "허용되지 않는 미디어 유형"을 나타냅니다.
    이는 클라이언트가 요청한 리소스에 대해 서버가 요청된 미디어 유형을 지원하지
    않는다는 것을 의미합니다.

    첫 번째 코드에서 requests.get('https://www.melon.com/chart/index.htm')로
    요청을 보냈을 때, User-Agent 헤더가 기본값으로 설정되어 있습니다. 멜론
    웹사이트는 브라우저에 의한 접근으로 가정하고, 일부 웹사이트는 자동화된
    스크립트나 봇에 대한 접근을 제한하기 위해 요청의 User-Agent 값을 확인합니다.

    두 번째 코드에서는 headers 매개변수를 사용하여 요청 헤더에 User-Agent 값을
    지정했습니다. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'는 일반적인
    브라우저인 Mozilla Firefox의 User-Agent 값입니다. 이렇게 설정한 User-Agent
    값을 요청에 포함시키면, 서버는 요청을 웹 브라우저로 인식하여 더욱
    정상적으로 처리할 수 있습니다.

    따라서, User-Agent 값을 명시함으로써 브라우저에서 접근하는 것처럼 보이도록
    설정하여 서버가 요청을 받아들일 수 있게 되었고, 응답 상태 코드 200을 받을
    수 있었습니다. 이는 "요청이 성공적으로 처리되었음"을 나타내며, 멜론 차트
    페이지의 내용을 성공적으로 가져왔음을 의미합니다.

 

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
response = requests.get(url, headers=header)
soup = BeautifulSoup(response.text, 'html.parser')

titles = soup.select('div.rank01 span a')
artists = soup.select('div.rank02 span a')

for i, (title, artist) in enumerate(zip(titles, artists)):
    title_text = title.text.strip()
    artist_text = artist.text.strip()
    print('{0:3d}위 {1} - {2}'.format(i+1, artist_text, title_text))

5. 네이버 금융

request = requests.get(site)
print(request)
# <Response [200]> 접속 잘 됨

# 거래량
table_no_info = soup.find('table', {'class':'no_info'})
tds = table_no_info.find_all('td')
print(tds) # td 6개가 찍힘

df.to_excel('naver_finance.xlsx') # 엑셀로 내보내기 실제로 파일에서 엑셀 만들어서 다운 받을 수 있음

과제. 지니뮤직 크롤링

 

# 지니 차트 200위까지 크롤링하기
# 반복문을 사용하여 크롤링
# 수집한 데이터를 데이터프레임으로 저장
# 엑셀로 출력
# 과제는 github로 내보내기
import requests
from bs4 import BeautifulSoup
import pandas as pd

# 빈 데이터프레임 생성
df = pd.DataFrame(columns=['Rank', 'Title', 'Artist'])

# 페이지 수에 맞게 for 루프 실행
for page in range(1, 5):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    songs = soup.select('tr.list')

    # 각 노래 정보 추출하여 데이터프레임에 추가
    for song in songs:
        rank = song.select_one('td.number').text.split()[0]
        title = song.select_one('a.title.ellipsis').text.strip()
        artist = song.select_one('a.artist.ellipsis').text.strip()
        df = df.append({'Rank': rank, 'Title': title, 'Artist': artist}, ignore_index=True)

# 데이터프레임을 엑셀로 내보내기
df.to_excel('genie_chart.xlsx', index=False)