당신은 주제를 찾고 있습니까 “파이썬 크롤링 – 파이썬 코딩 무료 강의 (활용편3) – 웹 크롤링? 웹 스크래핑! 제가 가진 모든 비법을 알려드리겠습니다. [나도코딩]“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 나도코딩 이(가) 작성한 기사에는 조회수 473,494회 및 좋아요 8,371개 개의 좋아요가 있습니다.
파이썬 크롤링 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 파이썬 코딩 무료 강의 (활용편3) – 웹 크롤링? 웹 스크래핑! 제가 가진 모든 비법을 알려드리겠습니다. [나도코딩] – 파이썬 크롤링 주제에 대한 세부정보를 참조하세요
파이썬 무료 강의 (활용편3 – 웹스크래핑)입니다.
누구나 볼 수 있도록 쉽고 재미있게 제작하였습니다. ^^
이 강의를 보고 나면 어느 웹이건 스크래핑 해올 수 있습니다.
* 웹에서 가져온 데이터를 무단으로 사용 시 법적 문제가 생길 수 있으니 강의 내용을 꼭 확인해주세요.
* 본 영상은 기본편을 학습한 분들을 위한 강의입니다.
파이썬을 처음 접하신다면, 아래 기본편을 먼저 공부해주세요 ^^
[ 기본편 ]파이썬은 다양한 활용 분야가 있는 인기 최고의 프로그래밍 언어입니다.
수많은 컴퓨터 교육 기관에서 가르치고 있으며 학생들도 배우고 있지요.
여러분의 가치를 훨씬 높일 수 있는 필살기,
지금 바로 시작하세요 !
바로가기 : https://youtu.be/kWiCuklohdY
1. 게임 개발 [완료]
– 오락실에서 하던 Pang 게임
– 바로가기 : https://youtu.be/Dkx8Pl6QKW0
2. GUI 프로그래밍 [완료] – 영상에서 캡처한 이미지들을 하나로 합치는 프로그램
– 바로가기 : https://youtu.be/bKPIcoou9N8
3. 웹스크래핑 [완료] – 내가 원하는 뉴스를 매일 자동으로 긁어오는 프로그램
4. 업무자동화 [완료] – 엑셀, 인터넷, 데스크탑 등 컴퓨터에게 일을 시키는 스크립트
– 바로가기 : https://youtu.be/exgO1LFl9x8
5. 데이터 분석 및 시각화 [완료] – 빅데이터를 활용한 대한민국의 인구 문제 분석
– 바로가기 : https://youtu.be/PjhlUzp_cU0
6. 이미지 처리 [완료] – 이미지 / 영상에서 얼굴을 인식하여 얼굴 위에 재밌는 캐릭터 씌우기
– 바로가기 : https://youtu.be/XK3eU9egll8
7. 머신러닝 [완료] – 머신러닝을 이용하여 나만의 영화 추천 시스템 만들기
– 바로가기 : https://youtu.be/TNcfJHajqJY
8. 사물인터넷
– 아두이노를 활용한 RC Car 제작 [목차][기본기](0:00:00) 0.Intro
(0:00:16) 1.소개
(0:02:03) 2.활용편3 소개
(0:07:26) 3.HTML
(0:16:51) 4.XPath
(0:28:12) 5.크롬
(0:31:45) 6.Requests
(0:39:26) 7.정규식 기본 1
(0:50:52) 8.정규식 기본 2
(0:58:56) 9.User Agent
(1:06:40) 10.BeautifulSoup4 기본 1 (네이버 웹툰)
(1:18:37) 11.BeautifulSoup4 기본 2
(1:28:13) 12.BeautifulSoup4 활용 1-1 (가우스 전자)
(1:39:26) 13.BeautifulSoup4 활용 1-2
(1:47:55) 14.BeautifulSoup4 활용 2-1 (쿠팡)
(2:00:11) 15.BeautifulSoup4 활용 2-2
(2:05:35) 16.BeautifulSoup4 활용 2-3
(2:15:22) 17.BeautifulSoup4 활용 2-4
(2:22:44) 18.BeautifulSoup4 활용 3-1 (다음 이미지)
(2:31:46) 19.BeautifulSoup4 활용 3-2
(2:41:09) 20.CSV 기본 1 (네이버 금융)
(2:49:55) 21.CSV 기본 2
(2:56:21) 22.Selenium 기본 1
(3:07:45) 23.Selenium 기본 2
(3:13:43) 24.Selenium 심화 (네이버 로그인)
(3:21:40) 25.Selenium 활용 1-1 (네이버 항공권)
(3:33:40) 26.Selenium 활용 1-2
(3:39:15) 27.Selenium 활용 2-1 (구글 무비)
(3:50:17) 28.Selenium 활용 2-2
(4:00:39) 29.Selenium 활용 2-3
(4:10:39) 30.Selenium 활용 2-4
(4:15:24) 31.Headless 크롬
(4:23:38) 32.Wrap Up
[퀴즈](4:32:21) 33.퀴즈 (다음 부동산)
[프로젝트](4:43:13) 34.프로젝트
(4:48:49) 35.오늘의 날씨 (네이버 날씨)
(5:02:06) 36.헤드라인 뉴스 (네이버 뉴스)
(5:10:26) 37.IT 일반 뉴스 (네이버 뉴스)
(5:18:22) 38.오늘의 영어회화 (해커스 영어)
(5:27:25) 39.Outro [ 나도코딩의 정규 강의 ]파이썬 (기본편): https://youtu.be/kWiCuklohdY
C 프로그래밍 : https://youtu.be/dEykoFZkf5Y
스크래치 3.0 : https://youtu.be/xN8O_mhR-7Y [ 나도코딩의 단편 강의 ]업무 생산성 200% 높이기 Notepad++ : https://youtu.be/r1lpBGlIzY0
개발시간을 줄여주는 단축키 10 Visual Studio : https://youtu.be/LmCFaOB4YPI [ 연락 ][email protected]
* 질문은 댓글을 통해서 해주세요 ^^
Designed by freepik
: https://www.freepik.com
파이썬 크롤링 주제에 대한 자세한 내용은 여기를 참조하세요.
파이썬 웹 크롤링(Web Crawling) 강좌 – 1. 웹페이지 긁어오기
Beautiful Soup를 사용하여 간단한 웹 크롤러를 만드는 방법을 다루고 있습니다. Python 3.6으로 코드를 작성하였습니다. 버전의 차이로 필요한 모듈 …
Source: webnautes.tistory.com
Date Published: 8/13/2022
View: 9937
[Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았 …
Source: coding-kindergarten.tistory.com
Date Published: 11/4/2022
View: 9988
파이썬 웹 크롤링? 웹 스크래핑 개념과 실습 예제 – Snug Archive
파이썬 웹 크롤링? … Python 웹 스크래핑 코드로 실습하기 … 이번 시간에는 웹 스크래핑과 웹 크롤링의 차이는 무엇인지 그리고 웹 스크래핑 실습 …
Source: snugarchive.com
Date Published: 6/18/2022
View: 2497
BeautifulSoup와 requests로 웹 파싱해보기 – 파이썬 실습
본문으로 들어가기 전, 먼저 크롤링(Crawling), 파싱(Parsing), 스크래핑(Scraping)에 대한 정의를 알아보겠습니다. 웹 크롤러 (Web crawler).
Source: library.gabia.com
Date Published: 8/29/2021
View: 1504
python으로 크롤링 하기 기초 1- selenium – 알마덴디자인리서치
3시간이면 나만의 데이터가 쌓이는 겁니다. 참쉽죠^^? 파이썬 크롤링. 1. selenium(셀레니움) 이란? 지금부터 파이썬(python) …
Source: blog.almaden.co.kr
Date Published: 9/29/2021
View: 1107
[파이썬] Python 웹페이지 크롤링 하는 방법(뉴스 긁어오기)
파이썬 언어로 크롤링 하는 방법. 다음은 뉴스타파 뉴스 웹사이트의 “세금도둑추적2020” 뉴스 크롤링 하는 예제입니다. 뉴스부분의 HTML을 파싱하기 …
Source: www.naragara.com
Date Published: 1/22/2021
View: 6762
파이썬 크롤링으로 파일들 다운받기 – velog
… 당장 크롤링 시작전체코드결과물코드 뜯어보기세팅하기beautifulsoup4와 requests를 설치한다.beautifulsoup4를 쓰려면 Python 3.9 이하를.
Source: velog.io
Date Published: 11/26/2021
View: 8576
주제와 관련된 이미지 파이썬 크롤링
주제와 관련된 더 많은 사진을 참조하십시오 파이썬 코딩 무료 강의 (활용편3) – 웹 크롤링? 웹 스크래핑! 제가 가진 모든 비법을 알려드리겠습니다. [나도코딩]. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
![파이썬 코딩 무료 강의 (활용편3) - 웹 크롤링? 웹 스크래핑! 제가 가진 모든 비법을 알려드리겠습니다. [나도코딩]](https://i.ytimg.com/vi/yQ20jZwDjTE/maxresdefault.jpg)
주제에 대한 기사 평가 파이썬 크롤링
- Author: 나도코딩
- Views: 조회수 473,494회
- Likes: 좋아요 8,371개
- Date Published: 2020. 8. 7.
- Video Url link: https://www.youtube.com/watch?v=yQ20jZwDjTE
파이썬 웹 크롤링(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) 강좌] – 웹크롤링 강좌 – 기상청의 동네예보 가져오기반응형
[Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리
반응형
안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.
업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.
[웹 크롤링 기초]2021.03.22 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 파이썬 웹 크롤링 기초 of 기초
2021.03.23 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법
2021.03.24 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리
2021.03.27 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리
2021.03.28 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 동적/정적 페이지 차이와 그에 따른 크롤링 방법 간단정리
[정적 웹크롤링]2021.03.30 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 파이썬 웹 크롤링 정적 수집 방법 개념 정리_find, find_all, select, select_one
2021.04.02 – [파이썬 패키지/웹 크롤링] – [Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리
2021.04.06 – [파이썬 패키지/웹 크롤링] – [Python/Reuqests/Beautifulsoup] 파이썬 정적 웹크롤링 텍스트, 이미지, 하이퍼링크, 속성 가져오는 법
[동적 웹크롤링]2021.04.03 – [분류 전체보기] – [코딩유치원] 네이버 뉴스 기사 제목 크롤링을 통한 동적 수집 기초 정리(selenium, beautifulsoup)
2021.06.21 – [파이썬 패키지/웹 크롤링] – [Python/Selenium] 파이썬 동적 웹크롤링 텍스트, 하이퍼링크, 이미지, 속성 가져오는 법
2021.05.22 – [파이썬 패키지/GUI 프로그램] – [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램
오늘은 웹크롤링 관련 파이썬 패키지 3가지를 알아보겠습니다.
우리가 앞으로 하게 될 웹 크롤링은 두 가지 단계를 거칩니다.
1) 원하는 웹 페이지의 html문서를 싹 긁어온다.
2) html 문서에서 원하는 것을 골라서 사용한다.
위의 두 가지 작업과 관련하여 자주 사용되는 패키지를 하나씩 살펴보겠습니다.
1. requests
html 문서를 가져올 때 사용하는 패키지입니다. requests는 사용자 친화적인 문법을 사용하여 다루기 쉬우면서 안정성이 뛰어나다고 합니다. 그래서 파이썬 기본 라이브러리에 포함된 urllib 패키지보다 자주 사용됩니다.
설치 방법
터미널에서 아래와 같이 입력하면 됩니다. (만약 anaconda 환경이 아니라 python을 사용한다면 conda 대신 pip를 입력할 것)
conda install requests
사용 방법
import requests # requests 패키지 가져오기 url = ‘https://www.naver.com’ # 가져올 url 문자열로 입력 response = requests.get(url) # requests의 get함수를 이용해 해당 url로 부터 html이 담긴 자료를 받아옴 print(response.status_code) # 정상적으로 받아졌다면 200이라는 상태코드를 반환 html_text = response.text # 우리가 얻고자 하는 html 문서가 여기에 담기게 됨
2. Selenium
selenium 패키지는 지난 시간 설치했던 chromedriver를 이용해 chrome을 제어하기 위해 사용합니다. 크롤링을 하다보면 무엇인가 입력하거나 특정 버튼을 눌러야 하는 상황이 발생합니다. 이 때 selenium을 이용하는 것입니다.
만약 크롬드라이버가 설치되어 있지 않다면 아래의 글을 참고해서 설치해주세요.
2021.03.23 – [파이썬 기초/개발환경 구축] – [코딩유치원] 크롬드라이버 크롬 버전에 맞춰서 설치하는법
설치 방법
터미널에서 아래와 같이 입력하면 됩니다. (만약 anaconda 환경이 아니라 python을 사용한다면 conda 대신 pip를 입력할 것)
conda install selenium
사용 방법
이 패키지는 조금 공부할 것이 많아서 여기서는 대략적으로 어떤 식으로 사용하는지 파악하시면 좋을 것 같아요.
driver.find_element 함수나 send_keys 함수는 여기서 다 다루기가 힘들어서 다음 시간에 따로 정리하겠습니다.
# selenium의 webdriver를 사용하기 위한 import from selenium import webdriver # selenium으로 무엇인가 입력하기 위한 import from selenium.webdriver.common.keys import Keys # 페이지 로딩을 기다리는데에 사용할 time 모듈 import import time # 크롬드라이버 실행 (경로 예: ‘/Users/Roy/Downloads/chromedriver’) driver = webdriver.Chrome(‘chromedriver의 경로를 입력할 것’) #크롬 드라이버에 url 주소 넣고 실행 driver.get(‘https://www.google.co.kr/’) # 페이지가 완전히 로딩되도록 3초동안 기다림 time.sleep(3) #검색어 창을 찾아 search 변수에 저장 search = driver.find_element_by_xpath(‘//*[@id=”google_search”]’) #search 변수에 저장된 곳에 값을 전송 search.send_keys(‘코딩유치원 파이썬’) time.sleep(1) #search 변수에 저장된 곳에 엔터를 입력 search.send_keys(Keys.ENTER)
3. BeautifulSoup4
마지막으로 BeautifulSoup4라는 패키지는 매우 길고 정신없는 html 문서를 잘 정리되고 다루기 쉬운 형태로 만들어 원하는 것만 쏙쏙 가져올 때 사용합니다. 이 작업을 파싱(Parsing)이라고도 부릅니다.
설치 방법
터미널에서 아래와 같이 입력하면 됩니다. (만약 anaconda 환경이 아니라 python을 사용한다면 conda 대신 pip를 입력할 것)
conda install beautifulsoup4
사용 방법
이 패키지 역시 내용이 많아서 여기서는 대략적으로 어떤 식으로 사용하는지 파악하시면 좋을 것 같아요.
파싱을 하는 방법에는 크게 Xpath를 이용하는 법과 CSS selector를 이용하는 방식이 있는데, 이것 역시 다음에 정리하는 시간을 갖겠습니다.
import requests # 주로 bs로 이름을 간단히 만들어서 사용함 from bs4 import BeautifulSoup as bs response = requests.get(‘https://www.google.co.kr’) # html을 잘 정리된 형태로 변환 html = bs(response.text, ‘html.parser’) # find 함수로 특정 이미지를 선택하는 코드 google_logo = html.find(‘img’, {‘id’:’hplogo’})
오늘은 가볍게 파이썬을 이용하여 웹 크롤링을 할 때 사용되는 주요 패키지에 대해서 정리해보았습니다.
다음 시간에는 크롤링을 자유자재로 하기 위해 꼭 필요한 내용들을 더 깊게 들어가보도록 하겠습니다.
반응형
파이썬 웹 크롤링? 웹 스크래핑 개념과 실습 예제
업무를 하시다가 우리가 원하는 정보를 깔끔하게 정리해서 결과만 가져오는 도구가 있으면 좋겠다는 생각 해보신 적 있으신가요? 한동안 유행했던 ‘알아서 잘 딱 깔끔하게 센스있게’ 라는 말처럼, 단순하고 반복되는 작업을 프로그램이 대신 처리해주면 얼마나 효율적일까요? 우리는 프로그램의 도움을 받아 더 본질적이고 중요한 일에 우리의 소중한 시간을 쓸 수 있을 것입니다.
생산성Kris | Unsplash
이를 가능하게 해주는 도구가 있습니다. 바로 우리가 배울 파이썬입니다. 우리는 파이썬을 통해 원하는 정보만을 우리가 원하는 방식대로 가공해서 가져올 수 있습니다. 이를 웹 스크래핑(web scraping)이라고 합니다.
웹 스크래핑? 웹 크롤링(web crawling) 아닌가요? 두 단어는 웹에서 정보를 가져오는 일을 할 때 자주 혼용되어 쓰입니다. 하지만 두 단어는 다릅니다. 웹 크롤링과 웹 스크래핑은 무엇이며 둘은 어떤 차이점이 있을까요?
이번 시간에는 웹 스크래핑과 웹 크롤링의 차이는 무엇인지 그리고 웹 스크래핑 실습을 위해 필요한 환경 설정과 준비 도구를 살펴보겠습니다. 웹 스크래핑을 위한 준비를 마치면 실제 예제 코드를 통해 우리가 웹에서 가져온 정보를 엑셀로 저장해보겠습니다. 그럼 시작해볼까요?
용어
웹 크롤링과 웹 스크래핑은 어떤 차이가 있을까요? 먼저 웹 크롤링을 살펴보겠습니다.
웹 크롤링
웹 크롤링은 ‘URL을 탐색해 반복적으로 링크를 찾고 가져오는 과정’입니다. ‘기어 다니다’ 라는 뜻의 영어 단어 크롤링(crawling)을 사용한 것에서 알 수 있듯이, 웹 크롤링은 웹 페이지를 찾아다니며 정보를 수집합니다.
대표적인 웹 크롤링으로는 검색엔진의 웹 크롤러(web crawler)가 하는 일을 예로 들 수 있습니다. 웹 크롤러는 URL을 수집하고 웹 페이지를 복사하여, 수집한 웹 페이지에 색인(index)을 부여합니다. 사용자에게 더 신속하게 정보를 제공하기 위해서죠. 분류가 잘 되어있으면 그만큼 검색 속도가 올라갈 테니까요. 그럼 웹 스크래핑은 무엇일까요?
웹 스크래핑
웹 스크래핑은 ‘우리가 정한 특정 웹 페이지에서 데이터를 추출하는 것’입니다. 우리가 특정 주제의 뉴스만을 가져오거나, 인기 검색어 정보를 가져오는 것, 어떤 상품의 가격을 모니터링하는 것 모두 웹 스크래핑입니다. 우리가 원하는 특정 웹 사이트가 있고 그곳에서 우리가 필요한 정보만을 가져오는 것이니까요. 그래서 웹 스크래핑을 웹 데이터 추출(web data extraction), 웹 하베스팅(web harvesting)이라고도 부릅니다.
웹 크롤링과 웹 스크래핑 차이
웹 크롤링과 웹 스크래핑은 모두 정보를 추출해온다는 데서는 공통점을 지닙니다. 하지만 ‘타켓 웹 페이지의 유무’와 ‘중복 제거(deduplication)의 실행 여부’에서 차이가 납니다.
웹 크롤링은 특정 웹 페이지를 목표로 하지 않습니다. 일단 탐색부터 하고, 정보를 가져오죠. ‘선탐색 후추출’입니다. 반면 웹 스크래핑을 할 때는 목표로 하는 특정 웹페이지가 있습니다. 우리가 원하는 정보를 어디서 가져올지 타겟이 분명하고, 그 타겟에서 정보를 가져오죠. 그래서 ‘선결정 후추출’입니다.
또, 웹 크롤링에서는 중복 제거가 필수적입니다. 중복되거나 불필요한 정보를 가져와서 분류를 더 어렵게 할 필요는 없으니까요. 도서관의 책이 개별적으로 구분되는 색인이 있는 것처럼 웹 크롤링도 수집한 웹 페이지가 중복되지 않도록 서로 다른 색인을 남깁니다. 그래서 웹 크롤링을 웹 인덱싱(web indexing)이라고도 부릅니다.
반면 웹 스크래핑에서는 중복 제거가 필수는 아닙니다. 중복된 정보를 가지고 있을 필요는 없지만, 그렇다고 꼭 필수적으로 하는 일도 아니죠.
이번 글에서 우리가 다룰 주제는 웹 스크래핑입니다. 웹 스크래핑을 하기 위해서는 몇 가지 환경 설정을 해야 합니다.
환경 설정
파이썬으로 웹 스크랩핑을 하기 위해서는 기본적으로 텍스트 에디터, 브라우저, 개발자 도구가 필요합니다. 이 도구들이 준비되면 파이썬 패키지 매니저인 pip 으로 웹 스크래핑 라이브러리를 설치하면 됩니다.
텍스트 에디터
저는 VS Code를 사용했습니다. 텍스트 에디터를 선택하는 것이 고민되신다면 통합 개발 환경(IDE), 텍스트 에디터 인기 순위 (2022년)에서 전 세계 개발자들이 사용하는 툴을 살펴보시고 개발 환경을 설정하셔도 됩니다.
브라우저
여기서는 구글 크롬을 사용했습니다.
개발자 도구
구글 크롬을 기준으로 개발자 도구를 여는 방법에는 크게 3가지가 있습니다.
직접 열기
오른쪽 상단 모서리에 . 이 수직 방향으로 3개 찍힌 부분을 클릭하시고 도구 더보기 를 누른 다음 개발자 도구에 들어가시면 됩니다.
네이버 웹툰에서 우리가 가져오고 싶은 부분 | Snug Archive
마우스 오른쪽 클릭 > 검사
마우스 오른쪽 버튼을 클릭한 뒤 목록의 맨 하단에 나타난 검사 를 누르면 개발자 도구를 열 수 있습니다.
네이버 웹툰에서 우리가 가져오고 싶은 부분 | Snug Archive
단축키
저는 단축키를 사용합니다. 개발자 도구 단축키는 다음과 같습니다.
윈도우: Ctrl + Shift + I
맥: Alt(Option) + Command + I
다음은 패키지 설치입니다.
패키지 설치
웹 스크래핑을 하기 위해서는 requests, beautifulsoup4, lxml 패키지가 필요합니다. requests 라이브러리는 HTTP 프로토콜을 통해 웹 서버에 요청하고 응답 받는 과정을 처리하는 라이브러리고, beautifulsoup4는 웹 페이지에서 데이터를 추출해오는 라이브러리, 그리고 lxml은 가져온 html 문서를 파싱하는 라이브러리입니다.
참고로 파서로는 내장(built-in) html.parser 를 사용할 수도 있습니다. 여기서는 html.parser 보다 속도가 빠른 lxml 을 사용했습니다. 파서에 대해 더 자세히 알고 싶은 분들은 공식 홈페이지의 BeautifulSoup 파서 차이를 참조하시면 됩니다.
라이브러리를 설치하지 않고 라이브러리를 import 하면 오류가 발생할 것입니다. 아래는 requests 모듈이 설치되어 있지 않다( No module named ‘requests’ )는 트레이스백(traceback)입니다. 트레이스백은 인터프리터가 코드를 실행하려다 문제가 생겼을 때 보여주는 기록입니다.
bash Traceback ( most recent call last ) : File “d:\Python\practice.py” , line 2 , in < module > import requests ModuleNotFoundError: No module named ‘requests’
패키지를 설치하려면 파워셸(PowerShell)이나 윈도우의 셸인 cmd에 다음과 같이 입력하시면 됩니다.
bash pip install beautifulsoup4 lxml requests
위 코드는 세 라이브러리를 한 번에 설치하는 방식입니다. pip install 을 세 번 사용해서 라이브러리를 하나씩 설치하셔도 됩니다.
텍스트 에디터, 브라우저, 개발자 도구, 그리고 패키지 설치가 모두 완료되셨으면 웹 스크래핑을 진행할 준비가 되신 겁니다. 마지막으로 웹 스크래핑을 하기 전에 한 가지 염두에 두셔야 할 점이 있습니다. 바로 Robots.txt와 사용자 에이전트(user agent)입니다.
Robots.txt와 사용자 에이전트(user agent)
Robots.txt는 웹 사이트 및 웹 페이지를 수집하는 로봇들의 무단 접근을 방지하기 위해 만들어진 로봇 배제 표준(robots exclusion standard)이자 국제 권고안입니다. 일부 스팸 봇이나 악성 목적을 지닌 가짜 클라이언트 로봇은 웹 사이트에 진짜 클라이언트처럼 접근합니다. 그리고 무단으로 웹 사이트 정보를 긁어가거나, 웹 서버에 부하를 줍니다. 이런 로봇들의 무분별한 접근을 통제하기 위해 마련된 것이 Robots.txt입니다.
그래서 가끔 웹 서버에 요청을 보내도 요청을 거부 당하는 일이 있습니다. 우리를 무단 봇으로 짐작하고 웹 서버에서 접근을 막는 것이죠. 그럼 우리는 브라우저에게 스팸 봇이 아니라 사람이라는 것을 알려주면 되겠죠? 이때 브라우저에게 전달하는 것이 사용자 에이전트(user agent) 정보입니다.
사용자 에이전트는 사용자를 대표하는 컴퓨터 프로그램입니다. 웹 맥락에서는 브라우저, 웹 페이지를 수집하는 봇, 다운로드 관리자, 웹에 접근하는 다른 앱 모두 사용자 에이전트지요. 웹 서버에 요청할 때 사용자 에이전트 HTTP 헤더(user agent HTTP header)에 나의 브라우저 정보를 전달하면 웹 서버가 나를 진짜 사용자로 인식할 수 있게 됩니다. 사용자 에이전트 헤더를 설정하는 방법은 아래 기본 코드 프레임에서 살펴보겠습니다.
요약하자면 웹 스크래핑을 할 때 원칙은 다음과 같습니다.
서버에 과도한 부하를 주지 않는다.
가져온 정보를 사용할 때(특히 상업적으로) 저작권과 데이터베이스권에 위배되지 않는지 주의한다.
이 원칙들을 잘 지킨다면 분별있는 사용자 에이전트가 될 수 있을 것입니다. 그럼 지금부터는 웹 스크래핑을 본격적으로 해보겠습니다. 기본 코드 프레임은 아래와 같습니다.
Robots.txt는 웹 페이지의 메인 주소에 ‘/robots.txt’를 입력하면 확인 할 수 있습니다. 예를 들어 naver의 경우에는 ‘www.naver.com/robots.txt’를 입력하면 됩니다. 여기서 ‘User-agent’는 규칙이 적용되는 대상 사용자 에이전트가 누구인지를 말합니다. ‘Disallow’와 ‘Allow’는 각각 크롤링을 금지할 웹 페이지와 허용할 웹 페이지를 뜻합니다. 자세한 규약은 robots.txt 공식 홈페이지(www.robotstxt.org)를 참조해주세요.
기본 코드 프레임
기본 코드 프레임에는 크게 두 가지가 있습니다. 하나는 데이터를 추출하는 코드고 다른 하나는 데이터를 엑셀에 저장하는 코드입니다.
먼저 데이터를 추출하는 코드를 살펴보겠습니다. 아래 코드는 ‘requests’와 ‘bs4’ 라이브러리 모듈을 사용해 html 문서를 가져온 뒤 이를 lxml로 파싱하여 soup 객체로 만드는 과정을 나타낸 코드입니다.
python 1 import requests 2 from bs4 import BeautifulSoup 3 4 url = “www.snugarchive.com” 5 res = requests . get ( url ) 6 res . raise_for_status ( ) 7 soup = BeautifulSoup ( res . text , “lxml” )
각 줄에서 진행하는 작업은 다음과 같습니다.
파이썬 표준 라이브러리인 requests 모듈을 임포트(import)한다 표준 라이브러리 bs4 모듈에서 BeautifulSoup 클래스만 임포트한다. import 문과의 구분을 위한 빈 줄 실제 타겟 URL을 문자열 객체로 만들어 변수 url에 할당한다. 웹 서버에 GET 요청을 보내고 웹 서버가 응답한 내용을 변수 res에 할당한다(requests 모듈의 get() 함수에 url 인자를 넣고 그 결괏값을 res에 할당한다) 에러가 발생하면 에러를 반환한다. 웹 서버로부터 응답 받은 객체 중에서 text 속성(HTML 소스 코드)을 선택하고, 우리가 받은 HTML 소스 코드를 lxml 파서를 통해 BeautifulSoup 객체로 만든다(응답받은 데이터를 soup 변수에 할당한다)
6번에서 만약 403 에러가 뜬다면 앞서 말씀드린 것처럼 웹 서버측에서 우리의 접근을 거부한 것입니다. user agent 헤더를 설정하려면 다음과 같은 방법을 따르면 됩니다.
WhatIsMyBrowser에 들어가서 나의 사용자 에이전트 정보를 확인합니다. 웹 스크래핑 시 headers 정보를 딕셔너리 형태로 만들어 변수에 할당합니다. 웹 서버에 요청시 이 header 정보를 함께 보냅니다.
코드로는 아래와 같습니다.
python headers = { “User-Agent” : “[WhatIsMyBrowser에 나타난 나의 유저 정보]” } res = requests . get ( url , headers = headers )
참고로 soup 객체가 전체적으로 어떻게 생겼는지 파악하고 싶다면 다음 코드를 사용할 수 있습니다.
python print ( type ( soup ) ) print ( soup . head ) print ( soup . body ) print ( soup . title ) print ( soup . title . name ) print ( soup . title . string )
다음은 데이터를 엑셀로 저장하는 기본 코드를 알아보겠습니다.
python 1 import csv 2 3 filename = “고냥이 장난감.csv” 4 f = open ( filename , “w” , encoding = “utf-8-sig” , newline = “” ) 5 writer = csv . writer ( f ) 6 7 columns_title = [ “컬럼명1” , “컬럼명2” ] 8 writer . writerow ( columns_title ) 9 10 data = [ “결과1” , “결과2” ] 11 writer . writerow ( data )
위 코드를 한 줄씩 해석해보면 다음과 같습니다.
파이썬 표준 라이브러리 csv 모듈을 임포트한다 윗 줄과 코드를 분리하기 위한 빈 줄 파일명이 “고냥이 장난감”이고 파일 확장자가 “csv”인 문자열 객체를 만들어 filename 이라는 변수에 할당한다. 파일을 여는 open 함수에 첫 번째 인자로 filename을, 두 번째 인자로 쓰기 모드인 “w”를, 세 번째 인자에 encoding은 “utf-8-sig” 방식으로, 마지막 인자에 csv에서 한 칸 띄어쓰기 옵션인 newline에 띄어쓰기 없음(enter 없음)을 뜻하는 “” 인자를 넣어 그 결괏값을 f에 할당한다. 파일을 쓴다(csv 모듈에서 writer 함수에 우리가 연 파일의 정보가 담긴 f 변수를 인자로 주고 그 결괏값을 writer에 할당한다). 윗 줄과 코드를 분리하기 위한 빈 줄 열의 이름을 리스트 형식으로 만들어 columns_title 변수에 할당한다. csv 파일에서 사용할 컬럼명으로 columns_title을 쓴다. 윗 줄과 코드를 분리하기 위한 빈 줄 우리가 csv 파일에 쓰고 싶은 데이터인 [“결과1”, “결과2”] 를 data 변수에 할당한다. 우리의 데이터를 csv 파일에 쓴다.
위 코드에서는 data를 한 줄만 csv 파일에 사용했는데 보통 반복문 형식을 만들어 row 형식으로 만든 데이터를 차례로 기록합니다. 실제 사용 예제는 아래 실습 코드를 참조하시면 됩니다.
표준 라이브러리(standard library) 파이썬을 설치할 때 포함된 프로그램 임포트(import) 프로그램에서 사용할 수 있도록 설정한다는 의미 utf-8-sig 유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나인 UTF-8에 signature가 붙어서 문자열을 Byte Order Mark(BOM)으로 처리하는 인코딩 방식. utf-8-sig를 사용하면 한글이 깨지는 현상을 방지할 수 있음
지금까지 우리는 웹 스크래핑을 위한 기본 코드 프레임을 알아보았습니다. 그럼 지금부터는 본격적으로 웹 스크래핑을 실습해보겠습니다.
기초 예제
첫 번째 주제는 네이버 웹툰에서 실시간 인기 웹툰 순위를 가져오는 것입니다.
네이버 실시간 인기 웹툰 1위부터 10위까지 가져오기
네이버 웹툰에서 현 시각 가장 인기 있는 웹툰의 순위를 1위부터 10위까지 추출해보겠습니다. 우리가 가져오고 싶은 부분은 아래 ‘인기 급상승 웹툰’의 ‘제목’ 텍스트입니다.
네이버 웹툰에서 우리가 가져오고 싶은 부분 | Snug Archive
그리고 우리가 원하는 결과는 다음과 같습니다.
네이버 웹툰에서 가져온 데이터 결괏값 | Snug Archive
그럼 먼저 개발자 도구를 열어 해당 영역의 소스코드를 살펴보겠습니다. 아래 사진에서 빨간색 선으로 영역이 구분되어 있습니다. 오른쪽 영역을 보시면 개발자 도구가 열려있죠. 1번 영역은 우리가 가져오고 싶은 타겟 대상이고 2번 영역은 개발자 도구에 나타난 1번 영역의 소스 코드입니다.
문서와 데이터를 구조화하는 마크업 언어 | Snug Archive
개발자 도구에 있는 소스 코드에서 인기 급상승 웹툰은 ‘ol’ 요소 중에서 class 명이 ‘assideBoxRank’인 부분에 담긴 것을 확인할 수 있습니다. 그중에서도 우리가 원하는 것은 웹툰의 제목입니다. 웹툰의 제목은 ‘ol’ 영역 안의 ‘a’요소에서 속성이 ‘title’인 부분에 담겨있습니다.
문서와 데이터를 구조화하는 마크업 언어 | Snug Archive
우리는 이 ‘a’요소 10개를 가져와 반복문으로 제목을 하나씩 출력하면 되겠죠. 우리는 웹툰 제목을 터미널 cmd 창에서 출력하고 엑셀 파일로 저장해보겠습니다.
여기서 자주 사용하는 함수는 BeautifulSoup 클래스의 find() 메소드와 find_all() 메소드입니다. find() 함수는 HTML 문서에서 가장 처음으로 나오는 태그(우리가 선택한 태그) 1개를 반환합니다. find_all() 메소드는 HTML 문서에서 우리가 지정한 모든 태그를 찾아줍니다. 이들 함수 외에도 CSS Selector를 사용할 수도 있습니다. CSS Selector에 대한 자세한 설명은 공식 홈페이지의 CSS Selector 사용하기 부분을 참조하시면 됩니다.
그럼 전체 코드를 확인해볼까요?
python import csv import requests from bs4 import BeautifulSoup url = “https://comic.naver.com/webtoon/weekday” filename = “네이버 웹툰 인기 순위.csv” f = open ( filename , “w” , encoding = “utf-8-sig” , newline = “” ) writer = csv . writer ( f ) columns_name = [ “순위” , “웹툰명” ] writer . writerow ( columns_name ) res = requests . get ( url ) res . raise_for_status ( ) soup = BeautifulSoup ( res . text , “lxml” ) cartoonsBox = soup . find ( ‘ol’ , attrs = { “class” : “asideBoxRank” } ) cartoons = cartoonsBox . find_all ( ‘a’ ) i = 1 for cartoon in cartoons : title = cartoon . get ( “title” ) print ( f” { str ( i ) } 위: { title } ” ) data = [ str ( i ) , title ] writer . writerow ( data ) i += 1
위 코드를 실행하면 다음과 같은 csv 파일이 만들어집니다.
네이버 웹툰 인기 순위를 엑셀 파일로 저장 | Snug Archive
지금까지 우리는 원하는 정보를 웹 페이지에서 가져오는 실습을 해보았습니다. 그럼 같은 주제의 내용이 여러 페이지에 담겨있다면 어떻게 할까요? 여러 개의 웹 페이지를 이동하면서 위에서 배운 코드를 페이지의 숫자만큼 실행해야 할까요?
제목을 가져올 때 사용했던 반복문처럼 다시 반복문을 통해 이 문제를 해결할 수 있습니다. 이번에는 여러 페이지에서 정보를 한 번에 가져오는 실습을 해보겠습니다.
영화 사이트에서 드라마 정보 가져오기
우리는 영화 평점 사이트에서 셜록(Sherlock) 드라마 시리즈 정보를 가져오고 싶습니다. 드라마에는 총 4개의 시즌이 있고 각 시즌에는 3개에서 4개의 에피소드가 있습니다. 우리는 아래 화면에서 빨간색으로 표시된 부분에서처럼 시즌 차수, 에피소드명, 평점, 평점 수를 가져오려고 합니다. 그리고 이 작업을 총 4개 웹 페이지에서 해야 하죠.
IMDB 셜록(Sherlock) 시리즈 정보 | Snug Archive
그럼 url이 어떤 구성으로 이루어져 있는지를 파악해야 합니다. 이 웹페이지의 URL 주소를 보시면 아래와 같이 ? 다음에 시즌을 표기하고 있습니다. 아래 season=1 이라고 되어있는 것을 확인할 수 있죠?
IMDB 셜록 시즌 1 URL 주소 | Snug Archive
우리는 이 url 주소가 season에 따라 총 4개 있다는 것을 짐작할 수 있습니다. 나머지 season의 url 주소는 season=1 에서 숫자 부분만 바꾼 것일 것입니다. 그럼 우리는 시즌1에서 만든 웹 스크래핑 코드를 url 주소의 마지막 숫자 부분만 바꾸어서 반복문으로 가져오면 되겠네요. 이를 코드로 표현하면 다음과 같습니다.
python for i in range ( 1 , 5 ) : url = “https://www.imdb.com/title/tt1475582/episodes?season={}” . format ( i )
여기서는 season(주황색 글씨로 표시된 url의 마지막 부분) 옆에 있는 대입 연산자 = 다음에, 시즌 차수가 들어갈 자리를 대괄호 {} 처리하고 반복문과 format함수를 통해 숫자만 바뀌도록 만들었습니다.
그럼 먼저 결과부터 확인해보겠습니다. 코드를 통해 만들어진 엑셀 파일을 열었을 때 아래와 같은 결과를 확인하면 성공하신 겁니다.
IMDB 셜록 시즌 1 URL 주소 | Snug Archive
답을 확인하시기 전에 먼저 스스로 해보신다면 더 빠르게 스크래핑 코드를 익히실 수 있을 것입니다. 전체 코드는 다음과 같습니다.
python import csv import requests from bs4 import BeautifulSoup filename = “셜록 시즌 정보.csv” f = open ( filename , “w” , encoding = “utf-8-sig” , newline = “” ) writer = csv . writer ( f ) attributes = [ “시즌” , “제목” , “리뷰수” , “평점” ] writer . writerow ( attributes ) for season in range ( 1 , 5 ) : url = “https://www.imdb.com/title/tt1475582/episodes?season={}” . format ( season ) res = requests . get ( url ) res . raise_for_status ( ) soup = BeautifulSoup ( res . text , “lxml” ) season = soup . find ( “h3” , { “id” : “episode_top” } ) . get_text ( ) [ – 1 ] episodes = soup . find_all ( “div” , attrs = { “itemprop” : “episodes” } ) for episode in episodes : title = episode . find ( “a” , attrs = { “itemprop” : “name” } ) . get_text ( ) review = episode . find ( “span” , attrs = { “class” : “ipl-rating-star__total-votes” } ) . get_text ( ) [ 1 : – 1 ] rate = episode . find ( “span” , attrs = { “class” : “ipl-rating-star__rating” } ) . get_text ( ) data_rows = [ season , title , review , rate ] writer . writerow ( data_rows )
여기에 데이터 시각화 라이브러리인 Seaborn(씨본)을 이용해 시즌별 회차의 평점 분포와 평균을 시각화해보겠습니다. 각 시즌의 회차는 pandas의 cumcount 함수를 이용해 추가했습니다. Seaborn 사용법은 파이썬 데이터 시각화 Seaborn 사용법 기초편를 참조해주세요. 만든 그래프는 다음과 같습니다.
Seaborn으로 시각화한 셜록(Sherlock) 시즌별 평점 그래프 | Snug Archive
셜록 시리즈의 전체 시즌 중 시즌2의 평균 평점이 가장 높은 것을 알 수 있습니다. 전체 에피소드 중에서는 시즌2의 3화(The Reichenbach Fall)가 가장 재미있는 회차로 평가되었네요.
지금까지 우리는 웹 크롤링과 웹 스크래핑의 정의 및 각 용어의 차이, 웹 스크래핑을 하기 위한 기본 환경 설정, 그리고 파이썬 코드를 통해 웹 스크래핑을 직접 실습해보았습니다. 아이디어만 있다면 웹 스크래핑을 할 수 있는 대상은 정말 다양할 것입니다.
웹 스크래핑에 대해 더 공부하고 싶은 분들은 나도코딩님의 웹 스크래핑 강의를 추천드립니다. 강의를 들으시면서 다양한 예제를 접하신다면 더 다양한 분야에서 웹 스크래핑을 잘 할 수 있게 될 것입니다. 다음에는 또 다른 주제를 가지고 웹 스크래핑을 실습해보겠습니다. 파이썬으로 웹 스크래핑을 할 수 있게 되신 것을 축하합니다. 긴 글 읽으시느라 수고 많으셨습니다.
참고 문헌
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 호스팅을 이용해 이번 포스팅과 같이 웹 파싱을 개발해 보시기 바랍니다.
python으로 크롤링 하기 기초 1- selenium
크롤링은 시간과 비용을 절약해 준다는 점에서 데이터 수집 비용에 대한 좋은 해결책이 될 수 있습니다. 또한 어떠한 페이지든 상관없이 크롤링이 가능하다는 점에서 다양한 정보를 가져올 수 있습니다.
안녕하세요 알마덴에서 데이터분석과 솔루션개발을 담당하고 있는 김재영이라고 합니다. 빅데이터팀을 대표로 이렇게 만나게 되어서 정말 반갑습니다.
첫 글은 크롤링 대해서 소개해보려고 합니다. 크롤링 기술을 처음으로 소개드리는 이유는 우선 데이터를 수집하는 기술이 데이터 분석의 기초이자 가장 핵심적인 부분이기 때문입니다.
데이터 분석은 크게 수집, 전처리, 분석, 시각화 4가지로 나뉜다고 볼 수 있는데 이 과정에서 데이터 수집을 위한 방법중 하나로 crawling을 떠올릴 수 있습니다. 크롤링의 장점은 내부 데이터가 없는 개인이 쉽고 빠르게 데이터를 수집할 수 있다는 점입니다.
기업은 내부 데이터를 바탕으로 자신의 상품이나 서비스를 개선하고 분석하지만 개인이 그러한 데이터를 가지기엔 비용과 시간이 충분하지 않습니다. 이 문제에 크롤링은 시간과 비용을 절약해 준다는 점에서 데이터 수집 비용에 대한 좋은 해결책이 될 수 있습니다. 또한 어떠한 페이지든 상관없이 크롤링이 가능하다는 점에서 다양한 정보를 가져올 수 있습니다.
쉽게 예로들어 설명해보겠습니다. 저희 회사는 상품,서비스에 대한 유저 평가를 보기 위해 와디즈 홈페이지 크롤링을 실시하였습니다. 아래 그림은 필자가 하루 동안 크롤링을 통해 가져온 데이터를 바탕으로 시각화한 결과입니다.
‘와디즈’ 라는 크라우드 펀딩사이트를 이용했는데요, 크롤링을 통해 해당 게시물 3,000개 이상을 가져와 펀딩 성공 아이템에 대한 정보를 수집하였습니다. 코드 짜는데 2시간, 크롤링 1시간(총3시간 소요) 걸렸습니다. 3시간이면 나만의 데이터가 쌓이는 겁니다. 참쉽죠^^?
1. selenium(셀레니움) 이란?
지금부터 파이썬(python)을 활용하여 크롤링 하는 법을 공부하도록 하겠습니다. 우선 셀레니움에 대해서 공부하도록 할게요. 셀레니움은 웹 테스트 자동화 프레임워크로써, selenium webdriver를 이용하여 다양한 브라우저를 컨트롤 할 수 있습니다. 셀레니움은 구글크롬, 파이어폭스 등의 웹드라이버를 통해 작동해요.
BeautifulSoup 같은 다른 웹 수집기도 있지만 이러한 수집기들은 비동기적인 컨텐츠(뒤 늦게 불려오는 컨텐츠)들은 수집하기 매우 어려워요. 그래서 필자는 셀레니움을 활용하여 비동기 컨텐츠 수집을 시행하려고 해요!
그런데 셀레니움은 속도가 느리다는 점이 있어 실제 코드 구현 시 selenium 사용부분을 최소화 하는 것이 매우 중요해요!
2. selenium 설치
셀레니움은 pip를 이용하여 매우 쉽고 간단하게 설치할 수 있어요. 파이썬 터미널창을 켠뒤 아래에 나와있는 코드를 실행시켜 주세요. 페이지 url을 request를 통해 가져온 뒤 html 본문 내용을 가져오기 위해 Beautifulsoup4를 사용하기 때문에 설치되지 않으신 분은 아래와 같이 설치해주세요.
pip install selenium
pip install bs4
3. 크롬 브라우저 설치 및 크롬 웹드라이버 다운로드
우선 셀레니움은 webdriver를 이용하여 작동하는데 기본적으로 많이 사용하는 크롬 웹드라이버를 사용하여 작동할 예정이에요.
운영체제 환경마다 세팅하는 방법이 조금씩 다르기 때문에 각각의 운영체제에 대하여 커스터마이징 해야 할 필요가 있어요. 하지만 크롬 웹드라이버를 이용하므로 반드시 크롬 브라우저는 설치되어 있어야 해요! *윈도우, 맥(GUI 가능), Ubuntu, CentOS (GUI 불가능)
앞으로 크롬 웹드라이버를 이용하기 때문에 아래 링크에 들어가서 꼭 크롬 브라우저를 설치해 주세요. 크롬 드라이버 다운로드 링크를 적어두는 센스 !+_+! (GUI 환경)
크롬 드라이버 다운로드
위의 홈페이지 url로 접속해보면 크롬 웹 드라이버를 받을 수 있는 화면이 나와요. Latest Release의 크롬 드라이버링크를 클릭하여 설치해 주세요.
4. selenium 코드 사용해보기
Ubuntu, CentOs 서버 환경에서는 GUI를 지원하지 않기 때문에 모두 headless 으로 셀레니움 코드를 실행할 필요가 있어요. 셀레니움을 통한 코드 실습 방법은 아래를 참고해 주세요.
from selenium import webdriver
options = webdriver.ChromeOptions()
# headless 옵션 설정
options.add_argument(‘headless’)
options.add_argument(“no-sandbox”)
# 브라우저 윈도우 사이즈
options.add_argument(‘window-size=1920×1080’)
# 사람처럼 보이게 하는 옵션들
options.add_argument(“disable-gpu”) # 가속 사용 x
options.add_argument(“lang=ko_KR”) # 가짜 플러그인 탑재
options.add_argument(‘user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36’) # user-agent 이름 설정
# 드라이버 위치 경로 입력
driver = webdriver.Chrome(‘./chromedriver.exe’, chrome_options=options)
driver.get(‘https://naver.com’)
driver.implicitly_wait(3)
driver.get_screenshot_as_file(‘capture_naver.png’) # 화면캡처
driver.quit() # driver 종료
지금까지 우리는 셀레니움을 통한 동적 자료를 가져오기 위한 설치 및 환경 테스트를 시행하였어요. 설치 및 환경 테스트여서 큰 어려움을 없었을 거라 봐요. 혹시 어려운점이 있거나 에러가 발생했다면 댓글로 언제든지 물어봐 주세요!
다음 시간에는 셀레니움을 통해 동적인 URL 정보를 긁어오고 bs4(BeutifulSoup4)를 사용하여 해당 페이지 정보를 가져오는 방법에 대해 배워보도록 하겠습니다.
[파이썬] 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
파이썬 크롤링으로 파일들 다운받기
파일을 1600개 정도를 다운받아야 되는데 이거 하나하나 다운받고 파일명 고치다간 폭삭 늙을거 같아서 당장 크롤링 시작
전체코드
from inspect import getfile import os import re from urllib import request from urllib . error import HTTPError from bs4 import BeautifulSoup import requests overlap = [ ] url = “https://ors.gir.go.kr/home/orah010/usedOpenList.do?menuId=10&condition.bizNm=&condition.qtaOjEnpNm=&condition.usedOpenYn=&pagerOffset=” site = “https://ors.gir.go.kr” rec = “/home/orah010/usedOpenRead.do;” dl = “/home/file/readOrDownload.do?” def get_download ( url , fname , directory ) : try : os . chdir ( directory ) request . urlretrieve ( url , fname ) print ( ‘다운로드 완료
‘ ) except HTTPError as e : print ( ‘error’ ) return def downSearch ( getDLATag , filename ) : for getDLLink in getDLATag : try : if dl in getDLLink . get ( ‘href’ ) : accessDLUrl = site + getDLLink . get ( ‘href’ ) print ( “다운로드 링크: ” , accessDLUrl ) path = “C:\\ORS\\국내인증실적” if os . path . isfile ( path + filename ) : print ( “다운로드 실패 : 동일 파일 존재
” ) else : get_download ( accessDLUrl , filename , path ) except : pass def Search ( getA , num ) : for getLink in getA : data = getLink . get ( ‘href’ ) try : if rec in getLink . get ( “href” ) : if data not in overlap : overlap . append ( data ) accessUrl = site + getLink . get ( “href” ) r = requests . get ( accessUrl ) soup = BeautifulSoup ( r . text , “html.parser” ) getDLATag = soup . find_all ( “a” ) getfilenameTag = soup . find_all ( “td” ) td = getfilenameTag [ len ( getfilenameTag ) – 1 ] filename = str ( num ) + “. ” + str ( td ) [ 4 : int ( str ( td ) . find ( “.pdf” ) ) + 4 ] . strip ( ) num = num – 1 downSearch ( getDLATag , filename ) except : pass def main ( ) : pageoffset = 0 num = 627 while pageoffset <= 620 : r = requests . get ( url + str ( pageoffset ) ) soup = BeautifulSoup ( r . text , "html.parser" ) getA = soup . find_all ( "a" ) Search ( getA , num ) pageoffset += 10 num -= 10 main ( ) 결과물 코드 뜯어보기 1. 세팅하기 from inspect import getfile import os import re from urllib import request from urllib . error import HTTPError from bs4 import BeautifulSoup import requests beautifulsoup4 와 requests 를 설치한다. pip install beautifulsoup4 pip install requests beautifulsoup4를 쓰려면 Python 3.9 이하를 써야 한다. 2. url 설정하기 url = "https://ors.gir.go.kr/home/orah010/usedOpenList.do?menuId=10&condition.bizNm=&condition.qtaOjEnpNm=&condition.usedOpenYn=&pagerOffset=" site = "https://ors.gir.go.kr" rec = "/home/orah010/usedOpenRead.do;" dl = "/home/file/readOrDownload.do?" (1) url : 다운받을 파일을 포함한 디테일 페이지가 반복되는 곳의 주소 (쉽게 말해 목차 페이지) https://ors.gir.go.kr/home/orah010/usedOpenList.do?menuId=10&condition.bizNm=&condition.qtaOjEnpNm=&condition.usedOpenYn=&pagerOffset= 목차 페이지의 pagerOffset=? 의 ? 부분만 빼고 페이지네이션이 적용된 모든 페이지의 주소가 똑같아서 pagerOffset= 까지만 넣는다. 맨뒤 offset은 나중에 반복문에서 10씩 더해서 붙여줄 것 (2) site : 다운로드할 파일의 링크 주소의 맨 앞대가리 (웬만하면 홈주소) https://ors.gir.go.kr (3) rec : 파일을 포함한 디테일 페이지에 접속할 주소 /home/orah010/usedOpenRead.do; (4) dl : 실제로 클릭해서 파일을 다운 받는 주소 /home/file/readOrDownload.do? 3. main def main ( ) : pageoffset = 0 num = 627 while pageoffset <= 620 : r = requests . get ( url + str ( pageoffset ) ) soup = BeautifulSoup ( r . text , "html.parser" ) getA = soup . find_all ( "a" ) Search ( getA , num ) pageoffset += 10 num -= 10 페이지네이션으로 나눠진 모든 페이지에 접근하려면 pageoffset을 0부터 10씩 키워서 url 뒤에 붙인다. 가장 끝 페이지 주소 뒤에 붙은 offset이 얼만지 확인하고 반복문 도는 횟수를 정해준다. 첫번째 페이지 : https://ors.gir.go.kr/home/orah010/ ... &pagerOffset=0 두번째 페이지 : https://ors.gir.go.kr/home/orah010/ ... &pagerOffset=10 ... 마지막 페이지 : https://ors.gir.go.kr/home/orah010/ ... &pagerOffset=620 requests 를 이용해서 요청을 보내고 받아온 response를 beautifulsoup 을 이용해서 html로 예쁘게 바꿔준다. 파일을 포함한 디테일 페이지로 들어가는 링크를 찾기 위해 우선 해당 reponse에 포함된 모든 a태그를 받아오고, num(파일 번호)와 함께 Search() 로 넘긴다. 파일번호 num은 원래 전역변수로 선언했는데 파이썬에서는 전역변수 수정이 번거롭길래 그냥 main의 지역변수로 바꿨다. 어쨌든 큰 루프는 이렇게 생겼다. pageoffset과 num도 적절히 조절한다. 4. Search def Search ( getA , num ) : for getLink in getA : data = getLink . get ( 'href' ) try : if rec in getLink . get ( "href" ) : if data not in overlap : overlap . append ( data ) accessUrl = site + getLink . get ( "href" ) r = requests . get ( accessUrl ) soup = BeautifulSoup ( r . text , "html.parser" ) getDLATag = soup . find_all ( "a" ) getfilenameTag = soup . find_all ( "td" ) td = getfilenameTag [ len ( getfilenameTag ) - 1 ] filename = str ( num ) + ". " + str ( td ) [ 4 : int ( str ( td ) . find ( ".pdf" ) ) + 4 ] . strip ( ) num = num - 1 downSearch ( getDLATag , filename ) except : pass 파라미터로 넘어온 getA는 아까 그 페이지에 있던 모든 a태그를 가지고 있는 애다. 내가 필요한 조회 버튼 외에도 개인정보처리방침이라든지 뒤로가기라든지 a태그로 이루어진 모든 정보들을 가지고 있다. 여기서 우리는 조회 버튼에 해당하는 a태그만 걸러내야 한다. 이 나쁜 놈들이 별도의 class나 id값을 지정해놓지 않아서 아까 지정한 rec 와 site 가 여기서 필요하다. href 속성값에 rec(파일을 포함한 디테일 페이지에 접속할 주소 == 조회버튼)을 포함하고 있는 애들을 site 주소 뒤에 붙여서 디테일 페이지로 접속할 진짜 주소를 만든다. ( accessUrl ) 아까 목차페이지에 요청을 보내고 응답을 받아온 것과 마찬가지로 requests 를 이용해 요청을 보내고, 받아온 response 를 beautifulsoup 으로 예쁘게 만든다. 이제 여기 response에는 디테일 페이지가 담겨있으므로 클릭해서 파일을 다운받을 수 있는 주소와 파일이름이 있다. 파일이름이 파일다운주소를 담은 a태그에 포함되면 참 좋겠고만 그 a태그를 감싸는 td태그 안에 쓰여 있어서 얘네들을 받아오기 위해 soup.find_all() 메소드를 이용해서 a태그와 td태그를 모두 받아온다. 추출된 td태그들의 규칙성을 보자하니 전체 td태그들 중에 가장 마지막에 있는 td태그 안에 파일명이 들어있어서 td = getfilenameTag[len(getfilenameTag)-1] 으로 파일명이 담긴 태그를 골라냈다. 그럼 이제 이 태그를 파싱해서 파일 이름만 딱 뽑아내야되는데 띄어쓰기도 공백도 다 제각각이라 어떻게 할까 하다가 str(td)[4:int(str(td).find(".pdf"))+4].strip() 라고 거의 야매로 때려넣었다. td가 문자열 객체가 아니라서 str(td) 로 감싸준 후에 뒤에 나오는 문자열 메소드들을 사용할 수 있었다. 그냥 뭐 대충 나열하자면 공통적으로 맨 앞에 붙은
4번째 문자 이후부터 대부분의 파일 확장자명인 .pdf 까지 잘라낸 다음에 앞뒤 공백을 모두 제거한거다. 덕분에 .zip 이나 .hwp 같은 파일 확장자는 제대로 다운을 못받았지만 몇개 없어서 걔네는 그냥 따로 다운받았다. 그럼 파일을 하나 다운받을 준비가 완료된거니까 num을 하나 빼주고, 이제 클릭해서 파일을 다운받는 바로 그 핵심링크를 찾아내기 위해 downSearch() 를 호출한다. 파일 하나마다 호출하는거니까 방금 잘라낸 파일명도 그대로 같이 넘겨주면 된다. 5. downSearch
def downSearch ( getDLATag , filename ) : for getDLLink in getDLATag : try : if dl in getDLLink . get ( ‘href’ ) : accessDLUrl = site + getDLLink . get ( ‘href’ ) print ( “다운로드 링크: ” , accessDLUrl ) path = “C:\\ORS\\국내인증실적” if os . path . isfile ( path + filename ) : print ( “다운로드 실패 : 동일 파일 존재
” ) else : get_download ( accessDLUrl , filename , path ) except : pass
파라미터 getDLATag에는 위에서 받아온 디테일 페이지에 포함된 모든 a태그들을 가지고 있다. 이 a태그들 중에서 href 속성값에 위에서 지정한 dl(실제로 클릭해서 파일을 다운 받는 주소 == 다운로드)을 포함한 a태그가 우리가 찾던 그 링크다. 따라서 얘도 site 뒤에 붙여서 다운로드 링크를 만든 다음에, os.path 로 파일을 다운받을 로컬 폴더 경로를 지정해주고, get_download() 롤 호출해서 파일 다운 준비를 완료한다.
6. get_download
def get_download ( url , fname , directory ) : try : os . chdir ( directory ) request . urlretrieve ( url , fname ) print ( ‘다운로드 완료
‘ ) except HTTPError as e : print ( ‘error’ ) return
파라미터로 받아온 다운 링크, 파일명, 저장경로를 이용해서 request.urlretrieve 로 파일을 다운받는다.
이제 url 주소랑 저장경로, 반복 횟수, 파일번호 등만 바꿔서 재활용할 수 있다~~
Reference
https://calmlife.tistory.com/5
키워드에 대한 정보 파이썬 크롤링
다음은 Bing에서 파이썬 크롤링 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 파이썬 코딩 무료 강의 (활용편3) – 웹 크롤링? 웹 스크래핑! 제가 가진 모든 비법을 알려드리겠습니다. [나도코딩]
- 웹 크롤링
- 웹 스크래핑
- 웹크롤링
- 웹스크래핑
- 크롤러
- 코딩
- 파이썬
- python
- 코딩교육
- 프로그래밍
- 자바
- Python
- Java
- 게임
- 나도코딩
- 개발
- 초보
- Pandas
- Numpy
- 머신러닝
- 딥러닝
- 데이터
- 데이터과학
- 데이터분석
- 시각화
- 아두이노
- arduino
- 사물인터넷
- iot
- 기본편
- 얼굴인식
- opencv
- 업무자동화
- rpa
- tkinter
- beautifulsoup
- bs4
- beautifulsoup4
- requests
- request
- http method
- 스크래피
- scrapy
- selenium
- 뷰티풀
- 셀레늄
- 이미지크롤링
- 가져오기
- web
- xpath
- 정규식
- headless
- 크롬
- chrome
- 인공지능
- pyautogui
- matplot
- knn
- 빅데이터
- 파이썬강의
- 파이썬강좌
- python 강의
- python 강좌
- 파이썬 강의
- 파이썬 강좌
- 파이썬 교육
- python 교육
- 코딩공부
- 파이썬공부
- 코딩 공부
- 파이썬 공부
- 코딩독학
- 코딩 독학
- 파이썬 독학
- 파이썬독학
- 6시간
- 무료
- 공짜
- 자동화
파이썬 #코딩 #무료 #강의 #(활용편3) #- #웹 #크롤링? #웹 #스크래핑! #제가 #가진 #모든 #비법을 #알려드리겠습니다. #[나도코딩]
YouTube에서 파이썬 크롤링 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 파이썬 코딩 무료 강의 (활용편3) – 웹 크롤링? 웹 스크래핑! 제가 가진 모든 비법을 알려드리겠습니다. [나도코딩] | 파이썬 크롤링, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.