안녕하세요 늑대양입니다 :)
오늘은 [AI 데이터 사이언티스트 취업 완성 과정]의 11일차 일과를 정리하여 안내해드리도록 하겠습니다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif)
Day 11. 시간표:
- 오프라인 강의: [웹크롤링 실전 : Python]
- 선택학습
Day 11. 웹크롤링 실전 : Python
0. 소개:
변치* 강사님
- 고려대학교 경제학과 학사
- (전) 삼성생명, 스타트업 유쾌한형제, KTH 근무
- 패스트캠퍼스 데이터 사이언스 스쿨 5기 수료
- (현) fitror.com 대표
Doing:
- 딥러닝 알고리즘을 활용한 주식 자동화 트레이딩 시스템 개발
- fitror. bitror 프로젝트 진행 중
- 패스트캠퍼스 기업 강의
Done:
- KB 국민은행, SK 아카데미, 신한카드, 미래에셋생명, 현대모비스, 삼성중공업, 미래에셋증권
- KB 금융그룹 데이터분석 아카데미, 롯데마트, SK신입사원, 서울산업진흥원 강의
- SK 네트웍스, KB카드, 신한금융그룹, 미래에셋금융그룹, 현대자동차 보조강사
- 상기 기업체 프로젝트 약 300여건 컨설팅
나는 어디인가?
1. 데이터 크롤링:
크롤링이란?
- 크롤러(crawler)는 자동화된 방법으로 웹을 탐색하는 컴퓨터 프로그램
- '웹 크롤링'(web crawling)??
- '데이터 크롤링'(data crawling)!!
우리는 매일 크롤러를 사용하고 있습니다.
웹 크롤링
- 웹 서비스 내 정보를 수집하는 일
다만 서비스 제공자의 입장에서는?? - 필요한 정보가 있다면?
API 확인 > 없으면 직접 크롤링
웹 서핑을 하는 의식의 흐름:
- 브라우저 오픈
- 원하는 인터넷페이지 주소 입력
- 화면이 열리면 찾고자하는 정보를 스크롤 하면서 찾기
- 문자, 그림, 동영상 조회
웹 크롤링 하는 의식의 흐름:
- 정보를 가져오고자 하는 url 정의
- url 정보로 requests로 정보 요청
- text 정보를 html로 변환
- html에서 우리가 필요한 정보만 선별
사용하는 패키지:
requests:
- HTTP 요청을 주고받기 위한 파이썬 패키지
- 파이썬 내장 패키지는 아니지만 사실상 HTTP 요청을 주고받기 위한 표준이라 생각해도 무방함
- 웹 페이지에 요청, 업데이트, 삭제 등 인터넷프로토콜을 파이썬으로 제어한다
- requests는 요청을 하고 데이터를 전달 받지만 text 혹은 바이너리 형태로만 전달받음
BeautifulSoup:
- API는 통신을 위해 정형화 된 데이터 형태의 text, json등을 통신에 사용한다
- requests로 전달받은 데이터를 우리가 원하는 데이터로 가공하기 위해 편의상 html로 변환
- text를 html로 변환하는 모듈이 beautifulSoup
간단한 데이터 크롤링으로 기본 개념잡기:
# 패키지 설치 및 import
!pip install BeautifulSoup4
from bs4 import BeautifulSoup
# 필요패키지 import
import time
import json
import urllib
import requests
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
네이버 메인페이지 크롤링:
'''
정보를 가져오고자 하는 url 정의
url 정보로 requests로 정보 요청
text 정보를 html로 변환
html에서 우리가 필요한 정보만 선별
'''
# url정의
url = "https://www.naver.com/"
# requsts로 url에 정보요청
resp = requests.get(url) # url로 로컬컴퓨터에서 데이터를 요청하는 작업, 작업결과를 resp 변수에 저장
resp
><Response [200]>
# 웹페이지에 개발자들이 작성한 코드까지 다 확인 가능
# resp.text 를 통해, 상세정보 확인 가능
# 저장된 데이터의 데이터 타입은 str
# 정보를 html 변환 (보기 쉽게)
# html 내에서 우리가 보고 싶은 정보만 선별
html.select("img")
# 전달받은 문자열을 html로 변환
html = BeautifulSoup(resp.text, "html.parser")
html
실제 개발자가 작성한 코드로 확인:
- 정제되지 않은 데이터로 가독성이 좋지 않음
- 우리는 이 중에서 우리가 원하는 정보를 선별해서 가져오는 작업을 진행합니다.
- 그러기에 html의 기본 구성을 살펴보도록 하겠습니다!
웹 페이지의 구성:
HTML(Hyper Text Markup Language)
www 를 구성하는데 사용하는 국제표준 언어로서 컨텐츠와 레이아웃을 담고 있다
<태그> 내용 </태그>
<tag이름 class="class이름1 class이름2" id="주민번호" href="주소"></tag이름>
형태나 속성을 묘사하기 위한 구조적 언어 : HTML, CSS (계층이 있음)
웹의 작동 및 제어를 위한 프로그래밍 언어 : JS
셀렉터:
용도: html에서 내가 원하는 내용을 찾아내기 위해서 사용!!
- 클래스 이름은 별명처럼 쓰이는 이름
- id값은 말 그대로 고유값
현대모비스 뉴스1: <span class="news" id="1234">현대모비스 뉴스1</span>
현대모비스 뉴스2: <span class="product" id="1235">현대모비스 뉴스2</span>
단일 셀렉터: html.select('span')
<span class="news" id="1234">현대모비스 뉴스1</span>
<span class="product" id="1235">현대모비스 뉴스2</span>
클래스 포함 셀렉터: html.select('span.news')
<span class="news" id="1234">현대모비스 뉴스1</span>
id 포함 셀렉터: html.select('span#1235')
<span class="product" id="1235">현대모비스 뉴스2</span>
복합 셀렉터: html.select('em.txt')
경로 셀렉터: html.select('ul li span')
개발자 도구를 이용한 html 정보 확인: (크롬 기준)
- F12 (개발자 도구 접근)
- Elements(요소) 탭
- 소스코드 확인 가능
- 토글 아이콘을 클릭하여 세부 html 확인 가능
- 상단에 [사각형+화살표] 아이콘 클릭 후, 마우스 커서 이동을 통해 웹 페이지 내에서 세부 html 확인 가능
# 다음 뉴스 페이지 크롤링
# url정의
url = 'https://news.daum.net/'
# requsts로 url에 정보요청
resp = requests.get(url) # 로컬컴퓨터에서 다음에 요청하는 작업
# 여러번 요청하는 경우, 다음에서 차단...
resp
><Response [200]>
# 정보를 html 변환 (보기 쉽게)
html = BeautifulSoup(resp.text, "html.parser")
# html
# html 내에서 뉴스헤더 선별
# 리스트로 가져오기 때문에 인덱싱 가능!
html.select('a.link_txt') # a 태그안에 클래스명이 link_txt인 라인을 다 가져와라!
>[<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905144234446" data-tiara-id="20220905144234446" data-tiara-layer="article_main" data-tiara-ordnum="1" data-tiara-type="harmony" href="https://v.daum.net/v/20220905144234446">
中 국가보안기관 "NSA 해커조직, 6월 中유명대 공격"
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905144140377" data-tiara-id="20220905144140377" data-tiara-layer="article_main" data-tiara-ordnum="2" data-tiara-type="harmony" href="https://v.daum.net/v/20220905144140377">
"기브 앤 테이크 명확히 부탁"..조원태에 보낸 상소문에 대한항공 들썩
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905144126369" data-tiara-id="20220905144126369" data-tiara-layer="article_main" data-tiara-ordnum="3" data-tiara-type="harmony" href="https://v.daum.net/v/20220905144126369">
해외여행자 면세 한도 800달러·술 2병까지..내일부터 시행
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905144049331" data-tiara-id="20220905144049331" data-tiara-layer="article_main" data-tiara-ordnum="4" data-tiara-type="harmony" href="https://v.daum.net/v/20220905144049331">
힌남노 접근에 日 초긴장..규슈 신칸센 6일 첫차부터 운행 취소
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905144038323" data-tiara-id="20220905144038323" data-tiara-layer="article_main" data-tiara-ordnum="5" data-tiara-type="harmony" href="https://v.daum.net/v/20220905144038323">
요기요, 지역차별·막말 '직장 내 괴롭힘' 논란 임원 A씨 징계 조치
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143914259" data-tiara-id="20220905143914259" data-tiara-layer="article_main" data-tiara-ordnum="6" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143914259">
이천시, 쌀 팔아주기 2달간 작년 쌀 1만2천t 모두 판매
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143832225" data-tiara-id="20220905143832225" data-tiara-layer="article_main" data-tiara-ordnum="7" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143832225">
힌남노가 휩쓴 日오키나와 순간풍속 40.1m..가로수 뽑히고 지붕 뚫리고
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143741194" data-tiara-id="20220905143741194" data-tiara-layer="article_main" data-tiara-ordnum="8" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143741194">
가락시장 '추석 물류 대란' 피했다..하역노조·도매법인 조정기간 연장 합의
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143617152" data-tiara-id="20220905143617152" data-tiara-layer="article_main" data-tiara-ordnum="9" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143617152">
힌남노 '역대 최강' 유지하며 상륙..만조 겹쳐 12m 높이 파도도
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143606142" data-tiara-id="20220905143606142" data-tiara-layer="article_main" data-tiara-ordnum="10" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143606142">
낙동강 범람 위험에 부산 생태공원 진입로 폐쇄[태풍 힌남노]
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143418051" data-tiara-id="20220905143418051" data-tiara-layer="article_main" data-tiara-ordnum="11" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143418051">
제주 내일 새벽 영향권..이 시각 재난방송센터
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905142441571" data-tiara-id="20220905142441571" data-tiara-layer="article_main" data-tiara-ordnum="12" data-tiara-type="harmony" href="https://v.daum.net/v/20220905142441571">
올해 수능 지원자 10명 중 3명은 'N수생'..26년 만에 최대
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143243948" data-tiara-id="20220905143243948" data-tiara-layer="article_main" data-tiara-ordnum="13" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143243948">
"부적절 인사 이정선 광주교육감 사과하고 당사자는 사퇴하라"
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143135887" data-tiara-id="20220905143135887" data-tiara-layer="article_main" data-tiara-ordnum="14" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143135887">
대구 수능 응시자 2만4363명..지난해보다 800명 줄어
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143125881" data-tiara-id="20220905143125881" data-tiara-layer="article_main" data-tiara-ordnum="15" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143125881">
태풍 힌남노에 경북도·의회·시군·교육청·소방·경찰·농어촌공사 '총력 대응'
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905133215413" data-tiara-id="20220905133215413" data-tiara-layer="article_main" data-tiara-ordnum="16" data-tiara-type="harmony" href="https://v.daum.net/v/20220905133215413">
태풍 '힌남노' 대비 전국 33개 임시선별검사소 단축 운영·일시 중단
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905142937801" data-tiara-id="20220905142937801" data-tiara-layer="article_main" data-tiara-ordnum="17" data-tiara-type="harmony" href="https://v.daum.net/v/20220905142937801">
호도르코프스키 "서방, 우크라에 더 많은 무기 공급 안하면 푸틴 승리"
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905142934798" data-tiara-id="20220905142934798" data-tiara-layer="article_main" data-tiara-ordnum="18" data-tiara-type="harmony" href="https://v.daum.net/v/20220905142934798">
휴가장병 400여명 복귀 조정..일부 훈련 연기[태풍 힌남노]
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905142811763" data-tiara-id="20220905142811763" data-tiara-layer="article_main" data-tiara-ordnum="19" data-tiara-type="harmony" href="https://v.daum.net/v/20220905142811763">
"절대 나가지마"..힌남노 겪은 日누리꾼의 경고
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905142821767" data-tiara-id="20220905142821767" data-tiara-layer="article_main" data-tiara-ordnum="20" data-tiara-type="harmony" href="https://v.daum.net/v/20220905142821767">
경찰 "'윤대통령 처가 연루된 양평 공흥지구 특혜 의혹' 정치적 상황 고려않고 수사"
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143846234" data-tiara-id="20220905143846234" data-tiara-layer="article" data-tiara-ordnum="1" data-tiara-type="harmony" href="https://v.daum.net/v/20220905143846234">
나에게 필요한 세럼 하나는?_선배's 어드바이스 #133
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905113015253" data-tiara-id="20220905113015253" data-tiara-layer="article" data-tiara-ordnum="2" data-tiara-type="harmony" href="https://v.daum.net/v/20220905113015253">
[줌인] 美中 갈등, 제로코로나에 '脫중국' 속도내는 애플·구글
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905142700681" data-tiara-id="20220905142700681" data-tiara-layer="article" data-tiara-ordnum="3" data-tiara-type="harmony" href="https://v.daum.net/v/20220905142700681">
[잠시만요] 성균관 유도회"공자는 홍동백서·조율이시 말한 적 없어"
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905142512597" data-tiara-id="20220905142512597" data-tiara-layer="article" data-tiara-ordnum="4" data-tiara-type="harmony" href="https://v.daum.net/v/20220905142512597">
[올댓차이나] 위안화, 신흥국 '안전자산'서 '위협' 전환.."원화에 절하 압력"
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905141745322" data-tiara-id="20220905141745322" data-tiara-layer="article" data-tiara-ordnum="5" data-tiara-type="harmony" href="https://v.daum.net/v/20220905141745322">
與, 당헌 개정안 최종 의결..추석 전 '새 비대위 출범' 박차
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905141016020" data-tiara-id="20220905141016020" data-tiara-layer="article" data-tiara-ordnum="6" data-tiara-type="harmony" href="https://v.daum.net/v/20220905141016020">
한국 언론이 외면한 '美 인플레 감축법'의 핵심은 '대기업 증세'다
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220904172347534" data-tiara-id="20220904172347534" data-tiara-layer="article" data-tiara-ordnum="7" data-tiara-type="harmony" href="https://v.daum.net/v/20220904172347534">
[슬기로운 서평생활] "섞이지 않지만 밀어내지 않는 사람들" 네팔의 사적인 이야기
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905135705432" data-tiara-id="20220905135705432" data-tiara-layer="article" data-tiara-ordnum="8" data-tiara-type="harmony" href="https://v.daum.net/v/20220905135705432">
尹정부 첫 검찰총장 인사청문회 흔드는 '정운호게이트', "40여 회 전화통화 해명이 관건"
</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905144126366" data-tiara-id="20220905144126366" data-tiara-ordnum="1" data-tiara-type="harmony" href="https://gallery.v.daum.net/p/viewer/1783949/ZOjg0kqkL2">'강풍에 구겨진 우산'</a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905143924263" data-tiara-id="20220905143924263" data-tiara-ordnum="2" data-tiara-type="harmony" href="https://gallery.v.daum.net/p/viewer/5024184/54iUO8v80y">與혁신위, '이준석표' PPAT 총선 확대 적용 추진 방안 논의 </a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905142449573" data-tiara-id="20220905142449573" data-tiara-ordnum="3" data-tiara-type="harmony" href="https://gallery.v.daum.net/p/viewer/5018824/4AvuL0A0TD">소환 조사 예정 이재명 민주당 대표, '이재명·김건희 쌍특검' 받자 </a>,
<a class="link_txt" data-tiara-custom="contentUniqueKey=hamny-20220905141001001" data-tiara-id="20220905141001001" data-tiara-ordnum="4" data-tiara-type="harmony" href="https://gallery.v.daum.net/p/viewer/5608462/UInbuwKwnM"> 제11호 태풍 '힌남노' 예상 진로</a>,
<a class="link_txt #direct_newshome" data-tiara-layer="direct_newshome" href="/">뉴스홈</a>,
<a class="link_txt #direct_society" data-tiara-layer="direct_society" href="/society">사회</a>,
<a class="link_txt #direct_politics" data-tiara-layer="direct_politics" href="/politics">정치</a>,
<a class="link_txt #direct_economic" data-tiara-layer="direct_economic" href="/economic">경제</a>,
<a class="link_txt #direct_foreign" data-tiara-layer="direct_foreign" href="/foreign">국제</a>,
<a class="link_txt #direct_culture" data-tiara-layer="direct_culture" href="/culture">문화</a>,
<a class="link_txt #direct_digital" data-tiara-layer="direct_digital" href="/digital">IT</a>,
<a class="link_txt #direct_photo" data-tiara-layer="direct_photo" href="/photo">포토</a>,
<a class="link_txt #direct_media" data-tiara-layer="direct_media" href="/cp">언론사별 뉴스</a>,
<a class="link_txt #direct_history" data-tiara-layer="direct_history" href="/newsbox">배열이력</a>,
<a class="link_txt #direct_all" data-tiara-layer="direct_all" href="/breakingnews">전체뉴스</a>,
<a class="link_txt #direct_series" data-tiara-layer="direct_series" href="/series">연재</a>,
<a class="link_txt #direct_factcheck" data-tiara-layer="direct_factcheck" href="https://focus.daum.net/ch/news/factcheck">팩트체크</a>]
# 인덱싱 및 함수 사용 가능!
html.select('a.link_txt')[0].text.strip()
>'재난안전지도·CCTV로 본 경남 상황..가까운 대피소 미리 확인해야[특보]'
# for문을 통한 인덱싱
for item in html.select('a.link_txt')[:-13]:
print(item.text.strip())
>재난안전지도·CCTV로 본 경남 상황..가까운 대피소 미리 확인해야[특보]
'힌남노' 접근에 전운 감도는 출근길.."한 달 전 악몽 떠올라"
이종섭, 美하원의원들 만나 확장억제·연합방위 지원 당부
"한진칼에 '6600억' 쎄게 물렸다"..얼마나 건질까 [김익환의 컴퍼니워치]
강원도, 강원테크노파크 원장 선임 '절차상 하자' 판단
"태풍 온다, 車 대피시켜"..부산·울산 자동차 공장, 힌남노 대응 총력
"조선 단종에게 바쳤던 토종 다래를 아시나요"
세종 농촌관광협의회 창립.."농촌자원 상품화로 경제가치 창출"
네이버 클로바CIC, 네이버 클라우드에 '흡수설'
'스팩' 청산으로 6개월간 102조원 풀린다..글로벌 증시 숨통 트일 듯
LG에너지솔루션, 애리조나 투자 계획대로 가나?
"尹 녹색 민방위복장 출근, '오늘 퇴근 안 해' 外"[이앤피]
"쌀값 폭락, 생산비 폭등 반영해 농업예산 증액하라"
與 상전위 '비상상황' 유권해석 논의..8일 전국위 소집안 상정
中 국가보안기관 "NSA 해커조직, 6월 中유명대 공격"
"기브 앤 테이크 명확히"..'조원태 회장님 상소문'에 들썩
힌남노 접근에 日 초긴장..규슈 신칸센 6일 첫차부터 운행 취소
요기요, 지역차별·막말 '직장 내 괴롭힘' 논란 임원 A씨 징계 조치
이천시, 쌀 팔아주기 2달간 작년 쌀 1만2천t 모두 판매
힌남노가 휩쓴 日오키나와 순간풍속 40.1m..가로수 뽑히고 지붕 뚫리고
中서 애완견 입양해가더니.."개고기 안되려면 100만원 내놔라" 협박 [나우,어스]
"한진칼에 '6600억' 쎄게 물렸다"..얼마나 건질까 [김익환의 컴퍼니워치]
[아침신문 솎아보기] 중앙 "이재명 대표, 거센 반작용 '조국 사태' 교훈 얻지 못해"
[이 시각 세계] 고르바초프 장례식 수천 명 추모 행렬
이례적 행보..힌남노는 왜 그렇게 움직였을까? [이원주의 날飛]
민주당 4선 중진들 "이재명 檢 소환 부당, 응할 필요 없다"
[이앤피] "尹 녹색 민방위복장 출근, '오늘 퇴근 안 해' 外"
나에게 필요한 세럼 하나는?_선배's 어드바이스 #133
전통시장 찾은 한화진 환경부 장관
경기 가평군 가구창고서 불..1명 부상
'문재인 전 대통령 모욕 혐의' 유튜버 안정권 영장실질심사 출석
태풍 '힌남노' 인한 통신 피해 최소화 위한 대응
# 다음에서 로또번호 혹은 로또로 검색해서 표시되는 로또번호 크롤링 해오기
# requsts로 url에 정보요청
url = "https://search.daum.net/search?w=tot&q=%EB%A1%9C%EB%98%90%EB%8B%B9%EC%B2%A8%EB%B2%88%ED%98%B8&DA=NPI&rtmaxcoll=LOT"
resp = requests.get(url)
resp.text
# 정보를 html 변환 (보기 쉽게)
html = BeautifulSoup(resp.text, "html.parser")
# 필요정보 선별
# html.select('span.ball')[0].text >> <span></span> 태그 안에 있는 텍스트를 가져올 때 .text 사용!!!
for item in html.select("span.ball")[:-2]:
print(item.text)
>6
7
22
32
35
36
# 보너스 숫자까지 출력
for item in html.select("span.ball"):
if item.text != "보너스":
print(item.text)
>6
7
22
32
35
36
19
# 리스트로 저장!
lotto = []
for item in html.select("span.ball"):
if item.text != "보너스":
lotto.append(int(item.text))
lotto
>[6, 7, 22, 32, 35, 36, 19]
인터프리터 주피터 노트북은 파이썬의 장점을 가장 잘 살리는 툴!!!
패턴 URL 크롤링:
앞으로는 패턴을 순환하는 크롤링이 진행이 되는데 서비스 제공자가 이를 감지하고 기계적인 접속을 차단하는 경우가 많습니다.
이를 해결하기 위한 여러가지 방법을 소개합니다.
# requests 요청 객체의 상태코드
resp.status_code
>200
# HTTP 요청 시 상태코드 확인
requests.codes.NOT_FOUND
>404
# requests 패키지에 이미 정의되어 있는 코드 숫자에 따른 조건문 사용 가능
if resp.status_code == requests.codes.NOT_FOUND:
print("요청이 잘못 되었습니다. url을 다시 확인해주세요")
resp.codes.ok
# 100 우리 이런정보 내주는거야 # 도메인만 있는 경우
# 200 성공
# 300 우리 이 사이트 이리루 이사했어 일루가 # 리다이렉션
# 400 유저가 요청을 잘못한경우 $ 404 Page not found
# 500 서버 문제
url = "https://www.naver.com/index"
resp = requests.get(url)
resp
><Response [404]>
# 크롤링 시 문제가 없을 경우에만 진행
if resp.status_code == requests.codes.ok:
# 크롤링 코드 진행
html = BeautifulSoup(resp.text, "html.parser")
elif resp.status_code == requests.codes.NOT_FOUND:
# 경고메세지 출력 등등등
print("요청이 잘못 되었습니다. url을 다시 확인해주세요")
# 차단막는 코드
# 난수 생성 후 요청 작업에 시간차를 둠
seed = np.random.randint(100)
np.random.seed(seed)
a = np.random.randint(5)
time.sleep(a)
# 난수 & sleep을 적용한 크롤링 예시
for i in range(10):
seed = np.random.randint(100) # 난수의 베이스
np.random.seed(seed) # 베이스 생성 작업
a = np.random.randint(5) # 베이스에서 만들어지는 난수값, 1~5까지 정수중 하나 사용
time.sleep(a) # 난수값만큼 코드 실행을 지연
print(i)
>0
1
2
3
4
5
6
7
8
9
다음에서 로또번호 가져와보기! (10회차까지!):
# url 설정 (페이지 넘어가는 url 설정을 어떻게 할건지?)
# 순환시키면서 저 requests 요청을 어떻게 컨트롤 할 건지?
lotto = []
# url 설정
for page in range(1, 11):
url = f"https://search.daum.net/search?w=tot&DA=LOT&rtmaxcoll=LOT&&q={page}회차%20로또"
print(f"{page} 크롤링 중입니다!")
# 코드 지연을 통한 차단 방지
seed = np.random.randint(100)
np.random.seed(seed)
a = np.random.randint(5)
time.sleep(a)
# requests로 데이터 요청하기
resp = requests.get(url)
# html로 변환
html = BeautifulSoup(resp.text, "html.parser")
# 데이터 선별 (각 회차별로 정리가 되어야 함)
for num in html.select('span.ball')[:-2]:
lotto.append(int(num.text))
print("크롤링 완료!")
>1 크롤링 중입니다!
2 크롤링 중입니다!
3 크롤링 중입니다!
4 크롤링 중입니다!
5 크롤링 중입니다!
6 크롤링 중입니다!
7 크롤링 중입니다!
8 크롤링 중입니다!
9 크롤링 중입니다!
10 크롤링 중입니다!
크롤링 완료!
# 결과 출력
lotto
>[10,
23,
29,
33,
37,
40,
9,
13,
21,
25,
32,
42,
11,
16,
19,
21,
27,
31,
14,
27,
30,
31,
40,
42,
16,
24,
29,
40,
41,
42,
14,
15,
26,
27,
40,
42,
2,
9,
16,
25,
26,
40,
8,
19,
25,
34,
37,
39,
2,
4,
16,
17,
36,
39,
9,
25,
30,
33,
41,
44]
# numpy 활용
lotto_data = np.array(lotto).reshape(-1, 6)
lotto_data
>array([[10, 23, 29, 33, 37, 40],
[ 9, 13, 21, 25, 32, 42],
[11, 16, 19, 21, 27, 31],
[14, 27, 30, 31, 40, 42],
[16, 24, 29, 40, 41, 42],
[14, 15, 26, 27, 40, 42],
[ 2, 9, 16, 25, 26, 40],
[ 8, 19, 25, 34, 37, 39],
[ 2, 4, 16, 17, 36, 39],
[ 9, 25, 30, 33, 41, 44]])
# DataFrame 활용
df = pd.DataFrame(lotto_data)
df
>
0 1 2 3 4 5
0 10 23 29 33 37 40
1 9 13 21 25 32 42
2 11 16 19 21 27 31
3 14 27 30 31 40 42
4 16 24 29 40 41 42
5 14 15 26 27 40 42
6 2 9 16 25 26 40
7 8 19 25 34 37 39
8 2 4 16 17 36 39
9 9 25 30 33 41 44
# 데이터 시각화까지
plt.figure(figsize=(12, 6)) # 그래프 크기 설정
sns.countplot(lotto) # 그래프 정의
plt.show() # 그래프 렌더링
네이버 키워드로 검색한 결과를 크롤링:
# Content list 정의
content_list = ['이상한+변호사+우영우', '탑건', '범죄도시', '오징어게임']
# url 정의
for item in content_list:
url = f"https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query={item}"
# print(url)
# 코드 지연을 통한 차단 방지
seed = np.random.randint(100)
np.random.seed(seed)
a = np.random.randint(5)
time.sleep(a)
# requsts로 url에 정보요청
resp = requests.get(url)
# resp.text
# 정보를 html 변환 (보기 쉽게)
html = BeautifulSoup(resp.text, "html.parser")
# 정보선별
print(item)
print("-" * 77)
print(html.select('span.desc._text')[0].text)
print("=" * 77)
>이상한+변호사+우영우
-----------------------------------------------------------------------------
천재적인 두뇌와 자폐스펙트럼을 동시에 가진 신입 변호사 우영우(박은빈 분)의 대형 로펌 생존기
=============================================================================
탑건
-----------------------------------------------------------------------------
최고의 파일럿이자 전설적인 인물 매버릭(톰 크루즈)은 자신이 졸업한 훈련학교 교관으로 발탁된다. 그의 명성을 모르던 팀원들은 매버릭의 지시를 무시하지만 실전을 방불케 하는 상공 훈련에서 눈으로 봐도 믿기 힘든 전설적인 조종 실력에 모두가 압도된다. 매버릭의 지휘아래 견고한 팀워크를 쌓아가던 팀원들에게 국경을 뛰어넘는 위험한 임무가 주어지자 매버릭은 자신이 가르친 동료들과 함께 마지막이 될 지 모를 하늘 위 비행에 나서는데…
=============================================================================
범죄도시
-----------------------------------------------------------------------------
가리봉동 소탕작전 후 4년 뒤, 금천서 강력반은 베트남으로 도주한 용의자를 인도받아 오라는 미션을 받는다. 괴물형사 ‘마석도’(마동석)와 ‘전일만’(최귀화) 반장은 현지 용의자에게서 수상함을 느끼고, 그의 뒤에 무자비한 악행을 벌이는 ‘강해상’(손석구)이 있음을 알게 된다. ‘마석도’와 금천서 강력반은 한국과 베트남을 오가며 역대급 범죄를 저지르는 ‘강해상’을 본격적으로 쫓기 시작하는데... 나쁜 놈들 잡는 데 국경 없다! 통쾌하고 화끈한 범죄 소탕 작전이 다시 펼쳐진다!
=============================================================================
오징어게임
-----------------------------------------------------------------------------
456억 원의 상금이 걸린 의문의 서바이벌에 참가한 사람들이 최후의 승자가 되기 위해 목숨을 걸고 극한의 게임에 도전하는 이야기를 담은 넷플릭스 시리즈
=============================================================================
관심있는 개별종목의 시가총액, 외국인 소진률, PER, PBR 가져오기 실습:
# url 정의
url = "https://finance.naver.com/item/main.naver?code=005930"
# requests 요청
resp = requests.get(url)
resp.text
# html 변환
html = BeautifulSoup(resp.text, 'html.parser')
# 종목명
name = html.select("#middle > div.h_company > div.wrap_company > h2 > a")[0].text
print("종목명: " + name)
# 시가총액, 외국인소진률, PER, PBR
# 시가총액
market_sum = html.select('#_market_sum')[0].text
market_sum = market_sum.replace('\n', '')
market_sum = market_sum.replace('\t', '')
print("시가총액: " + market_sum)
# 외국인소진율(경로셀렉터)
runout = html.select("td em")[62].text
print("외국인소진율(B/A): " + runout)
# per
# per = html.select("td em#_per")[0].text
# print(per + "배")
per = html.select("#tab_con1 > div:nth-child(5) > table > tbody:nth-child(2) > tr > td")[0].text
per = per.replace('\n', '')
per = per.replace('\t', '')
per = per.replace('l', ' ')
print("PER: " + per)
# pbr
# pbr = html.select("td em#_pbr")[0].text
# print(pbr + "배")
pbr = html.select("#tab_con1 > div:nth-child(5) > table > tr > td")[1].text
pbr = pbr.replace('\n', '')
pbr = pbr.replace('\t', '')
pbr = pbr.replace('l', ' ')
print("PBR: " + pbr)
>종목명: 삼성전자
시가총액: 340조8,746
외국인소진율(B/A): 49.76%
PER: 8.66배 6,593원
PBR: 1.22배 46,937원
# 다른 풀이 # 현대미포조선, PER 없는 종목
# url 정의
url = 'https://finance.naver.com/item/main.naver?code=010620'
# requests 요청
resp = requests.get(url)
# html 변환
html = BeautifulSoup(resp.text)
# 시가총액, 외국인소진률, PER, PBR
# 시가총액
html.select('em#_market_sum')[0].text.replace('\n', '').replace('\t', '')
# 외국인소진율(경로셀렉터)
html.select('tr.strong em')[1].text
# per
html.select('em#_per')[0].text
# pbr
html.select('em#_pbr')[0].text
# 종목명
html.select('h2 a')[0].text
# 내가 보려고 하는 종목의 per 가 없는 경우 처리 코드 PER있는 경우는 안나옵니다.
if html.select('em#_per') == []:
print(html.select('table.per_table em')[0])
# 만약에 per가 N/A로 잡히는 경우
html.select('table.per_table em')[0]
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/005.gif)
긴 글 읽어주셔서 감사합니다 :)
'AI > [부트캠프] 데이터 사이언티스트 과정' 카테고리의 다른 글
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 13. (0) | 2022.09.07 |
---|---|
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 12. (0) | 2022.09.06 |
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 10. (0) | 2022.09.02 |
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 9. (0) | 2022.09.01 |
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 8. (0) | 2022.08.31 |