크롤링 방법 | 파이썬 웹 크롤링 하기 – 너무 간단해서 민망합니다. 24 개의 새로운 답변이 업데이트되었습니다.

당신은 주제를 찾고 있습니까 “크롤링 방법 – 파이썬 웹 크롤링 하기 – 너무 간단해서 민망합니다.“? 다음 카테고리의 웹사이트 ppa.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 기술노트with 알렉 이(가) 작성한 기사에는 조회수 55,181회 및 좋아요 617개 개의 좋아요가 있습니다.

2. 크롤링(crawling) 이해 및 기본
  1. HTML 페이지를 가져와서, HTML/CSS등을 파싱하고, 필요한 데이터만 추출하는 기법
  2. Open API(Rest API)를 제공하는 서비스에 Open API를 호출해서, 받은 데이터 중 필요한 데이터만 추출하는 기법

크롤링 방법 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 파이썬 웹 크롤링 하기 – 너무 간단해서 민망합니다. – 크롤링 방법 주제에 대한 세부정보를 참조하세요

#파이썬#웹크롤링#크롤링#방법 간단하게 웹 사이트 크롤링하는 거 설명드려요~
소스입니다.
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen(\”https://news.naver.com/\”)
bsObject = BeautifulSoup(html, \”html.parser\”)
#for link in bsObject.find_all(‘a’):
# print(link.text.strip(), link.get(‘href’))
for link in bsObject.find_all(‘img’):
print(link.text.strip(), link.get(‘src’))

크롤링 방법 주제에 대한 자세한 내용은 여기를 참조하세요.

문과생도 할 수 있는 웹 크롤링 (1) – 웹 데이터 크롤링 준비

데이터 수집 방법. 크롤링 기법은 내가 생각하기에 크게 4가지로 구분된다고 생각한다. 서비스에서 제공하는 오픈 API 활용 …

+ 자세한 내용은 여기를 클릭하십시오

Source: sacko.tistory.com

Date Published: 7/27/2021

View: 3311

합법적으로 ‘웹 크롤링’하는 방법 (上) – 요즘IT

이름에서도 알 수 있듯 웹 크롤러는 웹 크롤링을 실행하는 하나의 프로그램을 의미합니다. 종합해보면 웹 상의 존재하는 데이터를 자동적으로 탐색할 수 …

+ 여기에 표시

Source: yozm.wishket.com

Date Published: 8/28/2022

View: 6465

[파이썬] Python 웹페이지 크롤링 하는 방법(뉴스 긁어오기)

파이썬 언어로 크롤링 하는 방법. 다음은 뉴스타파 뉴스 웹사이트의 “세금도둑추적2020” 뉴스 크롤링 하는 예제입니다. 뉴스부분의 HTML을 파싱하기 …

+ 여기에 보기

Source: www.naragara.com

Date Published: 8/4/2021

View: 1439

파이썬 웹 크롤링(Web Crawling) 강좌 – 1. 웹페이지 긁어오기

Beautiful Soup를 사용하여 간단한 웹 크롤러를 만드는 방법을 다루고 있습니다. Python 3.6으로 코드를 작성하였습니다. 버전의 차이로 필요한 모듈 …

+ 더 읽기

Source: webnautes.tistory.com

Date Published: 7/19/2021

View: 2426

[1] 웹 페이지 크롤링하기(Web Crawling) – Xsop의 개발일기

많은 사람들이 크롤링이랑 스크래핑이란 헷갈려합니다. 스크래핑은 ‘인터넷에서 존재하는 데이터를 컴퓨터 프로그램을 통하여 자동화된 방법으로 웹 …

+ 여기에 자세히 보기

Source: xsop.tistory.com

Date Published: 2/1/2022

View: 676

[Python] 데이터 수집을 위한 웹 크롤링(Crawling)

키워드로 검색한 화면 자동 캡처 후 저장하는 방법. from selenium import webdriver from urllib.parse import quote_plus import time # 필요한 옵션 …

+ 자세한 내용은 여기를 클릭하십시오

Source: ddit-jhkim.tistory.com

Date Published: 10/25/2021

View: 3689

BeautifulSoup와 requests로 웹 파싱해보기 – 파이썬 실습

… requests 패키지를 이용하여, 가비아 라이브러리 홈페이지의 게시글들을 파싱하는 방법을 소개합니다. 들어가기 전 본문으로 들어가기 전, 먼저 크롤링(Crawling), …

+ 여기에 보기

Source: library.gabia.com

Date Published: 8/15/2022

View: 2259

자바스크립트로 크롤러 만들기 3편: 다양한 유형의 웹페이지 …

cheerio : 로드된 HTML을 파싱하여 DOM을 생성하는 라이브러리입니다. 웹 브라우저에서 제공하는 DOM 인터페이스와는 사용 방법이 좀 다르지만 구현된 …

+ 자세한 내용은 여기를 클릭하십시오

Source: www.letmecompile.com

Date Published: 10/15/2022

View: 1695

주제와 관련된 이미지 크롤링 방법

주제와 관련된 더 많은 사진을 참조하십시오 파이썬 웹 크롤링 하기 – 너무 간단해서 민망합니다.. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

파이썬 웹 크롤링 하기 - 너무 간단해서 민망합니다.
파이썬 웹 크롤링 하기 – 너무 간단해서 민망합니다.

주제에 대한 기사 평가 크롤링 방법

  • Author: 기술노트with 알렉
  • Views: 조회수 55,181회
  • Likes: 좋아요 617개
  • Date Published: 2020. 6. 24.
  • Video Url link: https://www.youtube.com/watch?v=aYwg1H5BK04

웹크롤링 기본: 크롤링(crawling) 이해 및 기본

import requests from bs4 import BeautifulSoup res = requests . get ( ‘http://media.daum.net/digital/’ ) soup = BeautifulSoup ( res . content , ‘html.parser’ ) # find_all() 메서드를 사용해서 태그와 클래스이름으로 링크가 걸려있는 기사 타이틀을 가져오기 [ —————————————————— ] for num in range ( len ( link_title )): print ( link_title [ num ] . get_text () . strip ())

문과생도 할 수 있는 웹 크롤링 (1) – 웹 데이터 크롤링 준비

시중에 나와 있는 책은 대부분 API를 이용해 데이터를 수집하는 차원의 웹 크롤링을 소개하는 것이 대부분이다. 공인된 서적이 제공할 수 있는 내용적 한계 때문인 듯 하다. 크롤링(crawling)이라는 것은 합법과 범법 사이에서 아슬아슬한 줄타기를 하는 작업이기 때문에 그와 관련된 내용을 public하게 출판하는 것은 위험 소지가 있다.

※ 따라서 “문과생도 할 수 있는 웹 크롤링”은 시중 책에서 제공하지 못하는 내용을 중심으로 정말 우리가 웹에서 수집하고 싶은 데이터를 어떻게 수집할 수 있는지 그 방법과 도구들을 논하고자 한다. 그리고 파이썬과 기본적인 웹 크롤링(정적 홈페이지)을 다루는 것은 다른 많은 블로그나 책에서 다루기 때문에 여기서는 정말 수집하고 싶은… 사이트의 데이터 수집 방법을 다루겠다.

웹 데이터 크롤링 준비

문과생도 할 수 있는 웹 크롤링 (1)

바야흐로 빅데이터 시대… 데이터 크롤링은 사실 이과생들보다는 문과생들이 더 필요로 한다. 수요가 많은 만큼 인터넷이나 시중에 참고 자료가 널려있다. 왕초보도 할 수 있는 웹크롤링… 이라든가…. 서점에 가면 크롤링과 관련된 수많은 책을 찾아볼 수 있을 것이다.

불법의 여지가 있는 부분을 제하고 이 포스팅에서 얼마나 많은 내용을 다룰 수 있을지는 모르겠지만 최소한 크롤링에 필요한 개념이나 도구(라이브러리, 패키지)들은 소개할 수 있도록 노력하겠다.

데이터 수집 방법

크롤링 기법은 내가 생각하기에 크게 4가지로 구분된다고 생각한다.

서비스에서 제공하는 오픈 API 활용 HTML 태그 정보를 기반으로 원하는 내용 부분 수집 서버와 브라우저 간의 Network를 분석하여 필요한 데이터 수집 사람이 브라우저를 직접 동작하는 것처럼 프로그램을 만들어서 데이터 수집

시중에 나와 있는 책의 내용 중 80%는 1번에 초점을 맞춰서 씌어져 있다. 19%는 2번에 초점을 맞춰서… 3번과 4번은 거의 다루질 않는다. 다루는 책을 보긴 하였으나 기회가 되면 해당 책은 다음에 소개하도록 하겠다.

‘문과생도 할 수 있는 웹 크롤링’은 3번과 4번 그중에서도 4번에 집중하여서 4번을 하기 위해 필요한 방법과 도구들을 정리하려고 한다. 실제 데이터를 수집해서 어떤 프로젝트를 하려하거나 논문을 쓴다거나 하려는 이들에게 도움이 되었으면 좋겠다.

활용 도구

Python 3.5 이상

selenium, scrapy 라이브러리

Firefox 브라우저

Pre-Requisite

크롤링을 시작하기 전에 다음 사항들을 알면 좋다. 쉽게 찾아서 배울 수 있는 좋은 많은 사이트들과 자료들이 있다. 필요하면 따로 소개할 수 있도록 하겠다.

웹(Web) 개념

HTML 구조 및 태그

CSS 선택자(selector) 개념

간단한 JavaScript 개념 및 동작 방법에 대한 이해

파이썬 기초

합법적으로 ‘웹 크롤링’하는 방법 (上)

빅데이터 분석이 점차 강조됨에 따라 많은 기업과 학생들이 데이터 확보에 열을 올리고 있습니다. 하지만 기업 입장에서는 비즈니스를 진행하며 자연스럽게 데이터가 쌓이는 경우가 많지만, 학생이나 일반 개인 입장에서는 그렇지 않습니다. 그렇기 때문에 많은 사람들이 실행하는 것이 바로 웹 크롤링(Web Crawling)입니다. 웹 크롤링을 통해 원하는 데이터를 직접 수집하여, 그 데이터를 바탕으로 분석을 해 인사이트를 도출하거나 머신러닝을 진행합니다.

물론 일반 개인이 아니라 기업 입장에서도 웹 상에 존재하는 데이터는 중요합니다. 고객 한 사람 한 사람의 의견을 직접적으로 파악할 수 있으며, SNS나 커뮤니티에 존재하는 데이터는 트렌드를 파악하는데 가장 중요한 역할을 하기도 합니다. 이러한 데이터를 수집하기 위해 기업 역시 웹 크롤링을 진행합니다. 하지만 웹 크롤링은 명확한 장점이 있는 반면 많은 사고를 일으키기도 합니다. 이번 시간에는 웹 크롤링이 무엇인지, 웹 크롤링을 함부로 수행할 시 일어나는 위험에는 어떤 것이 있는지 알아보도록 하겠습니다.

웹 크롤링의 정의

: 웹 상의 데이터를 자동으로 수집하는 웹 크롤링

웹 크롤링(Web Crawling)이란 기본적으로 웹 상에 존재하는 데이터를 자동적으로 탐색하는 행위를 의미합니다. 여기서 말하는 ‘웹’은 흔히 알고 있는 World Wide Web의 그 웹입니다. 결국 조금 더 쉽게 표현하자면, 인터넷 상에 존재하는 데이터를 자동적으로 탐색하는 행위를 웹 크롤링이라고 합니다. 가끔 웹 크롤링이 아니라 스파이더링(Spidering)이라는 단어를 사용할 때도 있습니다. 여기서 웹 크롤링과 스파이더링은 완전한 동의어라고 이해해도 좋습니다. 관련해서 웹 크롤러(Web Crawler)라는 단어도 있습니다. 영어 단어를 살펴보면 er이라는 단어가 들어가 있는 형태입니다. 이름에서도 알 수 있듯 웹 크롤러는 웹 크롤링을 실행하는 하나의 프로그램을 의미합니다. 종합해보면 웹 상의 존재하는 데이터를 자동적으로 탐색할 수 있도록 특별한 시스템을 구축한 것이 웹 크롤러, 그러한 웹 크롤러를 통해 실제로 탐색 행위를 실천하는 것이 웹 크롤링입니다.

사전적인 의미 상 웹 크롤링은 단순히 데이터를 탐색하는 행위만을 의미합니다. 하지만 실제로 많은 개발자, 분석가, 데이터 과학자들이 웹 크롤링을 수행하는 것은 단순 탐색을 위한 것이 아닙니다. 웹 크롤링은 데이터를 탐색, 원하는 조건에 맞는 데이터를 직접 수집하고 저장까지 하기 위한 목적이 큽니다. 그렇기에 웹 크롤링이라고 일반적으로 말하는 것은 데이터의 저장까지의 과정을 모두 포함합니다. 정확한 사전적 의미와 실질적 의미에 어느 정도 차이가 있다고 볼 수 있습니다.

웹 크롤링 vs 웹 스크래핑

인터넷에 ‘웹 크롤링’을 검색해보면 연관어로 자주 나오는 단어 중 하나가 웹 스크래핑입니다. 웹 스크래핑(Web Scraping)이란 웹 사이트 상에서 원하는 정보를 추출하는 방법을 의미합니다. 아무래도 웹 크롤링과 웹 스크래핑은 기본적으로 유사한 의미를 지니다 보니 혼용되어 많이 쓰이기도 하고 어떤 단어를 써야 하는가에 대해서 논란을 야기하기도 합니다. 사실 엄격히 말하면 웹 크롤링과 웹 스크래핑은 명확히 구분 지어 사용해야 하는 단어입니다. 원칙적으로 웹 크롤링은 탐색에만 그 기능이 제한되어 의미를 함양하고 있는 반면, 웹 스크래핑은 정보 추출에 초점을 맞추고 있기 때문입니다. 이러한 미묘한 의미 차이 때문에 어떤 사람들은 스크래핑이라는 단어가 크롤링보다 더 큰 개념이라고 이야기하는 사람도 있고, 애초에 아예 다른 개념이다라고 이야기를 하는 사람도 있습니다.

실제로 일반 개인이나 학생이 웹 상의 데이터를 수집하는 과정을 보면, 프로그램에게 자동적으로 브라우저를 탐색하게 하고, 그 중 원하는 정보만을 따로 추출하도록 프로세스를 구성합니다. 웹 크롤링의 요소도 포함하고 웹 스크래핑의 요소도 포함한다고 볼 수 있습니다. 그렇기에 사실상 웹 상의 데이터를 탐색하고 수집하는 것 자체는 웹 크롤링이나 웹 스크래핑 중 어떤 단어를 써도 무조건 틀린 단어 선택이라고는 볼 수 없습니다. 일반적으로 웹 스크래핑보다는 웹 크롤링이라는 단어를 더 자주 쓰는 경향이 있기에, 이번 시간에는 웹 크롤링으로 용어를 통일해서 관련된 이야기를 이어 나가보도록 하겠습니다.

웹 크롤링이 문제가 되는 경우

앞서 이야기했듯 웹 크롤링은 웹 상에 존재하는 데이터를 내가 원하는 내용으로, 원하는 수량만큼 수집할 수 있다는 점에서 큰 장점을 지니고 있습니다. 그래서 많은 데이터 분석가나 데이터 과학자들이 웹 크롤링을 시도하고 있습니다. 하지만 웹 크롤링 수행이 문제가 되는 경우가 있습니다. 경우에 따라서 웹 크롤링 수행이 불법으로 간주되는 경우가 있기 때문입니다. 사실 모든 케이스를 일일이 따져가며 특정 경우에 웹 크롤링이 불법인가 아닌가에 대해 따져보는 것은 어려운 일입니다. 하지만 웹 크롤링이 문제가 되는 경우를 판가름하는 몇 가지의 기준이 있고 이를 정확히 인지한다면 법을 잘 지키면서도 윤리적으로 웹 크롤링을 이용할 수 있습니다.

기본적으로 웹 크롤링이라는 행위 자체는 불법이 아닙니다. 웹 크롤링의 수행 프로세스를 실제로 보면, 브라우저를 자동적으로 조정하여 데이터를 웹 사이트에 요청하고 요청 내용에 해당하는 데이터를 웹 사이트로부터 내려받는 것이 전부입니다. 우리가 일반적으로 웹 사이트를 이용하는 것과 기본적인 프로세스는 같기 때문에 웹 크롤링이라는 행위 자체가 불법이라고는 볼 수 없습니다. 하지만 실제 판례를 살펴보면 웹 크롤링을 불법으로 규정한 경우가 있습니다. 대표적인 사례로 숙박업체들 간의 DB 무단 수집 사건이 있습니다.

해당 사례를 간단히 요약하자면, 특정 숙박 업체가 크롤링을 통해 경쟁사의 데이터를 수집하였다는 내용입니다. 무단으로 경쟁사의 데이터를 수집하여 이를 자사의 데이터로 복제를 하였고, 그 과정에서 경쟁사 서버에 부담을 주는 행위가 있었습니다. 이 사례를 통해 웹 크롤링이 문제가 되는 대표적인 경우를 모두 알아볼 수 있습니다.

1. 수집한 데이터를 상업적으로 이용하는 경우

앞서 웹 크롤링이라는 행동 자체는 불법적인 요소가 없다고 했습니다. 위 사례에서는 해당 데이터를 활용함에 있어 문제가 있었습니다. 경쟁사의 데이터를 수집한 것만 아니라 그것을 그대로 복제해 본인의 비즈니스에 활용했습니다. 일반적으로 수집한 데이터를 상업적으로 이용하지 않으면 문제가 될 것이 없다고 말을 하곤 합니다. 결국 수집한 데이터를 비즈니스 자체에 이용한다거나, 데이터 자체를 판매하는 등 웹 크롤링을 통해 수집한 데이터를 금전적 이익을 목적으로 사용한다면 문제가 됩니다.

상업적 이용이 아닌 웹 크롤링의 사례로는 학술적 목적의 웹 크롤링 이용이 있습니다. 많은 학자와 학생들이 특정 현상을 분석하기 위해 웹 상의 데이터를 수집하고, 이를 분석하여 연구를 진행합니다. 만약 해당 데이터를 이용하여 연구 논문을 작성했다면, 이것이 대표적인 학술적 목적의 웹 크롤링이라 볼 수 있습니다. 그렇다고 물론 상업적 목적이 아닌 웹 크롤링이라고 모두 문제가 되지 않는 것은 아닙니다. 웹 크롤링 행위 자체가 또 다른 문제를 일으킬 경우에는 금전적 이익이 목적이 아니었다고 할지라도 웹 크롤링이 불법이 될 수 있습니다.

2. 웹 크롤링을 통해 상대 서버에 문제를 일으킨 경우

웹 크롤링이 문제가 되는 두 번째 경우는 웹 크롤링 행위가 상대방의 서버에 문제를 일으키는 경우입니다. 이 역시 숙박업체 간 불법 크롤링 사례에서 드러난 문제점입니다. 기본적으로 웹 크롤링은 자동화한 프로그램을 통해 정보를 요청하기 때문에 데이터를 너무 많이 요청하게 되면, 서버 부하를 일으킬 수 있습니다. 보통은 너무 많은 요청이 들어올 경우, 웹 사이트에서 자동적으로 요청을 중단시킵니다. 하지만 악의적인 목적으로 이를 회피하는 알고리즘을 만들어, 끊임없이 서버에 부하를 일으키는 것도 충분히 가능한 일입니다. 웹 크롤링을 통해 데이터를 수집할 때, 데이터가 쌓이고 저장되는 속도가 너무 느리다고 판단하여, 고의적으로 서버에 부하를 줄 정도로 웹 크롤링 알고리즘을 조작하는 것은 반드시 피해야 하는 행위입니다.

웹 크롤링도 안전하게 할 수 있습니다.

종합했을 때, 무턱대고 바로 웹 크롤링을 시도하기에는 사전에 고려해야 할 요소가 있다고 볼 수 있습니다. 하지만 원하는 데이터를 마음껏 수집할 수 있다는 점에서 웹 크롤링은 엄청난 장점을 지니고 있습니다. 이 때문에 웹 크롤링을 진행하기 전, 웹 크롤링을 통해 행하고자 하는 작업이 어떤 목적을 지니고 있는지, 나의 웹 크롤링 행위가 상대방 서버에 영향을 미치지는 않을지를 잘 고려해야 합니다. 하지만 생각해보면 분명 각 웹 사이트마다 크롤링 자체를 허용하는 정도가 분명히 다를 것입니다. 이를 잘 인지하고 있다면 데이터를 수집하는 입장에서 최대한의 데이터를 수집할 수 있습니다. 어떤 방법을 통해 해당 내용을 정확히 알고, 합법적으로 웹 크롤링을 진행할 수 있는지는 다음 편에서 알아보도록 하겠습니다.

[파이썬] Python 웹페이지 크롤링 하는 방법(뉴스 긁어오기)

필요에 의해 웹사이트를 크롤링해야할 때가 있습니다. 크롤링은 많은 업무 시간을 단축시켜주는 효과가 있습니다.

좋은 방향으로 이용하시는 것을 추천드립니다.

파이썬 언어로 크롤링 하는 방법

다음은 뉴스타파 뉴스 웹사이트의 “세금도둑추적2020” 뉴스 크롤링 하는 예제입니다.

뉴스부분의 HTML을 파싱하기위해서 크롬 브라우저를 열고 newstapa.org 사이트를 열어주세요.

1. F12키를 눌러 개발자 도구를 사용합니다.

2.왼쪽에 커서 버튼을 눌러 뉴스 하나를 선택하여, 뉴스를 감싸고 있는 최상의 div태그를 찾습니다.

노란색으로 표기한 div class 태그명 부분이 바로 뉴스가 모여있는 태그입니다.

HTML 파싱할 대상을 찾았으니 다음 순서는 코딩입니다.

3.BeautifulSoup모듈을 설치합니다.

명령프롬포트를 실행하거나 파이참 툴을 사용중이라면 하단 터미널(Terminal)창에서 설치명령어를 실행하세요.

설치 명령어는 아래와 같습니다.

pip install bs4

다음은 설치로그입니다.

C:\python\Workspace>pip install bs4 Collecting bs4 Downloading bs4-0.0.1.tar.gz (1.1 kB) Requirement already satisfied: beautifulsoup4 in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (from bs4) (4.9.3) Requirement already satisfied: soupsieve>1.2 in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (from beautifulsoup4->bs4) (2.0.1) Using legacy ‘setup.py install’ for bs4, since package ‘wheel’ is not installed. Installing collected packages: bs4 Running setup.py install for bs4 … done Successfully installed bs4-0.0.1 C:\python\Workspace>

4.requests 모듈과 BeautifulSoup모듈을 import하여 크롤링 작업을 할 수 있습니다.

features인자 값으로 “html.parser”를 적용했어요.

인자값으로 “lxml”과 “html5lib”등도 사용할 수 있습니다.

import requests from bs4 import BeautifulSoup url = “https://newstapa.org” request = requests.get(‘https://newstapa.org/tags/%EC%84%B8%EA%B8%88%EB%8F%84%EB%91%91%EC%B6%94%EC%A0%812020’) soup = BeautifulSoup(request.content, features=”html.parser”) request.close() # print(soup) # find_str = soup.find(‘div’, attrs={‘class’: ‘col-lg-3 col-md-6 columns’}) find_str = soup.find(‘div’, attrs={‘class’: ‘list_section-slider-row-block’}) print(find_str) for news in find_str.findAll(‘div’, attrs={‘class’: ‘col-lg-3 col-md-6 columns’}): # print(news) #print(news.find(“h6”, attrs={‘class’: ‘font-weight-bold’}).text) # 기사 제목 print(news.h6.text) # 기사 제목 print(url + str(news.find(“h6”, attrs={‘class’: ‘font-weight-bold’}).a[‘href’]).strip()) # 기사 url print(news.find(“p”, attrs={‘class’: ‘float-right mt-2 date’}).text) # 기사 날짜 #print(news.find(‘figure’, attrs={‘class’: ‘article-image’}).img[‘src’]) # 이미지 url print(news.figure.img[‘src’]) # 이미지 url

다음은 크롤링 코드 실행결과입니다.

‘횡령범’ 몰린 국회인턴, 경찰서 ‘무혐의’…검찰이 종결 안해 큰 고통 https://newstapa.org/article/3A5cw 2020.09.18 https://d1lawh9lju1xqd.cloudfront.net/2020/09/28170837-D98B-8F51-6B5E-1HAAXK4VI2Z1FPVFKKCH.jpg 21대 국회에 물었다…”국회개혁 의지 있나요” https://newstapa.org/article/DeQ69 2020.09.18 https://d1lawh9lju1xqd.cloudfront.net/2020/09/28170800-77DB-98CE-F45B-U21HINT51J9BL0RGD515.jpg 국회세금도둑 3년 추적기-의원님과 인턴 https://newstapa.org/article/Mzp54 2020.09.17 https://d1lawh9lju1xqd.cloudfront.net/2020/09/24091518-3EF8-8217-B369-APRJ6UQPJI159AADCQOH.jpg <국회세금도둑 추적 2020> 임기 끝났다고 ‘끝이 아니다’ https://newstapa.org/article/4kcdv 2020.09.03 https://d1lawh9lju1xqd.cloudfront.net/2020/09/03163746-A562-50B0-0A78-009SB47X3UMA4WNKHFXZ.jpg [국회 세금도둑]① 김정훈, 특정인에 ‘표절 연구’ 몰아주고 세금 4천만 원 ‘펑펑’ https://newstapa.org/article/gclqY 2020.09.03 https://d1lawh9lju1xqd.cloudfront.net/2020/09/03163637-ED64-8240-6581-2MV0IWL5YYJ3F5D1ZAUR.jpg [국회 세금도둑]② 백재현 표절 정책연구 추가 확인, 박선숙・신창현은 반납 https://newstapa.org/article/Yh8H5 2020.09.03 https://d1lawh9lju1xqd.cloudfront.net/2020/09/03163544-A932-C98D-8A9E-208WE015XE5OFWHHOJWA.jpg [국회 세금도둑]③ 조원진, 권석창, 김용태 ‘예산 오남용’…환수 방법 없어 https://newstapa.org/article/xJ9oo 2020.09.03 https://d1lawh9lju1xqd.cloudfront.net/2020/09/03163440-9435-F246-5D48-NQ9R3W4VHYLMMULHU96F.jpg 국회의 또 다른 혈세낭비…발간비와 여론조사 https://newstapa.org/article/Nea2a 2020.07.22 https://d1lawh9lju1xqd.cloudfront.net/2020/07/22143153-A034-60B9-0275-E3DHZNSNBTN6J2IY4L7B.jpg [국회 세금도둑]① 국회의원 ‘발간비’ 허위·과다 청구…혈세 낭비 https://newstapa.org/article/Vc-M3 2020.07.22 https://d1lawh9lju1xqd.cloudfront.net/2020/07/22145407-6F87-90F2-5EED-JLSMCJ28RVNK6TQ7IUMD.jpg [국회 세금도둑]② 정책개발비로 의원 개인홍보 여론조사…국회규정 위반 https://newstapa.org/article/Q9kQ7 2020.07.22 https://d1lawh9lju1xqd.cloudfront.net/2020/07/22145853-D4B2-2FA5-018B-VUB35770OK2S2VMGMSF4.jpg ‘국회 세금도둑 추적 2020’…여야 의원 7명 공개 https://newstapa.org/article/YQBUb 2020.07.14 https://d1lawh9lju1xqd.cloudfront.net/2020/07/14150254-D592-61C7-A50F-K7S100K0ZBDIJ35BS0KM.jpg [국회 세금도둑]①김태흠·송옥주·이학영 정책연구 표절 인정…예산 반납하겠다 https://newstapa.org/article/gHQov 2020.07.14 https://d1lawh9lju1xqd.cloudfront.net/2020/07/14150109-3F86-CB5A-D8A5-UDWEJJY2VSA5JA4BVVFH.jpg [국회 세금도둑]②임종성·어기구도 정책연구 표절…혈세 낭비 불감증 https://newstapa.org/article/N71gi 2020.07.14 https://d1lawh9lju1xqd.cloudfront.net/2020/07/14150149-424B-00D8-7A01-21AJL7R7GIW40PLE86I9.jpg [국회 세금도둑]③’표절 질타’ 이용호·이종배…표절 정책자료집 발간 https://newstapa.org/article/whRn8 2020.07.14 https://d1lawh9lju1xqd.cloudfront.net/2020/07/14150233-6141-2971-3FBF-TTPQ0UO16AXXE590V844.jpg ‘국회 세금도둑 추적 2020’…국회예산 이렇게 샜다 https://newstapa.org/article/obolG 2020.06.04 https://d1lawh9lju1xqd.cloudfront.net/2020/06/03195606-F13F-2CBB-F508-53ZHENTLVZVDKBCALOXE.jpg [국회 세금도둑]① 정책용역보고서 천여 건 입수…혈세 낭비 또 확인 https://newstapa.org/article/RIIhW 2020.06.04 https://d1lawh9lju1xqd.cloudfront.net/2020/06/04103153-B215-BFE8-A7F7-TPNDJ03CKJ3RZ7GS57MS.jpg Process finished with exit code 0

웹사이트(페이지)의 이미지 다운로드 하는 방법

크롤링 작업을 완료했음으로 이미지 경로를 알고 있습니다.

urlib.request 모듈을 임포트 후 urlretrieve()함수를 사용하여 이미지를 다운로드 할 수 있답니다.

urlretrieve(이미지 경로 url, 로컬에 저장될 파일이름(폴더 지정 가능) )

from urllib.request import urlretrieve try: url = “https://d1lawh9lju1xqd.cloudfront.net/2020/09/03163637-ED64-8240-6581-2MV0IWL5YYJ3F5D1ZAUR.jpg” urlretrieve(url, “C:/python/Workspace/downimg.jpg”) except Exception as e: print(“-” * 30) print(“- 이미지 다운로드 실패”) print(“-” * 30) else: print(“-” * 30) print(“- 이미지 다운로드 성공”) print(“-” * 30)

모든 이미지를 리스트에 담은 후 반복문 중 for문을 사용하여 전체 이미지를 다운받을 수 있어요.

[REFERENCE]

zetcode.com/python/beautifulsoup/

github.com/hwangyoungjae/study/blob/master/20170117.py

velog.io/@shchoice/urllib.request-urlretrieve-urlopen

github.com/hwangyoungjae/study/blob/master/20170118.py

docs.python.org/3/library/urllib.request.html

파이썬 웹 크롤링(Web Crawling) 강좌 – 1. 웹페이지 긁어오기

반응형

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) # 웹 문서 전체가 출력됩니다.

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

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)

NAVER

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-144×144-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-200×200.png https://www.python.org/static/opengraph-icon-200×200.png https://www.python.org/about/

..

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

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

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

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

print (bsObject.head.find(“meta”, {“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] 웹 페이지 크롤링하기(Web Crawling)

코드들은 github에 업로드되어있습니다.

https://github.com/JaeYeongSong/Blog/tree/main/Crawling

오늘은 새로운 분야에 들어가 보도록 하겠습니다.

오늘은 크롤링(Crawling)을 알아보도록 합시다.

먼저 크롤링이란 무엇일까요? 크롤링이란? ‘데이터를 수집하고 분류하는 것’입니다.

많은 사람들이 크롤링이랑 스크래핑이란 헷갈려합니다.

스크래핑은 ‘인터넷에서 존재하는 데이터를 컴퓨터 프로그램을 통하여 자동화된 방법으로 웹에서 데이터를 수집하는 작업’이라는 뜻이기 때문에 스크래핑은 데이터를 수집한다는 뜻이고, 크롤링은 더 나아가 데이터를 분류한다는 것에 가장 큰 차이점이 있는 것 같습니다.

자 그럼 본론으로 들어와서 우리는 오늘 스크래핑과 비슷한 것처럼 데이터를 수집해보겠습니다.

그럼 코드를 들고 오도록 하겠습니다.

from bs4 import BeautifulSoup import requests # 홈페이지 주소 가져오기 url = “https://search.naver.com/search.naver?where=news&sm=tab_jum&query=뉴스” html = requests.get(url) bs_html = BeautifulSoup(html.content, “html.parser”) print(bs_html) # 웹 페이지 출력

▲ Crawling.py

이 코드는 가장 기본적인 크롤링 코드입니다.

from bs4 import BeautifulSoup import requests

bs4와 requests를 import 해줍니다.

그다음 크롤링할 웹 사이트를 가지고 옵니다.

url = “”

url 함수에 자신이 크롤링할 웹 사이트 주소를 붙여 넣어주시면 됩니다.

html = requests.get(url) bs_html = BeautifulSoup(html.content, “html.parser”)

그다음 html 함수에 requests.get(url)을 이용해서 리소스나 정보를 요청합니다.

그 다음 bs_html 함수로 html 콘텐츠를 받습니다.

print(bs_html) # 웹 페이지 출력

print(bs_html)로 웹 페이지의 코드를 출력합니다.

저는 현재 네이버 뉴스에 ‘뉴스’ 라고 검색하면 생기는 웹 페이지를 크롤링해보도록 하겠습니다.

한 번 작동시켜 보도록 하겠습니다.

▲ Crawling.py 실행결과

Crawling.py를 실행시켜 보시면 터미널 창에 이렇게 크롤링 한 내용이 보입니다.

근데 터미널 창에 내용이 나오면 터미널을 종료시켜 버리면 크롤링 한 내용이 보이지 않게 되죠.

그럼 웹 페이지를 크롤링하는 걸 응용시킬 때 크롤링 내용을 저장시키려면 어떻게 해야 할까요?

웹 페이지를 크롤링 한 결과값을 저장하는 방법에 대해 같이 알아봅시다.

from bs4 import BeautifulSoup import requests import sys # 홈페이지 주소 가져오기 url = “https://search.naver.com/search.naver?where=news&sm=tab_jum&query=뉴스” html = requests.get(url) bs_html = BeautifulSoup(html.content, “html.parser”) sys.stdout = open(‘Save_Crawling.txt’, ‘w’, encoding=’UTF-8′) print(bs_html) # 웹 페이지 txt 파일로 출력

▲ Save_Crawling.py

위 코드에 대해 설명을 드려야겠죠?

이 코드는 웹 페이지를 크롤링 한 결과값을 txt 파일로 저장할 수 있는 코드입니다.

여기서 아까 전에 알려드린 Crawling.py 코드와 다른점이 무엇인지 아시나요?

아까전에 했던 설명을 또 할 필요가 없다고 느끼기 때문에 Crawling.py와 다른 부분을 들고 와 보도록 하겠습니다.

import sys ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sys.stdout = open(‘Save_Crawling.txt’, ‘w’, encoding=’UTF-8′)

▲ Save_Crawling.py 중 Crawling.py와 다른 부분

처음에 sys를 import 해주겠습니다.

왜냐하면 파일을 저장하려면 sys 라이브러리가 필요하기 때문이죠.

그다음에 아래로 내려오면 sys.stdout 라는 함수를 정의해줬는데 여기서 총 3개의 인자를 받습니다.

open(”, ”, )

여기서 첫 번째로 저장할 파일명과 이름을 받습니다.

만약에 Test라는 이름을 가진 txt 파일로 만들려면 ‘Test.txt’ 라고 적어주시면 됩니다.

그다음 두 번째로 파일 열기 모드에 대해 받습니다.

r 읽기모드 – 파일을 읽을 때 사용 w 쓰기모드 – 파일에 내용을 쓸 때 사용 a 추가모드 – 파일에 새로운 내용을 추가 시킬 때 사용

▲ sys 파일 열기모드

파일 열기 모드는 총 3가지로 이루어져 있습니다.

위에 표에 대한 설명을 참조하시기 바랍니다.

일단 저희는 웹 페이지를 크롤링한 결과값을 파일에 내용을 써야 하기 때문에 ‘w’ 즉 쓰기 모드를 사용하겠습니다.

그다음 마지막으로 어떻게 인코딩을 할 것인가에 적어주시면 됩니다.

일반적으로 많이 사용하는 UTF-8을 적어주시면 됩니다.

UTF-8 같은 경우에는 한글과 영어를 같이 사용할 수 있죠.

그럼 한 번 Save_Crawling.py를 실행시켜 볼까요?

▲ Save_Crawling.py 실행 결과

위와 같이 txt 파일로 정상적으로 저장된 걸 확인할 수 있습니다.

내용도 웹 페이지를 크롤링 한 값도 잘 넣어졌죠.

간단하게 웹 페이지를 크롤링(스크래핑)을 해보았습니다.

다음에는 원하는 태그만 크롤링하는것에 대해 알아보도록 하겠습니다.

지금까지 읽어주셔서 감사합니다.

지금까지 웹 페이지 크롤링 하는 방법이었습니다.

[Python] 데이터 수집을 위한 웹 크롤링(Crawling)

원하는 데이터를 수집하고자 할 때 크롤링(Crwaling)을 하곤 한다.

크롤링은 해당 페이지의 데이터들을 추출하는 행위를 의미한다.

이 때 크롤링을 하기 위한 소프트웨어를 크롤러(Crawler)라고 하며,

봇, 스파이더, 지능 에이전트 라고도 불린다.

스크래이핑과 크롤링의 차이 ? Scraping : 웹 사이트의 특정 정보를 추출하는 것. 웹 데이터의 구조 분석이 필요

Crawling : 프로그램이 웹사이트를 정기적으로 돌며 정보를 추출하는 것

수집 데이터의 형태

데이터를 수집하기 앞서, 수집 데이터의 형태를 3가지로 구분할 수 있다.

수집 데이터 형태

정형 – 일정한 규격에 맞춰서 구성된 데이터 (어떠한 역할을 알고 있는 데이터)

관계형 데이터베이스 시스템의 테이블과 같이 고정된 컬럼에 저장되는 데이터 파일 등이 될 수 있다. 즉, 구조화 된 데이터가 정형 데이터

반정형 – 일정한 규격으로 구성되어 있지 않지만 일정한 틀을 갖추기 위해서 태그나 인덱스형태로 구성된 데이터

연산이 불가능한 데이터 ex) XML, HTML, JSON 등

비정형 – 구조화 되지 않는 형태의 데이터 (정형과 반대로 어떠한 역할인지 알수 없는 데이터)

형태가 없으며, 연산도 불가능한 데이터 ex) SNS, 영상, 이미지, 음성, 텍스트 등

검색 내용 크롤링

네이버 검색 엔진에서 ‘정보처리기사’를 검색하여

해당 단어가 포함되는 구문을 리스트로 뽑아 보자.

requests 모듈을 import 하고

get 메서드를 호출하여 인자를 전달해준다.

import requests as req # url read url = ‘http://search.naver.com/search.naver’ res = req.get(url, params={‘query’ : ‘정처기’}) # print(res.text)

우선 원하는 정보를 얻기 위해

html 문서 내의 태그를 확인한다.

for문과 if 문을 이용하여 ‘정보처리기사’가 포함된 페이지의 구문을

리스트로 반환해준다.

strings = res.text strings_row = strings.split(‘<') target_lst = [] for text in strings_row: target_idx = text.find('정보처리기사') target = text[target_idx:] if len(target) > 6: target_lst.append(target) target_lst = target_lst[1:] print(target_lst) # [‘정보처리기사란 응시자격을 갖춘 자가 산업인력공단에서 시행하는 정보처리기사 시험에 합격하여 그 자격을 취득한 자를 말한다. 정보처리기사 시험은 필기시험과 실기시험으로 이루어지며, 필기시험은 객관식으로 100점을 만점으로 하여 과목당 40점 이상, 전 과목 평균 60점 이상이면 합격한다. 실기시험은 주관식 시험으로 100점을 만점으로 하여 평균 60점 이상이면… ‘,

BeautifulSoup 활용

앞선 크롤링에선 직접 태그와 내용 위치를 찾고

정보 추출을 위한 로직을 새로 만들었지만,

bs4 라이브러리를 사용하면 위와 같은 수고를 덜어낼 수 있다.

bs4를 import하고

간단한 html 문을 만들어준다.

**html 문서는 하나의 거대한 문자열과 같음을 인지해야한다.

태그의 id에 해당하는 내용을 string을 통해 확인 가능하다.

# id find from bs4 import BeautifulSoup html = “””

python

hello

world

“”” # BeatufulSoup 객체 생성 soup = BeautifulSoup(html,’html.parser’) # find 메서드 호출 h1 = soup.find(id=’title’) p1 = soup.find(id=’p1′) p2 = soup.find(id=’p2′) print(h1.string) # python

앵커 태그의 url 또한 가져올 수 있다.

예시 html 문을 생성한 후 해당 문서의 a 태그를 모두 찾아 links 변수에 할당한다.

links 리스트 0번째 요소의 attrs 를 확인해 보면 딕셔너리 형태이고

이때 value가 해당 url이 된다.

from bs4 import BeautifulSoup html = “””

“”” soup = BeautifulSoup(html, ‘html.parser’) links = soup.find_all(“a”) print(links[0].string) print(links[0].attrs[‘href’]) for a in links: href = a.attrs[‘href’] text = a.string print(href, text)

태그의 하위 분기 내용을 가져올 수도 있다.

select_one, select 메서드를 통해

하위 분기의 태그를 지정하여 해당 태그와 내용을 반환한다.

from bs4 import BeautifulSoup html = “””

위키북스 도서

  • 게임 입문
  • 파이썬 입문
  • 웹 디자인 입문

“”” soup = BeautifulSoup(html, ‘html.parser’) h1 = soup.select_one(“div#books > h1”) li_lst = soup.select(“div#books > ul.item > li”) print(h1) print(li_lst) #

이번엔 기상청 xml 날씨 데이터를 가져와 보자.

tag 이름이 ‘title’ 과 ‘wf’ 인 부분의 내용을 가져오면

일기 예보 제목과 내용 요약을 확인할 수 있다.

import urllib.request from bs4 import BeautifulSoup # weather url = “http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp” res = urllib.request.urlopen(url) soup = BeautifulSoup(res, ‘html.parser’) title = soup.find(‘title’).string wf = soup.find(‘wf’).string print(title) print(‘-‘*20) print(wf)

Selenium을 이용한 동적 페이지 크롤링

동적 페이지(Dynamic page)란 url에 관계 없이 해당 웹 페이지 내에서

사용자의 요청을 바탕으로 서버 측 에서 컨텐츠를 채워넣는 방식이다.

(네이버 지도, 스타벅스 지점 확인 페이지 등..)

기존 정적(Static)인 페이지에서 했던 방식대로 크롤링을 할 수 없기 때문에

웹 페이지 제어를 위한 자동 테스팅 모듈인 Selenium 라이브러리를 사용한다.

** Selenium 을 사용하여 크롤링을 진행 할 때 특정 웹 페이지에서 과도한 사용을 할 경우 IP ban을 당할 수 있으므로 주의하자.

사용에 앞서 파이썬에서 크롬으로 접속할 수 있게 해주는

chrome driver를 현재 working directory에 설치한다.

이 후 terminal 에서 Selenium을 설치한다.

— pip install selenium

키워드로 검색한 화면 자동 캡처 후 저장하는 방법.

from selenium import webdriver from urllib.parse import quote_plus import time # 필요한 옵션 설정 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument(‘–headless’) chrome_options.add_argument(‘–no-sandbox’) chrome_options.add_argument(‘–disable-dev-shm-usage’) # Chrome 드라이버 생성 driver = webdriver.Chrome(‘chromedriver’) # 해당 URL로 브라우저 실행 driver.get(‘http://naver.com’) # 키워드 입력한 페이지 스크린샷 url = ‘https://search.naver.com/search.naver?where=image&sm=tab_jum&query=’ kword = input(‘검색어를 입력:’) base_url = url + quote_plus(kword) driver.get(base_url) time.sleep(1) driver.save_screenshot(‘website.png’)

만약 페이지 범위가 넓어 스크롤이 필요할 경우

검색 페이지를 자동 스크롤하며 스크린 샷을 저장하는 방법이다.

from selenium.webdriver.common.keys import Keys from selenium import webdriver from urllib.parse import quote_plus import time import numpy as np # Chrome 드라이버 생성 driver = webdriver.Chrome(‘chromedriver’) # 해당 URL로 브라우저 실행 driver.get(‘http://naver.com’) url = ‘https://search.naver.com/search.naver?where=image&sm=tab_jum&query=’ kword = input(‘검색어를 입력:’) base_url = url + quote_plus(kword) driver.get(base_url) # 스크롤하며 스크린 샷 body = driver.find_element_by_css_selector(‘body’) for i in range(5): body.send_keys(Keys.PAGE_DOWN) time.sleep(abs(np.random.normal(1, 3))) driver.save_screenshot(f’website_{i}.png’)

BeautifulSoup와 requests로 웹 파싱해보기 – 파이썬 실습

이번 글에서는 Python의 BeautifulSoup, requests 패키지를 이용하여, 가비아 라이브러리 홈페이지의 게시글들을 파싱하는 방법을 소개합니다.

들어가기 전

본문으로 들어가기 전, 먼저 크롤링(Crawling), 파싱(Parsing), 스크래핑(Scraping)에 대한 정의를 알아보겠습니다.

웹 크롤러 (Web crawler) ” A Web crawler, sometimes called a spider or spiderbot and often shortened to crawler, is an Internet bot that systematically browses the World Wide Web, typically for the purpose of Web indexing (web spidering). ” (출처: wikipedia)

크롤링은 웹 인덱싱을 위해 WWW를 체계적으로 탐색해나가는 것을 의미합니다. 크롤러가 하는 행위(WWW를 탐색해나가는 행위 등)를 바로 ‘크롤링’ 이라고 합니다.

파싱 (Parsing) ” Parsing, syntax analysis, or syntactic analysis is the process of analyzing a string of symbols, either in natural language, computer languages or data structures, conforming to the rules of a formal grammar. ” (출처: wikipedia)

웹 파싱은 웹 상의 자연어, 컴퓨터 언어 등의 일련의 문자열들을 분석하는 프로세스입니다.

웹 스크래핑 (Web scraping) ” Web scraping, web harvesting, or web data extraction is data scraping used for extracting data from websites. ” (출처: wikipedia)

웹 스크래핑은 다양한 웹사이트로부터 데이터를 추출하는 기술을 의미합니다.

정의를 살펴보면, 흔히 사용되는 용어 ‘크롤러’는 데이터 추출의 의미보다 웹 사이트를 탐색하고, 인덱싱 하는 것에 더 중점적인 의미를 갖고 있는 것 처럼 보입니다. 따라서 이번 글 에서는 ‘웹 크롤링’ 이라는 단어의 사용보다 ‘웹 파싱’ 이라는 단어를 사용하겠습니다. (각각의 용어에 대한 해석은 다를 수 있습니다.)

웹 파싱해보기

파이썬에서 가장 많이 사용되고 있는 패키지 BeautifulSoup, Requests를 사용하여 웹 사이트를 파싱해보겠습니다.

1. BeautifulSoup, Requests 패키지가 설치되었는지 확인합니다.

pip list

목록에 beautifulsoup4 , requests 패키지가 없다면 설치해줍니다.

pip install beautifulsoup4 pip install requests

BeautifulSoup: 웹 페이지의 정보를 쉽게 스크랩할 수 있도록 기능을 제공하는 라이브러리입니다.

Requests: HTTP 요청을 보낼 수 있도록 기능을 제공하는 라이브러리 입니다.

2. 파싱을 진행할 페이지를 분석합니다.

1. 가비아 라이브러리 홈페이지에 접속합니다.

2. 홈페이지에 접속하여 HTML 소스를 분석합니다.

크롬 브라우저 기준, F12 혹은 마우스 우클릭 > ‘검사’ 를 클릭하면 ‘개발자 도구 창’ 이 나타납니다.

가비아 라이브러리 메인 화면

가비아 라이브러리 메인 HTML 소스

HTML 소스를 살펴보면 게시글들의 제목, 링크, 날짜 등의 내용을 확인할 수 있습니다.

3. 파싱을 위해 파이썬 파일을 생성합니다.

vi parser.py

4. 파싱을 위한 코드를 작성하고 실행시킵니다.

4-1. 가비아 라이브러리 홈페이지에 존재하는 포스터들의 제목을 추출해봅니다.

import requests from bs4 import BeautifulSoup as bs page = requests.get(“https://library.gabia.com/”) soup = bs(page.text, “html.parser”) elements = soup.select(‘div.esg-entry-content a > span’) for index, element in enumerate(elements, 1): print(“{} 번째 게시글의 제목: {}”.format(index, element.text))

line 1 ~ 2: 필요한 라이브러리(requests, beautifulsoup)를 import 합니다.

line 4: requests 를 이용하여 ‘https://library.gabia.com’ 주소로 get 요청을 보내고 응답을 받습니다. 상태 코드와 HTML 내용을 응답받을 수 있습니다.

line 5: 응답받은 HTML 내용을 BeautifulSoup 클래스의 객체 형태로 생성/반환합니다. BeautifulSoup 객체를 통해 HTML 코드를 파싱하기 위한 여러 가지 기능을 사용할 수 있습니다. ( response.text 는 응답 받은 내용(HTML)을 Unicode 형태로 반환합니다.)

line 7: BeautifulSoup 가 제공하는 기능 중 CSS 셀렉터를 이용하여 원하는 정보를 찾을 수 있는 기능입니다. ( div.esg-entry-content a > span 은 esg-entry-content 클래스로 설정된 div 태그들의 하위에 존재하는 a 태그, 그 하위에 존재하는 span 태그를 의미합니다.) 이 셀렉터를 이용하면 가비아 라이브러리 홈페이지에 존재하는 포스터들의 제목을 추출할 수 있습니다.

아래와 같이 실행 결과를 확인할 수 있습니다.

$ python parser.py 1 번째 게시글의 제목 : 언택트 시대의 기업 메일이 중요한 이유 2 번째 게시글의 제목 : 포스트 코로나 시대의 클라우드 3 번째 게시글의 제목 : 클라우드 플랫폼과 마이크로서비스 4 번째 게시글의 제목 : 퍼블릭 클라우드, 프라이빗 클라우드, 하이브리드 클라우드 5 번째 게시글의 제목 : 클라우드 마이그레이션 전략 알아보기 6 번째 게시글의 제목 : 클라우드 vs 웹호스팅 vs 서버호스팅 구분 7 번째 게시글의 제목 : 마이데이터란 무엇인가 8 번째 게시글의 제목 : 클라우드에 저장된 개인정보, 어떤 문제가 있을까 9 번째 게시글의 제목 : 클라우드 컴퓨팅의 종류, SaaS란? …

4-2. 가비아 라이브러리 홈페이지에 존재하는 포스터들의 제목과 링크를 동시에 추출해봅니다.

import requests from bs4 import BeautifulSoup as bs page = requests.get(“https://library.gabia.com/”) soup = bs(page.text, “html.parser”) elements = soup.select(‘div.esg-entry-content a.eg-grant-element-0’) for index, element in enumerate(elements, 1): print(“{} 번째 게시글: {}, {}”.format(index, element.text, element.attrs[‘href’]))

line 7: esg-entry-content 클래스로 설정된 div 태그들의 하위에 존재하는 태그 중, eg-grant-element-0 클래스를 갖는 a 태그만을 추출합니다.

line 10: link.text 추출한 a 태그 안에 존재하는 text 내용을 추출합니다. link.attrs[‘href’] a 태그의 href 속성의 값을 추출합니다.

아래와 같이 실행 결과를 확인할 수 있습니다.

$ python example_crawling_gabia_library2.py 1 번째 게시글: 언택트 시대의 기업 메일이 중요한 이유, https://library.gabia.com/contents/groupware/9200/ 2 번째 게시글: 포스트 코로나 시대의 클라우드, https://library.gabia.com/contents/infrahosting/9177/ 3 번째 게시글: 클라우드 플랫폼과 마이크로서비스, https://library.gabia.com/contents/infrahosting/9154/ 4 번째 게시글: 퍼블릭 클라우드, 프라이빗 클라우드, 하이브리드 클라우드, https://library.gabia.com/contents/infrahosting/9147/ 5 번째 게시글: 클라우드 마이그레이션 전략 알아보기, https://library.gabia.com/contents/infrahosting/7705/ 6 번째 게시글: 클라우드 vs 웹호스팅 vs 서버호스팅 구분, https://library.gabia.com/contents/infrahosting/9118/ 7 번째 게시글: 마이데이터란 무엇인가, https://library.gabia.com/contents/infrahosting/9142/ 8 번째 게시글: 클라우드에 저장된 개인정보, 어떤 문제가 있을까, https://library.gabia.com/contents/infrahosting/9136/ 9 번째 게시글: 클라우드 컴퓨팅의 종류, SaaS란?, https://library.gabia.com/contents/infrahosting/9123/ …

5. 파싱한 데이터를 활용해봅니다.

이번엔 Pandas, openpyxl 패키지를 이용하여 파싱한 데이터를 엑셀 형태로 변환해보겠습니다.

5-1. Pandas, openpyxl 패키지가 설치되어 있는지 확인합니다.

pip show pandas pip show openpyxl

패키지가 설치되어 있지 않다면 설치해줍니다.

pip install pandas pip install openpyxl

Pandas: 데이터를 쉽게 분석하고 조작할 수 있는 파이썬의 라이브러리입니다.

openpyxl: 엑셀 파일을 읽고 작성할 수 있는 파이썬 라이브러리입니다.

5-2. 위에서 작성한 코드를 아래와 같이 수정합니다.

import requests from bs4 import BeautifulSoup as bs import pandas as pd page = requests.get(“https://library.gabia.com/”) soup = bs(page.text, “html.parser”) elements = soup.select(‘div.esg-entry-content a.eg-grant-element-0’) titles = [] links = [] for index, element in enumerate(elements, 1): titles.append(element.text) links.append(element.attrs[‘href’]) df = pd.DataFrame() df[‘titles’] = titles df[‘links’] = links df.to_excel(‘./library_gabia.xlsx’, sheet_name=’Sheet1′)

line 3: pandas 라이브러리를 import합니다.

line 1 ~ 14: 이전에 작성한 코드와 동일합니다. 다만, 이번에는 게시글의 제목, 링크를 출력하지 않고 각각의 배열에 값을 추가합니다.

line 17 ~ 19: titles 배열과 links 배열의 값으로 Pandas의 DataFrame 을 생성합니다.

line 21: DataFrame 의 to_excel() 함수를 이용하여 엑셀파일을 작성합니다.

아래와 같이 생성된 엑셀 파일을 확인할 수 있습니다.

생성된 엑셀 파일

지금까지 가비아 Python 호스팅 환경에서 가비아 라이브러리 홈페이지를 파싱하는 방법을 알아보았습니다.

가비아는 초보 개발자도 쉽게 호스팅 서비스를 이용할 수 있도록 최적화된 호스팅 환경을 제공합니다.

또한 CBT, OBT를 거쳐 검증된 컨테이너 기반의 환경에 Python 호스팅 서비스를 제공해 때문에 안정적이고, 믿을 수 있습니다.

가비아 Python 호스팅을 이용해 이번 포스팅과 같이 웹 파싱을 개발해 보시기 바랍니다.

자바스크립트로 크롤러 만들기 3편: 다양한 유형의 웹페이지 크롤러 만들어보기

자바스크립트 크롤러 만들기 튜토리얼 1편, 2편에서는 크롬 웹 브라우저에서 제공하는 [개발자 도구]를 이용하여 이미 열려 있는 웹페이지에서 원하는 정보를 찾는 방법을 알아보았습니다. 그런데 이 방식은 웹 브라우저를 실행한 후 사용자가 웹페이지를 직접 열고 [개발자 도구]에서 자바스크립트 코드를 입력해야 하므로 자동화가 쉽지 않습니다. (참고: ‘헤드리스 브라우저를 이용한 크롤링’에서 헤드리스headless 브라우저를 이용하여 UI 없는 웹 브라우저를 코드만으로 조작하는 방식으로 크롤링이 가능하긴 합니다)

웹 브라우저와 독립적으로 동작하는 CLIcommand line interface 기반 크롤러를 만들면 이 문제를 해결할 수 있습니다. CLI 애플리케이션으로 만들면 터미널terminal 또는 셸shell에서 쉽게 테스트해볼 수 있고, 서버에서 주기적으로 자동 실행되게 만들 수도 있습니다.

이 글에서는 노드JSNode.js 런타임을 이용하는 자바스크립트 코드로 크롤러를 작성한 후 터미널에서 해당 코드를 실행합니다. 자바스크립트로 크롤러를 작성하면 파이썬 등의 다른 언어로 크롤러 작성했을 때보다 몇가지 좋은 점이 있습니다.

자바스크립트에서는 웹페이지에서 데이터를 보관하거나 주고받는데 많이 사용되는 JSON 형식을 기본적으로 지원하기 때문에 사용이 매우 편리 데이터가 웹페이지의 자바스크립트 코드 안에 존재하는 경우 별다른 설정 없이 해당 코드를 읽어들여서 실행하는 것이 가능합니다. 이렇게 실행된 결과를 읽어들여서 원하는 데이터를 추출할 수 있습니다. (이런 경우 다른 언어로 크롤러를 만들면 자바스크립트 런타임 라이브러리를 설치해서 해결은 가능하지만 추가적인 작업이 필요해서 번거롭습니다.)

자 그럼 이제 노드JS 런타임을 이용하여 자바스크립트로 크롤러를 만드는 방법을 설명하겠습니다.

혹시 노드JS가 설치 되지 않으신 분들은 먼저 https://nodejs.org/ 에서 원하시는 버전을 다운로드 후에 설치해주세요. 여기서는 노드JS 16.15.0 버전 기준으로 설명을 진행합니다. 이 글에서는 node나 npm 명령어에 관한 자세한 설명은 생략합니다. 더 자세한 내용은 ‘코로나보드로 배우는 실전 웹 서비스 개발’ 책을 참고해 주세요.

개발 환경 설정

[crawler] 디렉터리를 만들어서 크롤러 개발 환경을 설정하겠습니다. 원하는 위치에서 다음 명령어를 수행해주세요.

$ mkdir crawler $ cd crawler $ npm init -y ❶ $ npm install [email protected] [email protected] [email protected] [email protected] [email protected] [email protected]

❶에서 crawler 프로젝트를 초기화합니다. -y 옵션을 지정하면 초기화 시 기본값이 자동으로 입력되어 편리합니다.

❷는 크롤러를 만들 때 필요한 총 6개의 라이브러리를 설치하는 명령입니다. 각 라이브러리의 용도를 먼저 간단히 설명하면 다음과 같습니다.

axios : HTTP 호출을 더 편리하게 해주는 HTTP 클라이언트 라이브러리입니다. 이를 이용하여 웹 브라우저가 특정 URL로부터 웹페이지 HTML을 로드하듯이 크롤러에서도 특정 URL의 HTML을 로드할 수 있습니다.

: HTTP 호출을 더 편리하게 해주는 HTTP 클라이언트 라이브러리입니다. 이를 이용하여 웹 브라우저가 특정 URL로부터 웹페이지 HTML을 로드하듯이 크롤러에서도 특정 URL의 HTML을 로드할 수 있습니다. cheerio : 로드된 HTML을 파싱하여 DOM을 생성하는 라이브러리입니다. 웹 브라우저에서 제공하는 DOM 인터페이스와는 사용 방법이 좀 다르지만 구현된 기능 자체는 대부분 비슷해 CSS 셀렉터 문법을 사용한 검색이 가능합니다.

: 로드된 HTML을 파싱하여 DOM을 생성하는 라이브러리입니다. 웹 브라우저에서 제공하는 DOM 인터페이스와는 사용 방법이 좀 다르지만 구현된 기능 자체는 대부분 비슷해 CSS 셀렉터 문법을 사용한 검색이 가능합니다. puppeteer : 헤드리스 브라우저를 프로그래밍 방식으로 조작하는 라이브러리입니다. puppeteer 설치와 함께 최신 버전의 크로미움 Chromium 이 자동으로 node_modules/puppeteer 경로 내부에 기본 설치됩니다. 1

: 헤드리스 브라우저를 프로그래밍 방식으로 조작하는 라이브러리입니다. 설치와 함께 최신 버전의 크로미움 이 자동으로 node_modules/puppeteer 경로 내부에 기본 설치됩니다. lodash : 자바스크립가 기본 제공하지 않는 다양한 유틸리티 함수를 모아둔 라이브러리입니다.

: 자바스크립가 기본 제공하지 않는 다양한 유틸리티 함수를 모아둔 라이브러리입니다. date-fns , date-fns-tz : 자바스크립트가 제공하는 Date 객체는 날짜/시간의 타임존 변환이나 원하는 날짜 형식으로 변환이 어렵습니다. 이를 해결해주는 라이브러리입니다.

첫 크롤러 만들어보기

이제 웹 브라우저가 아닌 노드JS 런타임을 이용하여 원하는 요소를 찾는 코드를 구현하겠습니다. 아래와 같이 코드를 작성한 후 node dom.js 명령어를 통해 실행하면 결과가 예제 페이지를 크롤링한 결과가 출력되는 것을 확인 할 수 있습니다.

crawler/examples/dom.js

const axios = require(‘axios’); const cheerio = require(‘cheerio’); async function main() { // ❶ HTML 로드하기 const resp = await axios.get( ‘https://yjiq150.github.io/coronaboard-crawling-sample/dom’ ); const $ = cheerio.load(resp.data); // ❷ HTML을 파싱하고 DOM 생성하기 const elements = $(‘.slide p’); // ❸ CSS 셀렉터로 원하는 요소 찾기 // ➍ 찾은 요소를 순회하면서 요소가 가진 텍스트를 출력하기 elements.each((idx, el) => { // ❺ text() 메서드를 사용하기 위해 Node 객체인 el을 $로 감싸서 cheerio 객체로 변환 console.log($(el).text()); }); } main();

[출력 결과]

국가별 내용 대한민국 내용

❶ axios.get() 함수는 웹페이지에 HTTP GET 요청을 보내서 HTTP 응답을 받습니다. resp 객체의 data 필드를 통해서 응답받은 HTML 내용에 접근할 수 있습니다. HTML 응답 내용은 웹 브라우저로 열었을 때와 완전히 동일합니다.

노드JS 런타임은 웹 브라우저가 아니므로 해당 HTML 내용을 자동으로 파싱하여 DOM을 만들어주지는 못합니다. 그래서 ❷ cheerio 라이브러리를 이용하여 DOM을 만들어줍니다. cheerio.load() 를 통해 DOM을 구성한 후 cheerio 객체 형태로 반환해줍니다. 이렇게 반환된 cheerio 객체는 내부에 DOM 정보를 모두 가지고 있습니다. 생성된 cheerio 객체는 관행적으로 $ 변수에 저장해 사용합니다. 이렇게 변수 이름을 지정하면 ❸ CSS 셀렉터로 원하는 요소를 찾을 때도 $(‘.slide p’) 형식으로 호출할 수 있어 편리합니다. 이러한 형식으로 요소를 찾는 방식은 jQuery2에서부터 사용하는 오래된 관습입니다.

❹에서는 ❸에서 찾은 요소를 cheerio 객체에서 제공하는 each() 함수를 사용해 순회하면서 해당 요소의 내용을 출력합니다. 이때 ❺에서처럼 특정 요소를 나타내는 el 변수를 직접 사용하지 않고 $(el) 형태로 감싸서 사용합니다. 이렇게 하는 이유는 뭘까요?

el 변수에 담긴 요소는 cheerio 에서 만들어낸 DOM 상의 Node 객체3입니다. 이 Node 객체는 순수하게 DOM 상의 Node 를 표현하는 기능만 갖고 있습니다(웹브라우저에서 DOM을 다룰 때 존재하는 Node 객체와 기본적인 개념은 동일하지만 제공되는 기능에 차이가 있습니다).

때문에 단순히 Node 객체만 가지고는 해당 Node 와 자식 Node 가 가진 텍스트 내용만 손쉽게 추출할 방법이 없습니다. 하지만 이 Node 객체를 cheerio 객체4로 한 번 감싸주면 cheerio 에서 제공하는 추가 기능을 사용할 수 있게 됩니다. 위 예시에서 Node 와 그 자식 Node 가 가진 텍스트 내용만 추출하는 데 사용한 text() 함수가 바로 cheerio 에서 제공되는 기능입니다(이러한 패턴 또한 앞서 언급한 jQuery에서 사용하던 코드 관습을 그대로 옮겨온 겁니다).

cheerio 기본 사용법

cheerio 를 이용하여 CSS 셀렉터 조건에 맞는 요소들을 찾아 순회하거나, 찾은 요소 중에 특정 요소를 선택하는 등의 처리를 하게 됩니다. 위 예시에서는 each() 함수를 사용했는데 이 함수 외에 자주 사용하는 함수를 소개하겠습니다. 아래 예제 코드 또한 위에서 사용한 동일한 예제 웹페이지에 대해 수행합니다.

each() : 찾은 요소들을 단순히 순회합니다.

: 찾은 요소들을 단순히 순회합니다. map() : 찾은 요소들을 순회하면서 각 요소에서 얻은 값을 이용하여 데이터를 추출하고 변환하여, 반환값들을 모아둔 배열을 만들 수 있습니다. cheerio 객체 내부에서 사용하는 배열을 자바스크립트 배열로 변환하는 데 toArray() 함수를 사용합니다.

const textArray = $(‘.slide p’); .map((idx, el) => { return $(el).text(); }) .toArray(); // textArray에 저장된 값: [‘국가별 내용’, ‘대한민국 내용’]

find() : 찾은 요소를 기준으로 새로운 조건을 적용하여 검색합니다. 어떤식으로 사용하는지 설명하기 위해 ❶ 두 단계에 걸쳐서 검색을 진행했습니다만, $(‘.container h1’) 처럼 한 번에 검색할 수도 있습니다.

$(‘.container’) .find(‘h1’) .each((idx, el) => { console.log($(el).text()); }); // 출력값: ‘코로나보드’

next() , prev() : 찾은 요소를 기준으로 인접한 다음 또는 이전 요소를 찾습니다.

const nextElement = $(‘#country-title’).next(); // nextElement.text()의 값: ‘국가별 내용’ const prevElement= $(‘#country-title’).prev(); // prevElement.text()의 값: ”

first() , last() : 찾은 요소 중 첫 번째 요소 또는 마지막 요소를 찾습니다.

$(‘.slide p’).first().text(); // 국가별 내용 $(‘.slide p’).last().text(); // 대한민국 내용

이 외에도 다양한 기능을 제공합니다. 궁금하신 분은 cheerio 레퍼런스 문서를 참고하세요.5

웹페이지 유형별 크롤링 방식 결정 방법

웹페이지에서 데이터를 불러와서 사용자에게 보여주는 방식은 다양하지만 결국 웹페이지를 구성하는 DOM안의 특정 요소에 데이터가 있다는 사실은 변하지 않습니다. 따라서 웹페이지 크롤러를 만드는 첫 번째 과정은 크롤링하고자 하는 데이터의 위치를 파악하는 겁니다. 웹페이지를 구성하는 요소 중 우리가 찾는 데이터가 존재할 만한 곳은 다음과 같이 세 곳입니다.

웹페이지 최초로 불러오는 HTML(메인 HTML 소스) API 호출을 통해서 외부에서 데이터를 불러오는 경우 해당 API의 응답 HTML을 통해서 로드된 자바스크립트 파일 내부(데이터가 코드 형태로 하드코딩되어 있을 수 있음)

데이터 위치에 따라서 추출 방법이 달라지기 때문에 크롤러를 작성하기 전에는 해당 데이터가 어디에 위치하는지를 크롬 [개발자 도구]에서 반드시 확인해야 합니다. (크롬 개발자 도구를 사용하는 방법은 2편을 참고 바랍니다.)

[그림 4-13]는 데이터 위치에 따른 크롤링 방법을 결정하는 순서를 그림으로 보여줍니다. 전체적인 흐름을 먼저 이 그림에서 살펴본 후 각 단계의 조건을 자세히 설명하겠습니다.

메인 HTML 소스에 찾는 데이터가 존재하는 경우(1, 2번)

웹페이지에서 최초로 불러오는 HTML 소스에서 데이터가 존재하는지 확인하는 방법을 알아봅시다. 해당 페이지를 웹 브라우저에서 열어둔 상태로 ➝ 마우스 오른쪽 버튼을 클릭하여 ➝ [페이지 소스 보기]를 선택합니다. 그러면 새로운 창이 열리면서 웹페이지에서 최초로 불러오는 HTML 소스가 나타납니다.

주의: 크롬 [개발자 도구]의 Elements 탭에 나오는 HTML은 자바스크립트 등에 의해 동적으로 변경된 ‘현재 상태’를 보여주기 때문에 ‘페이지 소스 보기’에서 나오는 HTML의 내용은 다를 수도 있습니다.

정적인 웹페이지라면 HTML 내용 안에 원하는 데이터가 존재할 가능성이 매우 큽니다. 두 가지 방식으로 데이터가 존재할 수 있습니다.

첫 번째는 HTML 태그 안에 텍스트 형태로 존재하는 경우입니다. 웹페이지 주소에서 HTML을 불러온 후 cheerio를 이용해 요소를 찾아내는 방식을 사용하면 됩니다. 이 방식이 가장 기본적이기도 하고 가장 많은 웹페이지에 적용되는 방식입니다. 첫 크롤러를 만들 때 사용한 방식이기도 합니다.

두 번째는 ❶ script 태그 안에 자바스크립트 코드로 데이터가 하드코딩된 경우입니다. script 태그 안에 자바스크립트 코드를 인라인inline으로 작성하면 페이지가 로드되면서 자동으로 실행됩니다. 이곳에 변수를 선언해 자바스크립트 코드 형태로 원하는 데이터를 하드코딩해두면, 언제든 해당 변수에 접근해 데이터를 읽을 수 있습니다. 예를 들어 다음과 같은 페이지에서 ‘크롤링할 내용’ 텍스트를 추출하려면 어떻게 해야 하는지 알아보도록 합시다.

https://yjiq150.github.io/coronaboard-crawling-sample/dom-with-script

… 생략 … … 생략 …

가장 쉽고 효율적인 방법은 script 태그에 있는 자바스크립트 소스 코드를 노드 환경에서 실제로 실행한 후 해당 변수의 값을 읽어들이는 겁니다. 예제 코드를 보면서 하나씩 설명하겠습니다.

crawler/examples/dom-with-script.js

const axios = require(‘axios’); const cheerio = require(‘cheerio’); // ❶ 추출된 자바스크립트 코드를 별도 실행하는 가상 환경 기능 로드 const vm = require(‘vm’); async function main() { const resp = await axios.get( ‘https://yjiq150.github.io/coronaboard-crawling-sample/dom-with-script’, ); const $ = cheerio.load(resp.data); // ❷ script 태그를 찾아서 코드 추출 const extractedCode = $(‘script’).first().html(); // ❸ 컨텍스트를 생성 후 해당 컨텍스트에서 추출된 코드 실행 const context = {}; vm.createContext(context); vm.runInContext(extractedCode, context); // ➍ 스크립트 내에 하드코딩된 정보에 접근 console.log(context.dataExample.content); } main();

[출력 결과]

크롤링할 내용

노드JS에서는 외부에서 불러온 자바스크립트 코드를 실행하는 기능을 제공합니다. 바로 vm 기능입니다. 기본 내장 라이브러리에서 제공되는 기능이라서 ❶에서처럼 곧바로 사용이 가능합니다.

❷ HTML 태그 안의 텍스트를 추출하던 방식으로 script 태그를 찾고, script 태그 안에 존재하는 코드를 추출합니다. 특정 요소 서브에 속한 모든 텍스트만 추출하는 경우에는 text() 함수를 사용하지만 여기에서는 원본 HTML에서 script 태그 안에 작성된 내용 그 자체를 가져오기 위해서 html() 함수를 호출했습니다.

❸ 새롭게 컨텍스트context를 만들어 추출된 코드를 실행합니다. 여기서 컨텍스트란 코드가 실행되면서 생성한 변수나 값들이 저장되는 공간이라고 생각하시면 됩니다. 실행된 코드에서 사용한 변수들은 해당 컨텍스트 안에서만 생성되고 존재합니다. 코드가 실행되면 dataExample 변수가 컨텍스트 내에 생성되어, 컨텍스트 객체를 통해서 접근할 수 있습니다. ❹ dataExample 변수를 이용하여 목표로 한 ‘크롤링할 내용’을 추출합니다.

API를 호출해서 외부에서 데이터를 불러오는 경우(3번)

웹 브라우저로 웹페이지를 불러올 때는 분명히 찾는 데이터가 있는데 HTML 소스 보기를 하면 없는 경우도 자주 있습니다. 보통 웹페이지 어딘가에서 API를 호출을 추가로 데이터를 불러오기 때문일 가능성이 높습니다.

메인 HTML 내부에 기본 콘텐츠가 있고 일부 데이터는 동적으로 불러오는 형태로 설계된 웹사이트들 이에 해당합니다. 웹페이지에서 사용하는 API는 일반적으로 HTTP 기반의 API를 많이 사용하므로 이런 API 호출이 일어났는지부터 확인해야 합니다. 이때 크롬 [개발자 도구]의 [Network] 탭이 아주 유용합니다.

[Network] 탭을 실제로 어떤식으로 사용하는지 잘 보여줄 예제 페이지를 준비해두었습니다.

https://yjiq150.github.io/coronaboard-crawling-sample/http-api

이 페이지를 웹 브라우저에서 열면 웹 브라우저 화면에 다음과 같이 페이지가 렌더링됩니다. 이 중 ‘API 호출로 받아온 내용입니다’라는 부분을 크롤러를 만들어서 추출하고 싶다고 가정해봅시다.

이제 [개발자 도구]를 열고 ➝ [Network] 탭에서 ➝ 레코딩이 활성화된 상태로 ➝ 페이지를 새로고침하고 ➝ ❶ All을 선택하면 ➝ 해당 페이지에서 주고받은 모든 통신 내용이 기록됩니다. 예제 웹페이지에서는 다음과 같이 ❷ 요청이 2번 발생했음을 확인할 수 있습니다.

http-api는 예제 웹페이지의 HTML을 불러오는 요청입니다. [Protocol]6 값이 h2 인데, HTTP/2 프로토콜을 사용해서 통신을 진행했다는 말입니다. [Type]은 document입니다. HTML과 같은 웹페이지 불러왔다는 의미입니다. ❶ [Name]에서 http-api를 클릭하면 ➝ ❷ 오른쪽에 나오는 패널이 나타나면서 ➝ ❸ [Response] 탭에 HTML 내용을 보여줍니다([페이지 소스 보기] 기능을 사용했을 때 나타나는 내용과 동일합니다).

웹 브라우저에서 접속했을 때 분명히 ‘API 호출로 받아온 내용입니다’라는 글자를 확인할 수 있죠. 그런데 코드를 보면 h1 , p 태그의 내용이 모두 비어 있고 해당 문구가 안 보이네요. 그렇다면 해당 문구는 도대체 어디서 나타난 걸까요? 다음 코드를 살펴보겠습니다.

https://yjiq150.github.io/coronaboard-crawling-sample/http-api

… 생략 …

❶ fetch() 함수를 이용하여 특정 주소에 요청을 하여 json 형식으로 작성된 텍스트 응답을 받습니다. 이 응답 내용을 json 함수를 사용해 자바스크립트 객체로 변환한 후 ➝ 해당 객체에 담긴 title , content 필드값 각각을 h1 태그와 p 태그에 넣어준 겁니다. 이 코드를 보면 해당 문구가 https://yjiq150.github.io/coronaboard-crawling-sample/example-data.json 주소에 대한 응답에 있다는 사실을 유추할 수 있습니다.

데이터를 받아오는지 알아내는 다른 방법으로는 [Network] 탭에 기록된 요청을 살펴보는 방법이 있습니다. [Network] 탭에 기록된 ❶ example-data.json을 클릭하여 응답 내용을 확인하면 ❷ 웹 브라우저 표시된 문구들을 확인할 수 있습니다.

네트워크 요청이 적으면 손쉽게 찾을 수 있지만 페이지가 복잡하여 수십 개 요청이 수행되거나 응답 데이터양이 너무 많은 경우 눈으로 훑어보기가 어렵습니다. 이때는 [Network] 탭 설명을 하던 도중 언급한 ‘응답 본문 검색’ 기능을 사용하면 됩니다. 다음처럼 ❶ 돋보기 아이콘을 눌러서 좌측 검색 패널을 활성화한 후 ➝ ❷ 검색 키워드(예를 들어 ‘API 호출로 받아온 내용입니다’)를 검색 ➝ ❸ 검색된 내용을 클릭하면 ➝ ➍ 해당 응답이 열리면서 해당 위치를 하이라이트까지 해줍니다.

데이터가 있는 API 경로를 찾아냈으니 크롤링 코드를 작성해봅시다.

crawler/examples/http-api.js

const axios = require(‘axios’); async function main() { const resp = await axios.get( ‘https://yjiq150.github.io/coronaboard-crawling-sample/example-data.json’, ); console.log(resp.data.content); } main();

[출력 결과]

API 호출로 받아온 내용입니다

API 주소에서 데이터를 바로 가져와서 사용할 수 있어서 HTML에서 정보를 찾아낼 때보다 훨씬 코드가 간단합니다.

참고로 axios 에서는 응답 헤더의 Content-Type 이 application/json 이면 응답 내용이 JSON인 것을 인식하고 텍스트로 받은 응답을 자동으로 자바스크립트 객체로 만듭니다(웹 브라우저를 이용하는 예제에서는 수동으로 진행해줘야 했죠). 그래서 응답 객체의 data 필드에 접근하면 이미 객체화된 데이터에 바로 접근할 수 있습니다.

웹사이트에서 HTTP API로 데이터를 불러올 때 ‘데이터 자체’만을 포함한 JSON 형식을 주로 사용합니다. 하지만 가끔 데이터 외에 해당 데이터를 둘러싼 태그까지 포함된 HTML 형태로 데이터를 불러오는 경우도 있습니다. 이때는 html 태그, body 태그 등 기본적인 HTML을 구성하는 태그가 없습니다. 실제 사용자에게 보여줄 데이터와 태그가 포함된 HTML을 메인 HTML에 끼워넣는 방식으로 사용자에게 보여주게 됩니다. 이러한 데이터를 크롤링하는 방법은 메인 HTML을 cheerio 를 통해 파싱해서 원하는 데이터를 찾는 방법과 동일하기 때문에 자세한 설명은 생략하겠습니다.

그래도 데이터가 안 나온다면?

지금까지 설명한 방법들만 잘 이용해도 대부분의 웹사이트를 크롤링할 수 있습니다. 앞서 설명한 모든 방법을 다 썼는데도 눈에 보이는 데이터를 찾지 못했다면 다음과같은 경우일 수 있습니다.

첫 번째는 데이터가 자바스크립트 코드 내에 존재하지만 해당 데이터에 접근하는 명확한 경로를 알 수 없는 경우입니다. 앞서 예제에서는 HTML 안에 존재하는 script 태그 안에 인라인으로 자바스크립트 코드를 작성하고 전역 변수를 사용했기 때문에 데이터 접근이 쉬웠습니다. 하지만 실제 규모 있는 웹페이지에서는 script 태그에서 별도의 자바스크립트 파일을 읽어들여서 실행하는 방식을 더 많이 사용합니다. 이때에도 전역 변수가 사용된다면 해당 자바스크립트 파일의 코드를 vm 라이브러리를 통해 실행한 후 전역 변수에 접근하여 사용하면 됩니다. 반면 전역 변수가 아니라 자바스크립트 파일 깊숙한 곳에 존재하는 변수라면 접근이 어렵습니다.

두 번째는 보안을 강화할 목적으로 데이터를 암호화/인코딩encoding해서 전달을 하는 경우입니다. 이 경우에는 [Network] 탭에서 원하는 텍스트를 검색하더라도, 데이터가 평문이 아니기 때문에 검색되지 않습니다. 이런 경우에는 해당 페이지에서 사용하는 자바스크립트에 포함된 관련 코드를 분석하여 주고받는 데이터를 복호화/디코딩decoding해야 합니다.

위 두 가지 경우에는 결국 실제로 웹브라우저로 해당 웹페이지를 열고, 웹페이지의 렌더링이 완료되기를 기다린 후 웹브라우저에 로드된 DOM에서 원하는 데이터를 찾아서 추출해야 합니다 (4번 방식). 이 방식은 접근 방법 자체가 다르므로 다음 절에서 알아보겠습니다.

마지막으로 HTTP API 통신이 아닌 웹소켓WebSocket 등을 이용한 소켓 통신 방식으로 데이터를 주고받는 경우가 있을 수 있습니다. 다행히 웹소켓 통신 내용은 [개발자 도구]의 [Network] 탭에 잘 나타나기 때문에 데이터의 존재 여부 확인은 쉽습니다. 이 경우 크롤링하고자 하는 웹소켓 통신의 요청/응답 내용을 잘 분석하여 어떤 식으로 데이터를 주고받는지를 정확히 파악해야 합니다. 그 후 원하는 데이터를 서버에 요청하면 응답으로 해당 데이터를 받게 되고, 이 응답에서 원하는 데이터를 추출하는 식으로 크롤러를 구현하면 됩니다).

헤드리스 브라우저를 이용한 크롤링 (4번)

헤드리스 브라우저headless browser란 GUI 없이 CLI에서 실행되는 웹 브라우저입니다. 예를 들어 구글 크롬은 헤드리스 모드를 제공합니다. 헤드리스 브라우저를 사용하면 CLI 환경에서 웹페이지의 스크린샷을 생성한다든가, 해당 웹페이지의 특정 버튼을 눌러서 의도한 대로 동작이 잘 되는지 테스트를 해본다든가 하는 자동화 작업을 편리하게 할 수 있습니다. 특히 크롬 개발팀에서 만든 puppeteer 라이브러리를 사용하면 크롬 브라우저의 모든 기능을 제어할 수 있습니다. 때문에 브라우저에 페이지가 완전히 로드되기를 기다렸다가 완성된 DOM에서 원하는 데이터를 찾으면 됩니다. 이 방식을 사용하면 데이터가 어디에 존재하는지 일일이 네트워크 요청을 뒤질 필요가 없습니다. 일반 웹 브라우저에서 사용자가 보는 웹페이지에 우리가 찾는 데이터가 있다면 헤드리스 브라우저에서도 우리가 찾는 데이터가 동일한 위치에 존재할 것이기 때문입니다.

예시를 보면서 어떤식으로 동작하는지 확인합시다.

헤드리스 브라우저로 크롤링하기

헤드리스 브라우저로 크롤링할 예시 페이지 주소는 다음과 같습니다.

먼저 일반 웹 브라우저에서 페이지를 열고 어떻게 동작하는지 확인을 해봅시다. 페이지를 열면 [제목/내용] 불러오기 버튼만 덩그러니 있고 아무런 데이터가 없습니다. 해당 버튼을 클릭하면 페이지의 제목과 내용을 불러와서 보여줍니다. 크롤링하길 원하는 데이터가 ‘API 호출로 받아온 내용입니다’라고 가정하고 설명을 진행하겠습니다([Network] 탭에서 쉽게 확인할 수 있습니다).

crawler/example/headless-browser.js

const puppeteer = require(‘puppeteer’); async function main() { const browser = await puppeteer.launch(); // ❶ 헤드리스 브라우저 실행 const page = await browser.newPage(); // ❷ 브라우저에 새 페이지 생성 const pageUrl = ‘https://yjiq150.github.io/coronaboard-crawling-sample/http-api-with-button’; await page.goto(pageUrl, { // ❸ 모든 네트워크 연결이 500ms 이상 유휴 상태가 될 때까지 기다림 waitUntil: ‘networkidle0’, }); // ➍ 제목/내용 불러오기 버튼을 클릭 await page.click(‘input[type=”button”]’); await page.waitForFunction(() => { // ➎ 함수가 웹브라우저의 컨텍스트에서 실행되기 때문에 document 객체에 접근 가능 return document.getElementById(‘content’).textContent.length > 0; }); // ➏ 특정 셀렉터에 대해 제공된 함수를 수행한 값 반환 const content = await page.$eval( ‘#content’, (elements) => elements[0].textContent, ); console.log(content); await browser.close(); // ➐ 작업이 완료되면 브라우저 종료 } main();

[출력 결과]

API 호출로 받아온 내용입니다

❶ 헤드리스 브라우저를 실행합니다. launch() 함수에 인수를 넣지 않아 기본 설치된 크로미움이 실행됩니다.

실행된 웹 브라우저는 헤드리스 모드이기 때문에 눈에 보이지는 않지만 pupeeteer 에서 제공하는 함수를 이용해 제어할 수 있습니다. ❷ 새로운 페이지를 생성합니다. 페이지가 준비되면 page 객체에서 제공하는 goto() 함수를 이용하여 특정 주소를 로드합니다.

❸ waitUntil 옵션을 주면 해당 주소에 대한 웹페이지 로드 코드를 수행한 후 다음 코드를 실행하기 전에 언제나 기다릴지를 정할 수 있습니다. 아래처럼 여러 옵션을 지원하므로 용도에 맞게 사용하면 됩니다.

domcontentloaded : 메인 HTML이 로드되어 DOM이 생성된 순간까지 기다립니다. 포함된 리소스의 로드는 기다리지 않기 때문에 찾는 내용이 메인 HTML 자체에 존재하는 경우 유용합니다.

: 메인 HTML이 로드되어 DOM이 생성된 순간까지 기다립니다. 포함된 리소스의 로드는 기다리지 않기 때문에 찾는 내용이 메인 HTML 자체에 존재하는 경우 유용합니다. load : 메인 HTML과 포함된 자바스크립트, CSS, 이미지 등 모든 리소스가 로드될 때까지 기다립니다.

: 메인 HTML과 포함된 자바스크립트, CSS, 이미지 등 모든 리소스가 로드될 때까지 기다립니다. networkidle0 : 최소 500ms 동안 활성화된 네트워크 연결이 완전히 없어질 때까지 기다립니다. 자바스크립트를 사용한 API 요청이 있는 페이지에 유용합니다.

: 최소 500ms 동안 활성화된 네트워크 연결이 완전히 없어질 때까지 기다립니다. 자바스크립트를 사용한 API 요청이 있는 페이지에 유용합니다. networkidle2 : 최소 500ms 동안 활성화된 네트워크 연결이 2개 이하로 유지될 때까지 기다립니다. 웹페이지 로드가 완료된 이후에도 주기적으로 정보를 업데이트하는 등 폴링 방식으로 구현된 웹페이지에 적용하면 유용합니다.

용어: 폴링(polling) 외부 상태를 확인할 목적으로 주기적으로 검사를 수행하는 방식. 클라이언트/서버 환경에 적용하면 보통 클라이언트가 서버에 주기적으로 요청을 해서 새로운 정보가 있는지 확인하여 받아오는 방식을 의미합니다.

앞서 예제 페이지를 직접 열어보면 [제목/내용 불러오기] 버튼을 누르기 전까지는 원하는 데이터가 페이지에 렌더링되어 있지 않기 때문에 크롤링할 방법이 없습니다. 그래서 ❹ page 객체에서 제공하는 click() 함수를 이용하여 원하는 요소를 CSS 셀렉터로 지정하고, 선택된 요소에 클릭 이벤트를 발생시켜서 웹 브라우저에서 클릭한 효과를 만들어줍니다.

이때 API가 호출되고 데이터를 불러오는 과정에 시간이 걸립니다. 데이터를 불러와서 해당 내용이 DOM을 업데이트되기 전까지는 원하는 데이터를 얻을 수 없습니다. page 객체는 작업이 완료될 때까지 기다리는 다음과 같은 여러 함수를 제공합니다.

waitForTimeout : 단순히 지정한 시간만큼 기다리는 함수입니다. 네트워크 속도나 상황에 따라 응답 속도가 달라질 수 있어서 상황에 맞게 2초에서 30초로 잡게 됩니다. 대기 시간이 길면 크롤링 시간도 그만큼 오래 걸려서 비효율적입니다. 최대한 사용을 지양하는 것이 좋습니다.

: 단순히 지정한 시간만큼 기다리는 함수입니다. 네트워크 속도나 상황에 따라 응답 속도가 달라질 수 있어서 상황에 맞게 2초에서 30초로 잡게 됩니다. 대기 시간이 길면 크롤링 시간도 그만큼 오래 걸려서 비효율적입니다. 최대한 사용을 지양하는 것이 좋습니다. waitForFunction : 조건을 인수로 받아, 실제 웹 브라우저 컨텍스트에서 실행을 하여 참이 될 때까지 기다리는 함수입니다. 웹 브라우저 컨텍스트에서 실행되기 때문에 웹 브라우저에 전역 객체로 존재하는 document 객체에 접근을 하여 사용합니다. ❺ id값이 content인 요소에 접근하여 텍스트가 채워져 있는지를 확인합니다.

: 조건을 인수로 받아, 실제 웹 브라우저 컨텍스트에서 실행을 하여 참이 될 때까지 기다리는 함수입니다. 웹 브라우저 컨텍스트에서 실행되기 때문에 웹 브라우저에 전역 객체로 존재하는 객체에 접근을 하여 사용합니다. ❺ id값이 content인 요소에 접근하여 텍스트가 채워져 있는지를 확인합니다. waitForSelector : CSS 셀렉터를 인수로 받고, 해당 셀렉터를 만족하는 요소가 존재할 때까지 기다리는 함수입니다. waitForFunction 보다 간편하게 사용할 수 있지만 요소의 존재 여부로만 판단하기 때문에 복잡한 조건에서는 사용이 불가능합니다.

웹 브라우저에서 버튼을 클릭하고 API 응답을 받아 페이지에 콘텐츠가 채워지는 시점까지 기다리는 데 성공했습니다. 마지막으로 웹 브라우저에 로드된 DOM의 특정 요소에 접근하여 값을 가져올 일만 남았습니다. 이 작업은 이미 웹 브라우저의 콘솔에서 수동으로 코드를 입력하여 실행하는 방식으로 한번 다룬 내용입니다 (튜토리얼 2편 참고). 여기서는 puppeteer 를 이용해서 노드 환경에서 동작하는 자바스크립트 코드로 작성하여 자동화하겠습니다.

❻에서처럼 page 객체에 존재하는 $eval() 함수를 사용하면 웹 브라우저 컨텍스트에서 코드를 실행하고, 반환값을 가져올 수 있습니다. id 값이 content 인 요소를 찾고, 찾은 요소의 textContext 속성에 접근하여 가져온 값을 반환합니다. 반환된 값은 최종적으로 content 변수에 저장됩니다. 그 결과 ‘API 호출로 받아온 내용입니다’가 잘 출력됩니다.

❼ 크롤링이 완료되었으니 헤드리스 웹 브라우저를 종료합니다. 웹 브라우저는 메모리를 상당히 많이 사용하는 애플리케이션이기 때문에 꼭 종료해주는 것이 좋습니다.

puppeteer 에 대한 더 자세한 소개는 다음 사이트에서 확인하기 바랍니다.

질문: 모든 크롤러를 헤드리스 브라우저로 만들면 안 되나요? 모든 크롤러는 헤드리스 브라우저로 만들 수 있습니다. 헤드리스 브라우저 기반으로 크롤러를 만들면 UI가 있는 웹 브라우저를 사용할 때보다는 메모리를 약간 적게 사용합니다. 하지만 여전히 크롤러가 시작될 때 헤드리스 웹 브라우저 애플리케이션도 같이 실행되어야 합니다. 크롤러만 사용할 때보다 시작 속도도 느리고 메모리도 많이 사용하죠. 때문에 크롤링을 할 때 가능하면 헤드리스 브라우저를 쓰지 않는 것이 더 빠르고 효율적입니다.

마무리

이제 다양한 유형의 웹사이트를 크롤링하기 위한 기본적인 방법을 모두 익혔습니다. 이정도까지만 익혀둬도 왠만한 웹페이지는 손쉽게 크롤링 하실 수 있을 것입니다. 조금 더 응용력을 길러드리기 위해서 4편에서는 복잡한 웹페이지를 실제로 크롤링해서 원하는 데이터를 추출하는 것을 실습해보도록 하겠습니다.

‘코로나보드로 배우는 실전 웹 서비스 개발’ 책에서는 크롤러 뿐만 아니라 구글 스프레드 시트를 저장소로 사용하는 방법, 개츠비 + 리액트를 사용해서 웹사이트를 개발하는 방법, 도메인 설정, 검색엔진 최적화, 사용자 분석, 광고를 통한 수익화 등을 다룹니다. 웹서비스 개발과 운영에 대한 전반적인 내용을 알고싶으신 분들이나, 사이드 프로젝트를 만들어보고 싶으신 분들에게 추천합니다.

각주

키워드에 대한 정보 크롤링 방법

다음은 Bing에서 크롤링 방법 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 파이썬 웹 크롤링 하기 – 너무 간단해서 민망합니다.

  • 파이썬
  • 크롤링
  • 웹크롤링
  • 설명

파이썬 #웹 #크롤링 #하기 #- #너무 #간단해서 #민망합니다.


YouTube에서 크롤링 방법 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 파이썬 웹 크롤링 하기 – 너무 간단해서 민망합니다. | 크롤링 방법, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment