본문 바로가기
Data Science/Data Science

[Data Science] 파이썬 크롤링

by m2162003 2021. 1. 6.

인턴 필수 강의로 듣고 정리하는 파이썬 크롤링^^

데이터과학 수업 들으면서 잠깐 해봤는데 그 때보다 재밌게 배운 것 같다. 과제가 아니라서 재밌나보다.

암튼 배운 내용을 잊지 않기 위해 정리해본다.

 

크롤링에 사용되는 2가지 라이브러리

requests와 BeautifulSoup이다.

예전에 soap으로 써서 오류가 계속 발생했다... ㅠㅠ 이름이 특이한듯......

 

requests 라이브러리

python에서 http요청을 보낼 수 있는 모듈이다.

url을 통해 서버에 요청을 보내서 response를 받아온다. html문서를 받아오는 역할이라고 할 수 있다.

 

BeautifulSoup 라이브러리

받아온 html 문서를 처리하는 모듈이다. 주로 사용하는 건 find와 find_all인듯 싶다.

1. requests 사용법

import requests

url = "https://www.google.com"
res = requests.get(url)
# url에 해당하는 서버에 get 요청을 보내서 response를 받는다. 

res는 response 객체에 해당한다. 

res.status_code하면 응답상태코드를 확인가능하고 res.text하면 html문서 전체를 받는다.

 

2. BeautifulSoup 사용법

from bs4 import BeautifulSoup

soup  = BeautifulSoup(open("index.html"), "html.parser")
# index html문서를 받아와서 파싱한다.

index.html 파일을 열 때에는 저런 식으로 한다. open(파일명) , 받아온 html을 파싱한다는 뜻

 

requests와 같이 사용하면

soup = BeautifulSoup(res.text, "html.parser")

이렇게 하면 url로 요청을 보내서 html 문서를 받아올 수 있다.

 

3. 태그 받아오기

d_tag = soup.find("div", class_="cmt_list")
# class가 cmt_list인 div태그를 받아온다. class는 예약어 이므로 _가 필요하다.

id_tag = soup.find("div", id="hello")
# id도 설정가능

a_tag = soup.find_all("a")
# 기본적으로 find는 첫 번째 결과값만 리턴한다. all은 모든 결과값을 반환한다.

 

이외에도 span이나 strong 키워드를 사용할 수 있다.

 

4. 태그에서 텍스트 불러오기

get_text()를 사용한다. 

for a in div_tag.find_all('a'):
	print(a.get_text())
    
# get_text()는 태그 하나에 적용되므로 find_all을 했다면 각각의 태그에 적용해야 한다.

 

아래는 예제 코드이다. 

import requests
from bs4 import BeautifulSoup


def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환하세요.
    result = []
    
    div_tag = soup.find("div", class_="list_issue")
    a_tags = div_tag.find_all("a")
    for a in a_tags:
        result.append(a.get_text())
    
    return result
    

def main() :
    custom_header = {
        'referer' : 'https://www.naver.com/',
        'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    
    url = "http://www.naver.com"
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")

    # crawling 함수의 결과를 출력합니다.
    print(crawling(soup))


if __name__ == "__main__" :
    main()

댓글