1. HTTP 구조
- get, post, rest 방식별로 header body 부분이 다름

2. 웹 크롤러
- 데이터 수집 형태의 봇

3. 합법? 위법?
- opt-out : 정보수집을 명시적으로 거부할 때에만 정보수집 중단 => 크롤링은 기본적으로 opt-out(white list)
- opt-in : 정보수집을 명시적으로 동의할 때에만 정보수집 가능 => black list
- 수익이 없는 공공적인 데이터 제공을 목적으로 하는 서비스는 합법(수익이 생기면 불법)

1) 위법이 되는 경우
- 남의 명의를 사용하는 경우
- 개인정보 등의 Database를 수집해가는 경우
- 트래픽을 너무 많이 사용하게 되는 경우(ddos)

2) 이용방침
- 아래 쪽에 크롤링에 대한 금지 문구가 있는 사이트를 크롤링하는 것은 위법이다.
robots.txt 파일을 보면 bot에 대한 접근을 제어하기 위해 규익을 적어둠 Disallow: / <=> Allow: / 루트부터 사용할 수 없다.
https://www.naver.com/robots.txt => 여기서에서 보면 허용가능 부분을 보여줌
- 최소한의 트래픽(다중 쓰레드 X, 어느 정도 딜레이)

 

1. 주피터 노트북

- anaconda를 깔고 Jupyter Notebook을 실행하면 나옴

- Tab을 누르면 자동환성 Shift+Tab을 누르면 해당 함수의 상세내용이 나옴

 

2. 기본적인 크롤링 툴

1) from urllib import request

- request 결과를 그대로 출력해줌

 

3. from urllib import request 

 

1) 리퀘스트 결과보기
from urllib import request

resp = request.urlopen("https://www.google.com/")
resp.geturl()
resp.getcode()
resp.getheaders()



2) 오류 확인
from urllib import request

try:
    resp = request.urlopen("https://www.google.com/search?ei=KTTIXJD7K47XhwPRt6b4CQ&q=%EB%B0%95%EB%B3%B4%EC%98%81&oq=%EB%B0%95%EB%B3%B4%EC%98%81&gs_l=psy-ab.3...0.0..3934...0.0..0.0.0.......0......gws-wiz.NqyPz5FBgOE") 
except request.HTTPError as e:
    print(e.code)
    print(e.reason)
    print(e.headers)
    print(e.request.headers())    

 



3) 유저에이전트를 추가
from urllib import request

url = "https://www.google.com/search?ei=KTTIXJD7K47XhwPRt6b4CQ&q=%EB%B0%95%EB%B3%B4%EC%98%81&oq=%EB%B0%95%EB%B3%B4%EC%98%81&gs_l=psy-ab.3...0.0..3934...0.0..0.0.0.......0......gws-wiz.NqyPz5FBgOE"
request.Request(url, 
                headers={"user-agent:":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15"},
                method="GET")

 

 

4. from urllib import parse 

1) 인코딩

from urllib import parse
parse.urlencode({"q":"박보영"})

from urllib import parse
params = {"q": "박보영123adfa", "a":"한글"}
parse.urlencode(params)

 

5. 에러 처리 방법

1) 에러별 처리 방법

- 200 => 성공

- 400 => 내 잘못이니 멈추기

- 500 => 서버가 이상하니 몇번 더 시도하기

 

2) download 함수로 만들기

from urllib import request
from urllib import parse
header = {"user-agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15"}

def download(url, params, retries=3):        
    resp = None
    try:
        req = request.Request(url + "?" + parse.urlencode(params), headers=header)        
        resp = request.urlopen(req)                
    except request.HTTPError as e:
        if 500 <= e.code < 600 and retries > 0:
            resp = download(url, params, retries-1)
        else:
            print(e.code)
            print(e.reason)
            print(e.headers)
    return resp

 

3) download 실행

params = {"q": "박보영"}
resp = download("https://www.google.com/search", params)

 

4) 해당 페이지 소스 가져오기

- read는 호출될때마다 urlopen이 초기화 된다

resp.read().decode("utf-8")

 

5) 문자열 자르기

url = "https://www.google.com/search?ei=LEXIXPqFBMrZhwPk64nQDQ&q=%EB%B0%95%EB%B3%B4%EC%98%81&oq=%EB%B0%95%EB%B3%B4%EC%98%81"
result = parse.urlparse(url)
[_ for _ in result]

 

[output]

['https', 'www.google.com', '/search', '', 'ei=LEXIXPqFBMrZhwPk64nQDQ&q=%EB%B0%95%EB%B3%B4%EC%98%81&oq=%EB%B0%95%EB%B3%B4%EC%98%81', '']

 

- 반대는 urljoin

 

7) parse.quote, parse.quote_plus

- 띄어쓰기를 +로 표시할지 %20%으로 표시할지가 다르다

parse.quote("박 보 영"), parse.quote_plus("박 보 영")

- 반대는 parse.unquote, parse.unquote_plus

 

[output]

('%EB%B0%95%20%EB%B3%B4%20%EC%98%81', '%EB%B0%95+%EB%B3%B4+%EC%98%81')

 

 

'데이터 분석가 역량' 카테고리의 다른 글

day 4] BeautifulSoup  (0) 2019.05.03
day 4] DOM  (0) 2019.05.02
day 3 ] Requests  (0) 2019.05.02
Day 2] Reqeusts  (0) 2019.04.30
Day - 1  (0) 2019.04.29

+ Recent posts