본문 바로가기

크롤링

by 코낄2 2023. 11. 25.

1. 크롤링과 스크레이핑

크롤링은 웹 페이지를 자동으로 탐색하고 그 내용을 수집하는 과정입니다.

스크레이핑은 웹 페이지에서 원하는 정보를 추출하는 과정입니다. 크롤링 후에 데이터를 추출하거나, 특정 웹 페이지의 특정 부분에서 필요한 정보를 가져오는 작업을 포함합니다.

두 기술은 웹 데이터 수집의 초기 및 후속 단계로 사용되며, 데이터 과학, 기계 학습 및 비즈니스 인텔리전스와 같은 다양한 분야에서 활용됩니다. 그러나 웹 사이트의 이용 약관을 준수하고 합법적인 용도로만 사용해야 합니다.

 

2. 기초

import requests
from bs4 import BeautifulSoup

크롤링을 위해 우선 파이썬 라이브러리 requestsBeautifulSoup를 import합니다.

BeautifulSoup은 HTML 및 XML 문서를 파싱하고 검색하기 위한 라이브러리입니다.

HTML 또는 XML 문서를 파이썬 객체로 변환하여 쉽게 탐색하고 데이터를 추출할 수 있습니다. 웹 스크레이핑에서 HTML 페이지의 특정 부분에서 정보를 추출하는 데 자주 사용됩니다.

site = 'https://basicenglishspeaking.com/daily-english-conversation-topics/'
request = requests.get(site)
print(request)
# print(request.text) html을 전부 가져옴
soup = BeautifulSoup(request.text)
divs = soup.find('div', {'class': 'thrv-columns'}) 
print(divs)
  • find 메서드는 HTML 문서에서 첫 번째로 일치하는 요소를 찾습니다.
  • 첫 번째 매개변수는 찾을 태그 이름이나 태그의 조건을 지정하고, 두 번째 매개변수는 해당 태그의 속성과 값을 딕셔너리 형태로 지정합니다.
links = divs.findAll('a')
print(links)

 

  • findAll 메서드는 HTML 문서에서 조건에 맞는 모든 요소를 찾아 리스트로 반환합니다.
  • 첫 번째 매개변수는 찾을 태그 이름이나 태그의 조건을 지정하고, 두 번째 매개변수는 해당 태그의 속성과 값을 딕셔너리 형태로 지정합니다.
for link in links:
    print(link.text)

findAll함수로 찾은 links는 리스트 형식으로 되어있기 때문에 for문을 돌면서 내부 요소를 하나씩 반복하면서 각 요소의 텍스트민 추출합니다.

페이지에서 요소의 위치를 찾는법은 간단합니다. 원하는 요소 위에 커서를 두고 마우스 오른쪽 버튼을 누르고 검사 버튼을 클릭하면 DevTools에서 원하는 요소의 html 위치를 찾아볼 수 있습니다. 혹은 'F12'키를 눌러서 DevTools를 켜고 요소의 구간을 확인할 수 있는 기능을 이용할 수도 있습니다.

맨 밑에 검사버튼 클릭

 

위 코드들을 이용해서 간단히 다음 뉴스기사의 제목을 가져오는 함수를 만들어보겠습니다.

https://v.daum.net/v/20231122080018178 https://v.daum.net/v/20231122050116960 https://v.daum.net/v/20231122082700797

URL의 형태가 같은 주소 뒤에 기사의 코드가 붙는 형식이어서 코드를 받아서 제목을 가져오는 형태의 함수를 구현합니다.

# 뒤에 코드를 던져주면 제목을 뽑아오는 함수

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'})
    if title:
        return title.text.strip()
    return '제목없음'

BeautifulSoup을 이용해 soup에는 request로 받아온 페이지의 텍스트가 전부 담기게 됩니다. 그리고 그 텍스트에서 제목이 있는 자리를 찾아 제목의 공백을 없애고 추출합니다.

3. Robots.txt

robots.txt는 웹 크롤러 또는 웹 스파이더가 웹 사이트를 어떻게 수집하고 어떤 부분을 수집하지 말아야 하는지에 대한 지침을 제공하는 파일입니다.

request = requests.get('https://www.melon.com/chart/index.htm')
print(request)  # <Response [406]>

'멜론뮤직' 사이트에 request.get으로 접근하면 406 에러 페이지를 응답받게됩니다.

클라이언트가 요청한 콘텐츠 형식은 requests 라이브러리를 사용할 때 headers 매개변수를 통해 설정됩니다. 서버는 이 헤더를 검사하고, 지원하지 않는 경우에는 406 Not Acceptable 상태 코드를 반환할 수 있습니다.

가장 일반적인 이유 중 하나는, 웹 사이트에서 스크레이핑을 방지하기 위해 요청에 대한 헤더를 확인하고, 브라우저처럼 보이지 않는 경우에 서비스를 거부하는 것입니다. 이떄는 정상적인 웹 브라우저처럼 보이는 헤더를 추가해야합니다.

 

그 전에 해당 페이지 url뒤에 robots.txt를 추가하여 입력하면 웹 사이트에 크롤러같은 로봇들의 접근을 제어하기 위한 규약이 적힌 파일을 확인 할 수 있습니다. 강제성이 없는 권고안이지만 에티켓과 도덕적인 정신으로 꼭 지키는 것이 좋습니다!

request에 header의 형식을 만들어 함꼐 보내면 정상적인 200페이지를 응답 받을 수 있습니다.

User-Agent는 헤더의 형식을 맞추기 위함일 뿐이어서 꼭 본인의 정보가 아니어도 괜찮습니다.

# User-Agent:
# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.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]>

 

4. 지니뮤직 차트 크롤링 후 파일에 저장하기.

위 코드들을 모두 이용하여 지니 뮤직의 차트를 크롤링 후 엑셀 파일에 저장하는 함수를 만들어보겠습니다. 지니 뮤직 차트는 1~200위가 50개씩 나뉘어서 페이지에 표출되기 때문에 url주소를 이용하여 반복을 돌려주어야 합니다.

import requests
from bs4 import BeautifulSoup
import pandas as pd

def music(num):
    rank = []
    for i in range(1, num+1):
        url = f'https://www.genie.co.kr/chart/top200?ditc=D&ymd=20231122&hh=14&rtm=Y&pg={i}'
        header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
        request = requests.get(url, headers = header)
        soup = BeautifulSoup(request.text)
        td = soup.findAll('td',{'class':'info'})
        for j in td:
            title = j.find('a',{'class':'title'})
            artist = j.find('a',{'class':'artist'})
            rank.append([artist.text.strip(), title.text.strip()])
    return rank

[판다스를 이용하여 엑셀 파일에 함수 결과값 저장]

import pandas as pd

df = pd.DataFrame(music(4), index = range(1, len(music(4))+1))
df.to_excel('music.xlsx')

5. 판다스

판다스(Pandas)는 데이터 조작과 분석을 위한 파이썬 라이브러리로, 특히 표 형식의 데이터나 다양한 형태의 데이터를 다루는 데 효과적입니다. 판다스는 대부분의 경우에 데이터를 구조화하고 처리하는 데 사용되며, 특히 데이터 프레임(DataFrame)이라는 자료구조를 제공합니다.

import pandas as pd

data = 
[{'price': '28,200', 'name': '한화오션', 'code': '042660', 'volum': '1,072,252'}, 
{'price': '1,824', 'name': '대한해운', 'code': '005880', 'volum': '17,245,564'}, 
{'price': '1,184', 'name': 'KNN', 'code': '058400', 'volum': '40,493,663'}, 
{'price': '1,287', 'name': '에코볼트', 'code': '097780', 'volum': '15,805,003'}]

df = pd.DataFrame(data)
df

'' 카테고리의 다른 글

크롤링2  (0) 2023.11.26