파이썬 크롤링의 기초와 간단한 실행 - Coconut
안녕하세요 코코넛입니다. 이번에는 크롤링 관련 세미나를 진행하면서 정리한 자료를 포스팅하게 되었습니다. 세미나를 진행하면서 사용한 ppt를 포스팅에서 그대로 사용하였습니다. 자 이제
buttercoconut.xyz
내 ㅁ컴퓨터 이외를 망, 바다라고 표현하는데 그 망을 이용하는게 거미임
거미불에서거미가 걷는거 : 크롤링
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가 대세임
오늘은 데이터를 끌고오는걸 해볼거임
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를 받는다..
[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 만 나오게 해보자
홈페이지 만드는걸해보자
.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
YYYYMMDD.HHMM
20211020/.1240
총 13자리