카테고리 없음

크롤링: 데이터 끌고오는거.. 데이터의 수집(정제)과 비주얼라이징

logloglog 2021. 2. 1. 10:50

buttercoconut.xyz/270/

 

파이썬 크롤링의 기초와 간단한 실행 - Coconut

안녕하세요 코코넛입니다. 이번에는 크롤링 관련 세미나를 진행하면서 정리한 자료를 포스팅하게 되었습니다. 세미나를 진행하면서 사용한 ppt를 포스팅에서 그대로 사용하였습니다. 자 이제

buttercoconut.xyz

내 ㅁ컴퓨터 이외를 망, 바다라고 표현하는데 그 망을 이용하는게 거미임

xml이라고 되어잇는데 요즘은 json으로 가져옴

거미불에서거미가 걷는거 : 크롤링

 

A싱크로나이즈(비동기) JA 자바스크립트 X  ml  비동기적으로 자바스크립트를 쓰는데 데이터는 xml로 전송시키ㄴ다.

초반엔 xml로 가져오다가 이제는 json으로 가져옴 .. xml의 단점 : <xml><message>I'm good</msg>  </xml> 아임굿만 가져오고싶어도 떨거지들이 많음... >> overhead. 

>>그래서 message : "imgood"

json(JSON(제이슨, JavaScript Object Notation)) : 자바스크립트의 ㅇ객체를 표현하는 방법

 

우리가 배우고잇는 프로그램은 mvc  패턴을 많이쓰는데 큰단점이있다. : 셀렉트화면에서 인서트화면으로 이동하면 껌벅거림.. (reload)  mvc 패턴의 디폴트가 깜박거리는거임

 

ajax방식의 장점 :  안깜박거린다.

 

근데 어싱크로는 뒤에거스타트해놓고 밑에껏도 쭉쭉하고있음

 

동기가 기본 근데 왜 비동기를 쓰느냐/

내가 동기로 아프리카의 정보를 가져오려면 오래걸리는데 한번 누르고 한참을 기다려야됨 아무것도 못하고..

(req타입~res타임까지의 간격은 3초 이내로 해야함)

 

 

공공데이터 포털 : 네이버, 구글, 등의 방식과유사함 open API임

 

web2.0부터  open API 생김

open API가 대세임

 

오늘은 데이터를 끌고오는걸 해볼거임

 

developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

 

 

 

폰인증받고, 검색, 환경은 web으로 한다.

 

 

 


 

 

 

 

 

# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys
import urllib.request
client_id = "5mcK0gy1uQw995irtQO0"
client_secret = "5DzPIVsPFN"
encText = urllib.parse.quote("대전맛집")
url = "https://openapi.naver.com/v1/search/local.json?query=" + encText # json 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # xml 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)#리퀘스트의 가장 윗단에 넣어서 인증받음
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)#그 사이트 들어가서 가져오는거임. response에 : html형태로 받음(xml형태로 보이지만 근간은 html이다) 
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()#res를 읽으면 정보들이 들어가있다.
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)

근데 한개만 줌

 

주지않아도 끌고올수잇는 방법을 강구해보자

 

 

 

 

parse : 어떤형태로 변환하는거

파싱: xml인데 텍스트상태인걸 가져와서 재가원하는 좌표만 얻으려고 파싱하는것

 

html 파싱을 하면 xml파싱은 거의 자동으로 따라옴

 

beautiful soup : 파싱하는놈 ;... 를 이용한 라이브러리.. 이걸로만들어서 자바로도, 파이선으로도 만드어준다....

 

 

pip install

counda install.. ?

 

라이브러리 받을떄 콘다를 먼저 받고(충돌이적다) 안되면 pip를 받는다..

 

victorydntmd.tistory.com/245

 

[Python 크롤링] BeautifulSoup을 이용한 HTML 파싱 및 크롤링 ( feat. 셀레니움 )

BeautifulSoup BeautifulSoup은 HTML 파싱 라이브러리로서, 몇 개의 메서드만으로 DOM 추출이 가능합니다. 기본적으로 UTF-8 인코딩 방식이지만 CP949도 지원하며, HTML뿐만 아니라 XML 파싱도 가능합니다. 저

victorydntmd.tistory.com

 

from bs4 import BeautifulSoup#아나콘다에의해 깔아져잇는거임

html = '<td id="td1" class="title">' \
       '  <div class="tit3">' \
       '    <a href="/movie/bi/mi/basic.nhn?code=161242" title="범죄도시">범죄도시</a>' \
       '  </div>' \
       '</td>'

bs = BeautifulSoup(html, 'html.parser')


#print(bs, type(bs))
# <td id="td1" class="title"><div class="tit3"><a href="/movie/bi/mi/basic.nhn?code=161242" title="범죄도시">범죄도시</a></div></td> <class 'bs4.BeautifulSoup'>

# a 태그 출력
#tag = bs.a

#print(tag, type(tag))
# <a href="/movie/bi/mi/basic.nhn?code=161242" title="범죄도시">범죄도시</a> <class 'bs4.element.Tag'>



#tag = bs.td
#print(tag['class'])     # ['title']     => 리스트
#print(tag['id'])        # td1
#print(tag.attrs)        # {'id': 'td1', 'class': ['title']}   => 딕셔너리
    
##    
# # div 태그 중, class가 tit3인 태그를 찾는다.
# tag = bs.find('div', attrs={'class': 'tit3'})
# print(tag)      # <div class="tit3"> <a href="/movie/bi/mi/basic.nhn?code=161242" title="범죄도시">범죄도시</a> </div>
# 
# tag = bs.find('div')
# print(tag)      # <div class="tit3"> <a href="/movie/bi/mi/basic.nhn?code=161242" title="범죄도시">범죄도시</a> </div>
# 
# # 없는 태그를 조회할 경우
# tag = bs.find('td', attrs={'class': 'not_exist'})
# print(tag)      # None
# 
# # 전체 태그에 대해 title이 범죄도시인 태그를 찾는다.
# tag = bs.find(attrs={'title': '범죄도시'})
# print(tag)      # <a href="/movie/bi/mi/basic.nhn?code=161242" title="범죄도시">범죄도시</a>


# tag = bs.select("td div a")[0]
# print(tag)        # <a href="/movie/bi/mi/basic.nhn?code=161242" title="범죄도시">범죄도시</a>
# 
# text = tag.contents[0]#.content 를 하면 html의 text를 가져온다.
# print(text)     # 범죄도시


tag = bs.select("td")[0]
print(tag)      # <td class="title" id="td1"> <div class="tit3"> <a href="/movie/bi/mi/basic.nhn?code=161242" title="범죄도시">범죄도시</a> </div></td>

# div요소를 제거
div_elements = tag.find_all("div")
for div in div_elements:
    div.extract()
    
print(tag)      # <td class="title" id="td1"> </td>
    

아까 검색결과에서 성심당이랑 mapx mapy 만 나오게 해보자

 

text나 contents[0] 으로 뽑을수있따.

 

 

이것도 된다.

 

 

홈페이지 만드는걸해보자

 

 

아파치톰캣 7이라2.5

 

 

.web = .controller

>> 서블렛을 뜻함

 

서블릿도 서버에서 온거임

웹어플리케이션이 모바일 앱이 된것처럼

 

시가릿

시가렛

 시가를 얇게 만것

 

같은ㄴ느낌/.

 

 

<%out.println >> <%= 으로 작아졌으믈오 스크립트릿!

 

이렇게 서블렛 만들어서 서버 켜서 돌려보면

 

 

 

이렇게 나옴 이걸 파이썬으로 뽑아보면

 

서버가 켜져있어야함

 

이걸 다른사람이 못뽑게하ㅕㄹ면

세션을 거는거임

로그인을 해야지만이 가능하게

 

package kr.or.ddong.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		String userName = (String) session.getAttribute("user_name");
		if(userName.equals("maiji")) {
			out.println("<html>");
			out.println("<head>");
			out.println("</head>");
			out.println("<body>");
			out.println("<table>");
			out.println("<tr>");
			out.println("<td>ito hiro bumi</td><td>01028281919</td>");
			out.println("</tr>");
			out.println("</table>");
			out.println("</body>");
			out.println("</html>");
		}else {
			out.println("are you spy?");
		}
		
		
		
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

 

이렇게 하고 돌리면 오류남

 

package kr.or.ddong.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//로그인하는척하는 서블렛//로그인처리가자동으로되는 로직을 넣을거임
public class LoginServlet extends HttpServlet {


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session =  request.getSession();
		session.setAttribute("user_name", "maiji");
		PrintWriter out = response.getWriter();
		out.println("로그인되었습니다.");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

로긘 한번 돌리고 하면 

 

package kr.or.ddong.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LogoutServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session =  request.getSession();
		session.invalidate();//세션 모두 날라감
		PrintWriter out = response.getWriter();
		out.println("로그아웃되었습니다.");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}
}

ㄹ로그아웃돌리면 다시안됨

 

이제 데이터뽑아ㄹ오려고 해도 안됨.. 로그인을 하는 기능이없기떄문에

 

 

selenium.. 이 단위테스트툴임

 

메소드 하나하나잘돌아가는지 테스트하는거

셀레늄은 자바로도 파이선으로도 지원되고..

단위테스트하려면 로그인해야됨

 

숙제

주식정보를 모아오자

 

www.sedaily.com/Stock/Quote/?mobile

 

전종목 시세 : 서울경제

KOSPI 3,038.41 62.20+2.09%

www.sedaily.com

time  은 집어넣은시간

 

YYYYMMDD.HHMM

20211020/.1240

총 13자리