반응형


Beautiful Soup를 사용하여 간단한 웹 크롤러를 만드는 방법을 다루고 있습니다.

Python 3.6으로 코드를 작성하였습니다. 버전의 차이로 필요한 모듈이 달라질 수도 있습니다.



웹 크롤러(Web Crawler)는 웹문서, 이미지 등을 주기적으로 수집하여 자동으로 데이터베이스화하는 프로그램입니다.  웹 크롤러가 하는 작업을 웹 크롤링(Web Crawling)이라고 부릅니다.


보통 웹 크롤러를 사용하여  웹문서의 복사본을 생성합니다. 검색 엔진은 이렇게 생성된 데이터를 인덱싱하여 빠른 검색을 할 수 있도록 합니다.



웹 페이지의 내용을 가져오는 간단한 웹 크롤러를 만들어 보겠습니다.



시작하기 전에 requests와 beautifulsoup4 패키지를 설치해줘야 합니다.


pip install requests beautifulsoup4




1. 웹 문서 전체 가져오기

urlopen 함수를 사용하여 원하는 주소로부터 웹페이지를 가져온 후,  BeautifulSoup 객체로 변환합니다.

BeautifulSoup 객체는 웹문서를 파싱한 상태입니다. 웹 문서가 태그 별로 분해되어 태그로 구성된 트리가 구성됩니다.

포함하는 태그가 부모가 되고 포함된 태그가 자식이 되어 트리를 구성하고 있습니다.

예를 들어 html 태그아래에 head와 body 태그가 존재하고 다시 head와 body 태그 아래에 하위 태그가 존재합니다.


파싱이란 일련의 문자열로 구성된 문서를 의미 있는 토큰(token)으로 분해하고  토큰으로 구성된 파스 트리(parse tree)를 만드는 것입니다.


from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://www.naver.com")  

bsObject = BeautifulSoup(html, "html.parser")


print(bsObject) # 웹 문서 전체가 출력됩니다.



<!DOCTYPE doctype html>


<html class="svgless" lang="ko">

<head>

<meta charset="utf-8"/>

<meta content="origin" name="Referrer"/>

<meta content="text/javascript" http-equiv="Content-Script-Type"/>

<meta content="text/css" http-equiv="Content-Style-Type"/>

<meta content="IE=edge" http-equiv="X-UA-Compatible"/>

<meta content="width=1100" name="viewport"/>

<meta content="NAVER" name="apple-mobile-web-app-title">

<meta content="index,nofollow" name="robots">

<meta content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요" name="description">

<meta content="네이버" property="og:title"/>

<meta content="https://www.naver.com/" property="og:url"/>


. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


</script>

</body>

</html>





2. 타이틀 가져오기

태그로 구성된 트리에서 title 태그만 출력합니다.


from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://www.naver.com")
bsObject = BeautifulSoup(html, "html.parser")

print(bsObject.head.title)


<title>NAVER</title>




3. 모든 메타 데이터의 내용 가져오기

웹문서에서 메타 데이터만 찾아서 content 속성값을 가져옵니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("https://www.python.org/about")
bsObject = BeautifulSoup(html, "html.parser")


for meta in bsObject.head.find_all('meta'):
   print(meta.get('content'))


None

IE=edge

Python.org

The official home of the Python Programming Language

Python.org

yes

black

width=device-width, initial-scale=1.0

True

telephone=no

on

false

/static/metro-icon-144x144-precomposed.png

#3673a5

#3673a5

The official home of the Python Programming Language

Python programming language object oriented web free open source software license documentation download community

website

Python.org

Welcome to Python.org

The official home of the Python Programming Language

https://www.python.org/static/opengraph-icon-200x200.png

https://www.python.org/static/opengraph-icon-200x200.png

https://www.python.org/about/




..


..


4. 원하는 태그의 내용 가져오기

find를 사용하면 원하는 태그의 정보만 가져올 수 있습니다.


예를 들어 www.python.org/about 에서 다음 태그의 content 속성값을 가져오려면..

<meta content="The official home of the Python Programming Language" name="description"/>



우선 웹문서에 있는  meta 태그 중 가져올 태그를 name 속성 값이 description인 것으로 한정합니다.


print (bsObject.head.find("meta", {"name":"description"}))


<meta content="The official home of the Python Programming Language" name="description"/>




meta 태그의 content 내용을 가져옵니다.


print (bsObject.head.find("meta", {"name":"description"}).get('content'))


The official home of the Python Programming Language



전체 소스코드입니다.


from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("https://www.python.org/about")
bsObject = BeautifulSoup(html, "html.parser")


print (bsObject.head.find("meta", {"name":"description"}).get('content'))




5. 모든 링크의 텍스트와 주소 가져오기

a 태그로 둘러싸인 텍스트와 a 태그의 href 속성을 출력합니다.


from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("https://www.naver.com")
bsObject = BeautifulSoup(html, "html.parser")

for link in bsObject.find_all('a'):
   print(link.text.strip(), link.get('href'))


C:\Users\webnautes\PycharmProjects\Python_Project\venv\Scripts\python.exe C:/Users/webnautes/PycharmProjects/Python_Project/1.py

뉴스스탠드 바로가기 #news_cast

주제별캐스트 바로가기 #themecast

타임스퀘어 바로가기 #time_square

쇼핑캐스트 바로가기 #shp_cst

로그인 바로가기 #account

네이버 /

네이버를 시작페이지로 http://help.naver.com/support/alias/contents2/naverhome/naverhome_1.naver

쥬니어네이버 http://jr.naver.com

해피빈 http://happybean.naver.com/main/SectionMain.nhn


. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


공지사항 //www.naver.com/NOTICE

서비스 전체보기 more.html

바로가기 https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EA%BD%83

프로젝트 꽃 https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EA%BD%83

다운받기 http://whale.naver.com/

네이버웨일 http://whale.naver.com/

크리에이터 http://www.navercorp.com/ko/service/creators.nhn

스몰비즈니스 http://www.navercorp.com/ko/service/business.nhn

비즈니스 파트너 안내 http://business.naver.com/guide.html

비즈니스 · 광고 http://business.naver.com/service.html

스토어 개설 https://sell.storefarm.naver.com/#/home/about

지역업체 등록 https://smartplace.naver.com/

네이버 개발자센터 http://developers.naver.com

오픈 API https://developers.naver.com/docs/common/openapiguide/#/apilist.md/

오픈소스 http://naver.github.io/

네이버 D2 http://d2.naver.com/

네이버 랩스 http://www.naverlabs.com/

회사소개 http://www.navercorp.com/

인재채용 http://recruit.navercorp.com/naver/recruitMain

제휴제안 https://www.navercorp.com/ko/company/proposalGuide.nhn

이용약관 /policy/service.html

개인정보처리방침 /policy/privacy.html

청소년보호정책 /policy/youthpolicy.html

네이버 정책 /policy/spamcheck.html

고객센터 https://help.naver.com/

NAVER Corp. http://www.navercorp.com/




관련 글


[Python/웹 크롤링(Web Crawling) 강좌] - 파이썬 웹 크롤링(Web Crawling) 강좌 - 2. 교보문고 베스트셀러 책이름, 저자, 가격 출력하기


[Python/웹 크롤링(Web Crawling) 강좌] - 파이썬 웹 크롤링(Web Crawling) 강좌 - 3. 네이버 베스트셀러 책이름, 저자, 가격 출력하기



[Python/웹 크롤링(Web Crawling) 강좌] - 웹크롤링 강좌 - 기상청의 동네예보 가져오기







반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. 박재완 2018.12.05 11:30

    좋은 강의 감사합니다.

    우분투에서만 그런건지 최근 바뀐것인지는 모르겠지만

    # -*- coding: utf-8 -*-
    from urllib2 import urlopen

    urlopen 하는 모듈의 선언을 이렇게 해줘야 작동합니다. 모듈 오류나신 분들은 참고해주세요. 혹시 몰라 참고용으로 올려봅니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.12.05 11:52 신고

      글 남겨주셔서 감사합니다.^^

      파이썬 버전에 따라서 urlopen이 포함된 모듈이 달라서 생기는 문제입니다.

      포스팅시 사용한 버전은 3.6입니다.
      혹시 버전이 어떻게 되는지 남겨주시면 다른 분들한테 도움이 될듯합니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.12.05 12:04 신고

      안내문을 포스팅에도 추가해놓았습니다.

  2. 박재완 2018.12.06 08:45

    아 python 3 에서는 원래 올려주셨던 코드가 정상 작동합니다.
    저는 우분투 16.4에 python 2.7.12 버전 사용을 하니 from urllib.request import urlopen 해당 모듈을 불러오는 것이 작동 하지 않았던 거였습니다.

    버전에 따라 다른 거였군요... 또 배워 갑니다.

  3. ㅇㅇ 2018.12.11 20:59

    라즈베리파이를 사용해서 하려는데 importerror : no module named 'bs4' 가 뜨면서 안되네요...
    pip3로 설치하려고하면 붉은 글씨로 설치가 안되는듯 하고 ..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.12.11 21:03 신고

      포스팅이 Python3를 기준으로 하기 때문에 라즈베리파이라도 pip3로 설치하면 문제 없을듯한데.. 어떤 에러가 발생하나요?

      에러 메시지를 알려주세요

  4. ㅇㅇ 2019.01.16 18:01

    from urllib.request import urlopen
    from bs4 import BeautifulSoup

    html = urlopen("http://www.naver.com")
    bsObject = BeautifulSoup(html, "html.parser")

    print(bsObject) # 웹 문서 전체가 출력됩니다.

    C:\Users\Administrator\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/untitled/22.py
    Traceback (most recent call last):
    File "C:/Users/Administrator/PycharmProjects/untitled/22.py", line 2, in <module>
    from bs4 import BeautifulSoup
    ModuleNotFoundError: No module named 'bs4'

    Process finished with exit code 1

    이렇게 나옵니다

    뭐가 문제일까요..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.01.16 18:07 신고

      다음처럼 설치하고 다시 해보세요

      pip install requests beautifulsoup4

  5. 크레용 2019.05.07 21:07

    이것까지는 되는데 웹사이트에 복붙할려면 어떻게해야하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.07 21:12 신고

      웹사이트에서 포스트에 있는 코드를 사용하려는 건가요? 그렇게 까지는 진행 못해봤습니다..

  6. Favicon of https://xorms0707.tistory.com BlogIcon 새끼개발자 2019.06.12 10:56 신고

    잘보고 갑니다 centos7 기반 파이썬3은 잘작동되네요

  7. 궁금 2019.12.02 17:26

    잘봤습니다, 근데 만약 모바일로만 볼수 있는 사이트가 있다면 파이썬 코딩시 해당 페이지를 모바일 모드로 열수 있는 방법은 없을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.02 22:46 신고

      모바일 웹브라우저로 봤을때 주소가 모바일용 주소로 바뀐다면 가능하지만

      반응형 웹처럼.. 화면 크기에 맞추어 변하는 경우에는 어떻게 해야 할지 모르겠네요.

  8. wintrover 2020.01.09 11:57

    ���մ��� �ٷΰ��� #news_cast
    ������ij��Ʈ �ٷΰ��� #themecast
    Ÿ�ӽ����� �ٷΰ��� #time_square
    ����ij��Ʈ �ٷΰ��� #shp_cst
    �α��� �ٷΰ��� #account
    NAVER Whale

    한글이 이렇게 깨지게 출력이 되는데 방법이 없을까요?

  9. seohyogi@gmail.com 2020.05.15 21:01

    python crawling 하다 잘 안되는 부분이 있어요.
    <div data-v-5f6f4bad="" class="fco-toggle-list">

    이런 Html 을 갖어올려면
    soup.findAll('div', class_="fco-toggle-list")
    이런 방식으로 했더니 값을 못갖고 오는데 혹시 코멘트 해주실만한 내용 있으면 부탁드립니다.

  10. 곽자섭 2020.06.10 19:20

    정말 감사합니다~~

  11. 투더리 2020.07.01 18:17

    좋은 글 감사합니다....
    크롤링 해본적이 없어 이곳저곳 찾아보다가 들어왔습니다.
    이 글을 보고 http://kr.investing.com/indices/south-korea-indices 을 크롤링하려고 했는데 안되더라구요...
    이유를 찾아보니... 요청헤더에 User-Agent 라는 부분이 없으면 이놈들이 403을 리턴하네요...
    하여간 잘보고 갑니다...

+ Recent posts