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 |