-
220725_데이터분석_웹크롤링_4주_1일차(복기)카테고리 없음 2022. 7. 25. 19:51
크롤링(Crawling), 스크래핑(Scraping)
- 웹 크롤링은 기존의 복사본 만들기, 웹 스크래핑은 분석을 위한 특정 데이터를 추출 or 새로운 것을 만든다.
- crawling은 다 긁어오는 것, scraping은 필요한 부분을 잘라오는 것
- 스크래핑을 하기 위해선 크롤링 선행이 필요함
1. 웹사이트 크롤링
- 텍스트, 영상, 음성, 그림 등.. **저작권** 문제 주의
- 트래픽을 유발하므로 일반적으로 허용하지 않음
- https://www.google.com/robots.txt
- https://www.naver.com/robots.txtUser-agent: 대상 웹 크롤링 봇의 이름. *이면 전체 대상
Disallow: 접근 허용 않는 경로.
Allow: 접근을 혀용하는 경로.
Crawl-delay: 한번 접근 후 다음 접근이 제한되는 시간
Sitemap: 사이트맵 파일의 URL
이외 인터넷 상에 공개된 데이터라고 하더라도 저작권(copyright)이 있습니다. 침해 여부를 확인 필수2. 오픈 API를 통해서 가져오기
- 참고 URL : https://www.data.go.kr/
socket을 이용한 HTTP 통신
- 서버와 클라이언트 양방향 연결이 이루어지는 통신
- 일반적으로는 웹 페이지(html)를 주로 요청
- 그림 파일(jpg, png, ...)일 수도 있다고 함
import socket serverAddress = socket.gethostbyname('info.cern.ch') # info.cern.ch의 아이피주소 불러와 serverPort = 80 # 소켓번호는 80이야 sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) # 소켓구멍하나만들고 스트림타입 쓴다 sock.connect( (serverAddress, serverPort) ) # 아이피주소, 소켓번호로 연결해 method = 'GET' # 메소드 가져왔니? request_header = f'{method} /index.html HTTP/1.1\r\n' request_header += 'Host: info.cern.ch\r\n' request_header += '\r\n' sock.send( request_header.encode() ) # 정보보낸다 response = sock.recv(1024) # 정보 받는다 print( response.decode() ) # 디코딩해서 출력해줘 sock.close() # response
HTTP/1.1 200 OK Date: Mon, 25 Jul 2022 08:29:39 GMT Server: Apache Last-Modified: Wed, 05 Feb 2014 16:00:31 GMT ETag: "286-4f1aadb3105c0" Accept-Ranges: bytes Content-Length: 646 Connection: close Content-Type: text/html <html><head></head><body><header> <title>
http://info.cern.ch
</title> </header> <h1>
http://info.cern.ch
- home of the first website</h1> <p>From here you can:</p> <ul> <li><a href="
http://info.cern.ch/hypertext/WWW/TheProject.html
">Browse the first website</a></li> <li><a href="
http://line-mode.cern.ch/www/hypertext/WWW/TheProject.html
">Browse the first website using the line-mode browser simulator</a></li> <li><a href="
http://home.web.cern.ch/topics/birth-web
">Learn about the birth of the web</a></li> <li><a href="
http://home.web.cern.ch/about
">Learn about CERN, the physics laboratory where the web was born</a></li> </ul> </body></html>HTTP/1.1 버전 200 OK
날짜: 월요일, 2022년 7월 25일 08:29:39 GMT
서버: Apache Last-Modified: 2014년 2월 5일 수요일 16:00:31
GMTag: "286-4f1aadb3105c0"
수락-범위: 바이트
내용-길이: 646
연결: 닫기
내용-타입: text/html </head> <body> <header> <body>
http://info.cern.ch
</filename> </filename> <h1>
http://info.cern.ch
- 첫 번째 웹사이트의 홈 </h1> <p> 여기에서 다음을 할 수 있습니다. </p> <ul> <li> <a href="
http://info.cern.ch/hypertext/WWW/TheProject.html
">첫 번째 웹 사이트를 찾습니다/a></li><li><a href="
http://line-mode.cern.ch/www/hypertext/WWW/TheProject.html
">라인 모드 브라우저 시뮬레이터를 사용하여 첫 번째 웹 사이트를 검색합니다. </a> </li> <li> <a href="
http://home.web.cern.ch/topics/birth-web
">웹의 탄생에 대해 알아보기 <li> <a href="
http://home.web.cern.ch/about
">웹이 탄생한 물리학 연구소 CERN에 대해 알아보십시오. </a> </li> </ul> </body> </html>쉽게 생각해보자.
주소를 알고 있다는 가정하에 소켓이라는 알맞은 구멍을 통해 연결이 가능하고
그 연결에 사용했던 html의 정보와
입력대비 출력의 구조에 대해서 말하고 있는 간단한 코드다솔직히 아직 눈에 익진 않는다... :(
암기과목의 느낌이라 반복학습을 통해서 규격을 머릿속에 넣을 수 있을 것 같다.
라이브러리를 이용한 HTTP 통신
- 소켓 프로그래밍을 직접 하지 않고도 편하게 HTTP 통신을 구현
- urllib, requests
1 ) urllib을 통한 HTTP 통신
- 파이썬 기본 패키지
- 따로 설치 없이 바로 사용이 가능
import urllib.request url = 'http://info.cern.ch' request = urllib.request.Request(url) # 요청 response = urllib.request.urlopen(request) # 응답 print(response.read().decode())
2 ) urllib을 통한 파일 저장
- urllib은 리퀘스트 객체를 생성할 때, 헤더값을 직접 정의
- fake_agent를 이용해서 user-agent 헤더의 값을 크롬 크라우저의 값과 동일하게 설정
!pip install fake_useragent import urllib.request from fake_useragent import UserAgent agent = UserAgent() header = {'User-Agent' : agent.chrome } url = 'https://upload.wikimedia.org/wikipedia/ko/thumb/4/4a/%EC%8B%A0%EC%A7%B1%EA%B5%AC.png/230px-%EC%8B%A0%EC%A7%B1%EA%B5%AC.png' request = urllib.request.Request(url) # 요청 response = urllib.request.urlopen(request) # 응답 print(response.read())
user agent는 HTTP 요청을 보내는 디바이스와 브라우저 등 사용자 소프트웨어의 식별 정보를 담고 있는 request header의 한 종류이다. 임의로 수정될 수 없는 값이고, 보통 HTTP 요청 에러가 발생했을 때 요청을 보낸 사용자 환경을 알아보기 위해 사용한다.
3 ) urllib.request.urlretrieve를 통한 파일 저장
import urllib.request from fake_useragent import UserAgent agent = UserAgent() header = {'User-Agent' : agent.chrome } url = 'https://upload.wikimedia.org/wikipedia/ko/thumb/4/4a/%EC%8B%A0%EC%A7%B1%EA%B5%AC.png/230px-%EC%8B%A0%EC%A7%B1%EA%B5%AC.png' path = 'download.jpg' # request = urllib.request.Request(url) # 요청 # response = urllib.request.urlopen(request) # 응답 urllib.request.urlretrieve(url, path) # 응답
위와 동일하게 agent를 크롬과 동일하게 fake 값으로 맞추고
url과 경로를 받아 코랩 내부에 저장하였다.
구글에서 임의로 가져온 짱구 사진을
파이썬 내부에서도 가져다 쓸 수 있게 만들었다
데이터 시각화랑은 또 다르게
마케팅 관점에서 해당 제품의 광고가 걸려있으면
이런식으로 제품 이미지를 가져와
보고서 만드는데 도움이 될 것 같다.
4 ) requests을 통한 HTTP 통신
# 로컬에서 사용하는 경우 따로 설치를 해주는 것이 좋다. !pip install requests import requests url = 'https://ssl.pstatic.net/melona/libs/1400/1400990/5ae21c88965f9fc8b2fd_20220630151118867_3.png' response = requests.get(url) with open('banner.jpg', 'wb') as f: f.write(response.content)
banner.jpg의 url을 찾아와
리퀘스트 겟에 넣고
파이썬 파일 만들기( open() ) 을 통하여
banner.jpg를 만들어 url을 콘텐츠로 넣는 개념.
결과적으로 도달하고싶은 목적지에 방식의 차이가 있을 뿐 다양한 방법이 존재하는 것 같다.
개발자를 양성하는 첫번째는 사용법에 대한 교육
자주 쓰면 더이상 사용법을 보지 않아도 될 정도로 능숙해지며
사용법을 까먹었을 땐 구글링을 통해 보완하는 방식으로
능숙해져 사용법을 쓰지 않아도 업무가 가능한 영역이 늘어날 수록 전문가가 되고
개발이라는 이름에 걸맞게 창의적 요소가 추가된다면 전문가 사이에서 급수가 높아지지 않을까싶다.