ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BeautifulSoup로 웹 크롤링 하기
    프로그래밍/Python 2017.10.29 22:08

    안녕하세요!! JAY입니다. 오늘은 파이썬으로 웹 크롤링을 해보도록 하겠습니다.

     

    오늘 웹 크롤링을 하기 위해 BeautifulSoup 라는 API를 사용할 것 입니다.


    BeautifulSoup는 HTML과 XML 파일로부터 데이터를 뽑아내기 위한 파이썬 라이브러리입니다. 


    BeautifulSoup 문서 : https://www.crummy.com/software/BeautifulSoup/bs4/doc/


    1. BeutifulSoup 설치


    먼저 pip install beautifulsoup4 명령어로 BeautifulSoup를 설치해 줍니다.


    추가로 우리는 URL을 가지고 크롤링을 해야하기 때문에 urlib패키지의 request모듈을 사용하겠습니다.




    2.  URL 읽어오기

    1
    2
    3
    # -*- coding:UTF-8 -*-
    from bs4 import BeautifulSoup
    import urllib.request


    get_text라는 함수를 만들어 네이버 기사의 내용을 가져와 보도록 하겠습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    URL = 'http://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=031&aid=0000428125'
     
     # 크롤링 함수
    def get_text(URL) :
        source_code_from_URL = urllib.request.urlopen(URL)
        soup = BeautifulSoup(source_code_from_URL, 'html.parser')
        text = ''
        for item in soup.find_all('div', id = 'articleBodyContents') :
            text = text + str(item.find_all(text = True))
     
        return text
     


    urllib.request.urlopen은 URL을 여는 함수입니다. URL 열기에 성공하면 response.status의 값이 200이 나옵니다

    (200은 HTTP 상태 코드이며 서버가 요청을 제대로 처리했다는 뜻입니다).


        print(source_code_from_URL.headers)

        print(source_code_from_URL.code)

        print(source_code_from_URL.read())


    위 코드를 보시면 읽어온 URL의 헤더와, 상태코드, 읽은 값을 출력하여 아래사진처럼 보여줄 수 있습니다.




    다음은 BeautifulSoup를 사용해 데이터를 파싱하는 것입니다. 


    BeautifulSoup는 파이썬 표준 라이브러리에 포함된 HTML 파서를 합니다. 그외에 다른 여러 HTML 파서들 또한 지원합니다.



    BeautifulSoup(source_code_from_URL, 'html.parser') 는 html paraer로 파싱을 하겠다는 말입니다.


    filnd_all함수로 특정 태그와 iD를 읽어옵니다. 크롤링할 웹페이지에서 페이지소스 보기를 하시면 



    div 태그에 id가 articleBodyContents가 있는데, 바로 본문 내용입니다. 저희는 이 본문 내용만 크롤링 하겠습니다.


    3. 크롤링 결과 출력


    마지막으로 크롤링 결과를 확인하기 위해 출력을 해보도록 하겠습니다. 저는 추가로 text에도 저장하도록 하였습니다.


    전체코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    # -*- coding:UTF-8 -*-
    from bs4 import BeautifulSoup
    import urllib.request
     
    # 출력 파일 명
    OUTPUT_FILE_NAME = 'output.txt'
     
     # 긁어올 URL
    URL = 'http://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=031&aid=0000428125'
     
     # 크롤링 함수
    def get_text(URL) :
        source_code_from_URL = urllib.request.urlopen(URL)
        soup = BeautifulSoup(source_code_from_URL, 'html.parser')
        text = ''
        for item in soup.find_all('div', id = 'articleBodyContents') :
            text = text + str(item.find_all(text = True))
     
        return text
     
    # 메인 함수
    def main() :
        open_output_file = open('output.txt''w')
        result_text = get_text(URL)
        open_output_file.write(result_text)
        open_output_file.close()
     
        print(result_text)
        
    if __name__ == '__main__':
        main()
     



    결과


    자 제대로 기사의 본문 내용을 크롤링 한걸 볼 수 있습니다. 


    지금까지 기본적인 BeautifulSoup 사용과 웹 크롤링에 대해서 알아봤습니다.


    공식문서에 보면 설명이 잘 되어있어 사용에 크게 어려움은 없었습니다.


    이상으로 오늘의 포스팅을 마치겠습니다!! 여러분 재밌는 코드 생산하시고 좋은하루 되세요:D

    댓글 1

    • 크롱 2018.06.01 18:38

      안녕하세요. 파이썬으로 포털 사이트 뉴스를 크롤링하는 방법을 찾다가 방문하게 됐습니다.
      아래와 같이 코드를 입력하면 되는지 한번 확인해주실 수 있을까요?

      from bs4 import BeautifulSoup
      import urllib.request

      OUTPUT_FILE_NAME = 'ouput.txt'

      URL='http://news.naver.com/main/hotissue/read.nhn?mid=hot&sid1=100&cid=1079165&iid=2756556&oid=021&aid=0002354829&ptype=052'
      def get_text(URL) :
      source_code_from_URL = urllib.request.urlopen(URL)
      soup = BeautifulSoup(source_code_from_URL, 'html.parser')
      text = ' '
      for item in soup.find_all('div', id = 'articleBodyContents') :
      text = text + str(item.find_all(text = True))

      return text

      def main() :
      open_output_file = open('output.txt', 'w')
      result_text = get_text(URL)
      open_output_file.write(result_text)
      open_output_file.close()

      print(result_text)

      if __name__ == '__main__' :
      main()

      하나 더 문의 드리면, 구글 Colaboratory에서 위와 같이 입력하고 실행버튼을 누를 경우 맨 마지막 명령(if __name으로 시작하는 줄)에 오류가 있다는 메시지가 뜹니다.
      혹 구글 Colab을 쓰신다면, 위와 같은 오류 메시지가 왜 뜨는지도 알려주실 수 있을까요?

운동하는 개발자 JAY-JI