1. 크롤링과 스크레이핑

- 크롤링(Crawling) : 인터넷의 데이터를 확용하기 위해 인터넷의 정보들을 수집하는 행위

- 스크레이핑(Scraping): 크롤링 + 데이터를 추출하고 가공하는 행위

 

2. Basig English Speaking

import requests
from bs4 import BeautifulSoup

site = 'https://basicenglishspeaking.com/daily-english-conversation-topics/'
request = requests.get(site) # 리퀘스트를 get방식으로 접속
print(request) #[200] 정상적인 접속

output

더보기

<Response [200]>  #정상적인 접속

print(request.text) #가져온 html 확인
soup = BeautifulSoup(request.text)

# div의 딱 한부분만 가져옴
divs = soup.find('div', {'class':'thrv-columns'})
print(divs)

# div안에 있는 앵커('a')태그만 찾기
links = divs.findAll('a')
print(links)

# 리스트이기 때문에 for문으로 돌면서 텍스트만 찍기
# 앵커태그 안에 있는 텍스트만 가져오기
for link in links:
    print(link.text)

output

더보기

Family
Restaurant
Books
...
Handcraft Items
Plastic Surgery
Success

 

subject = []

for link in links: # (links)에서 앵커태그를 하나씩 링크(link)로 뽑아 빈 리스트에 텍스트가 하나씩 들어감
    subject.append(link.text)
len(subject)

output

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

 

output

더보기

총 75 개의 주제를 찾았습니다.
1. Family
2. Restaurant
3. Books
...
73. Handcraft Items
74. Plastic Surgery
75. Success

3. 다음 뉴스기사

# 제목을 뽑아보는 크롤링

 

크롤링할 기사
#https://v.daum.net/v/20231124152902275

def daum_news_title(news_id):
    url = 'https://v.daum.net/v/{}'.format(news_id)
    request = requests.get(url)
    soup = BeautifulSoup(request.text)
    title = soup.find('h3', {'class':'tit_view'}) # class안 tit_view 찾기

    if title:
        return title.text.strip()
    return '제목없음'

 

 

daum_news_title('20231124152902275')

output

더보기

' 김유정 "이상이와 1년간 매일같이 보고 있어, 어색할까 걱정" (\'마이 데몬\') '

daum_news_title('20231124144808698')

output

더보기

'한효주, 美에미상 빛냈다..'큰칼' 잊게 만든 우아美+유창한 영어 [종합]'

 

 

 

 

 

 

4. 벅스 뮤직차트

벅스차트
# https://music.bugs.co.kr/chart


request = requests.get('https://music.bugs.co.kr/chart')
soup = BeautifulSoup(request.text)

titles = soup.findAll('p', {'class':'title'}) # findAll : 선택한 항목의 모든요소 찾기
#print(titles)
artists = soup.findAll('p',{'class':'artist'})
#print(artists)

for i, (t, a) in enumerate(zip(titles, artists)):
    title = t.text.strip().replace('[19금]\n', '') # replace -> 19금 -> ''변경
    artist = a.text.strip().split('\n')[0] # 스플릿으로 문자열을 나눈 후 공백을 삭제후 첫번째 요소만 출력
    print('{0:3d}위 {1} - {2}'.format(i+1, artist, title))

 

# enumerate :  반복문을 사용할 때 인덱스와 값을 함께 가져오기 위해 사용되는 내장 함수
# zip 함수 :  zip() 함수는 파이썬에서 여러 개의 반복 가능한(iterable) 객체를 병렬적으로 묶어주는 내장 함수

 

output

더보기

1위 ATEEZ(에이티즈) - 미친 폼 (Crazy Form)
2위 태연 (TAEYEON) - To. X
3위 LE SSERAFIM (르세라핌) - Perfect Night
...
98위 탑현 - 나에게 그대만이
99위 케이시 - 사실말야내가말야그게그러니까말이야
100위 KISS OF LIFE - Sugarcoat (NATTY Solo)

 

 

 

 

5. 멜론차트

  • robots.txt : 웹 사이트에 크롤러같은 로봇들의 접근을 제어하기 위한 규약 (권고안이라 꼭 지킬 의무는 없음) (https://www.melon.com/robots.txt)
멜론차트
#https://www.melon.com/chart/index.htm

request = requests.get('https://www.melon.com/chart/index.html')
print(request)
output
<Response [406]> #406번은 정보를 가져오지 못한 것

 

titles = soup.findAll('div class',{'class' : 'title'})
print(titles)
ouput
[] 

 

 

 

이럴땐 User-Agent가 필요

User-Agent

# User-Agent
# Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'}
request = requests.get('https://www.melon.com/chart/index.html',headers=header)
print(request)
output
<Response [200]>

 

 

titles = soup.findAll('div',{'class':'rank01'})
#print(titles)
artists = soup.findAll('span',{'class':'checkEllipsis'})
#print(artists)

for i, (t, a) in enumerate(zip(titles, artists)):
    title = t.text.strip().replace('19금\n','')#split('\n')
    artist = a.text.strip()
    print('{0:3d}위 {1} - {2}'.format(i+1, artist, title))
output
1위 LE SSERAFIM (르세라핌) - Perfect Night
2위 aespa - Drama
3위 IVE (아이브) - Baddie
...
98위 최유리 - 숲
99위 케이시 (Kassy) - 사실말야내가말야그게그러니까말이야
100위 BE'O (비오) - 미쳐버리겠다 (MAD)

 

 

 

 

6. 네이버증권

 
# 이름, 가격, 종목코드, 거래량
# 그린리소스, (가격 : 52,300, 종목코드 : 402490, 거래량 : 34,192,513))
# {'name':'그린리소스, 'price':52300, code: '402490', 'volume': 34192513}

 

request = requests.get('https://finance.naver.com/item/main.naver?code=402490')
soup = BeautifulSoup(request.text)

# 이름
div_totalinfo = soup.find('div', {'class':'new_totalinfo'})
name = div_totalinfo.find('h2').text

# 가격
div_today = div_totalinfo.find('div', {'class':'today'})
em = div_today.find('em')
price = div_today.find('span',{'class':'blind'}).text

# 종목코드
div_code = div_totalinfo.find('div', {'class':'description'})
code = div_code.find('span',{'class':'code'}).text

# 거래량
table_no_info = soup.find('table',{'class','no_info'})
tds = table_no_info.findAll('td')
volume = tds[2].find('span',{'class':'blind'}).text

# 딕셔너리
dic = {'name': name, 'code':code, 'price':price, 'volume':volume}
print(dic)

 

 

네이버증권 종목코드로 정보추출하는 함수

 

def naver_finance(code):
    # 코드
    site = f'https://finance.naver.com/item/main.naver?code={code}'
    request = requests.get(site)
    soup = BeautifulSoup(request.text)

    # 이름
    div_totalinfo = soup.find('div', {'class':'new_totalinfo'})
    name = div_totalinfo.find('h2').text

    # 가격
    div_today = div_totalinfo.find('div', {'class':'today'})
    em = div_today.find('em')
    price = em.find('span', {'class':'blind'}).text

    # 거래량
    table_no_info = soup.find('table', {'class':'no_info'})
    tds = table_no_info.findAll('td')
    volume = tds[2].find('span', {'class':'blind'}).text

    dic = {'name':name, 'code':code, 'price':price, 'volume':volume}
    return dic

 

naver_finance('252670')
output
{'name': 'KODEX 200선물인버스2X',
'code': '252670',
'price': '2,580',
volume': '79,577,748'}

 

naver_finance('032790')
output
{'name': '엠젠솔루션',
'code': '032790',
'price': '1,928',
'volume': '692,851'}

 

codes = ['017040', '007980', '352090', '402490', '032790']
data = []
for code in codes:
    dic = naver_finance(code)
    data.append(dic)
print(data)
output
[{'name': '광명전기', 'code': '017040', 'price': '2,430', 'volume': '757,418'}, {'name': '태평양물산', 'code': '007980', 'price': '2,985', 'volume': '3,630,259'}, {'name': '스톰테크', 'code': '352090', 'price': '12,510', 'volume': '803,272'}, {'name': '그린리소스', 'code': '402490', 'price': '34,750', 'volume': '1,371,371'}, {'name': '엠젠솔루션', 'code': '032790', 'price': '1,928', 'volume': '692,851'}]

 

 

 

# 데이터프레임 생성

# pandas: 데이터를 2차원으로 바꿔주는 기능

import pandas as pd
df = pd.DataFrame(data)
df
output

 

# 자료를 엑셀로 변환

df.to_excel('naver_finace.xlsx') # 자료 -> 엑셀 변환

 

 

 

 

# 지니뮤직
# https://www.genie.co.kr/
# ...
# import time을 이용
# time.sleep(3)
# 지니차트 1 ~ 200위까지 크롤링해서 엑셀로 만들기
import time
import requests
import pandas as pd
from bs4 import BeautifulSoup

# 상위 200위까지 출력
data = []
for j in range(1, 5):  # 페이지는 1에서 4까지
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
    request = requests.get(f'https://www.genie.co.kr/chart/top200?ditc=D&ymd=20231124&hh=21&rtm=Y&pg={j}', headers=header)
    soup = BeautifulSoup(request.text)

    table = soup.find('table', {'class': 'list-wrap'})
    titles = table.findAll('a', {'class': 'title ellipsis'})
    artist = table.findAll('a', {'class': 'artist ellipsis'})
    number = soup.findAll('td', {'class': 'number'})

    for i, (n, t, a) in enumerate(zip(number, titles, artist)):
        numbers = n.text.strip().split('\n')[0]
        titles = t.text.strip().replace('19금', '').lstrip()  # 19금 아이콘 제거
        artists = a.text.strip()
        dic =('{0}위 {1} - {2}'.format(numbers, artists, titles))
        data.append(dic)
    time.sleep(2)

 

df = pd.DataFrame(data)
df

 

output

 

 

df.to_excel('지니.xlsx')
지니.xlsx 파일

 

 

 

'컴퓨터 비전 > 웹 서비스' 카테고리의 다른 글

FastAPI  (0) 2023.12.16
Streamlit  (2) 2023.12.03
픽사베이  (1) 2023.12.03
인스타그램  (1) 2023.12.03
셀레니움  (0) 2023.12.02