728x90
반응형
In [22]:
# get ( = Read ) 가장 일반적인 경우 사용
import requests
url = 'http://httpbin.org/'
resp = requests.get(url+'get',params={'key':'value','key1':'value'})
resp = requests.head(url+'get')
# head만 가져오는 것 / body는 비어있어야 함.
# dictionary 형태로 들어감
In [12]:
# post ( = Create )
import requests
url = 'http://httpbin.org/'
resp = requests.post(url+'post',data={'key':'value','key1':'value'})
# parameter 가 아니라 data임 (dictionary인건 마찬가지)
In [17]:
# put ( = Update )
import requests
url = 'http://httpbin.org/'
resp = requests.put(url+'put',data={'key':'value','key1':'value'})
# parameter 가 아니라 data임 (dictionary인건 마찬가지)
In [12]:
# del ( = delete )
import requests
url = 'http://httpbin.org/'
resp = requests.post(url+'post',data={'key':'value','key1':'value'})
# parameter 가 아니라 data임 (dictionary인건 마찬가지)
In [28]:
type(resp)
resp.status_code # 200인지 확인하고 ( 내 잘못 아님)
resp.headers
resp.request.headers
resp.request.body # 잘 날아갔는지 확인
resp.content # byte type 그대로
resp.text # string으로 바꾼 것인지
resp.encoding = 'utf-8'
In [23]:
resp.content
Out[23]:
In [24]:
print(resp.request.headers) # or body
print(resp.text) # 응답 부분
# arg에 Key value쌍이 들어감
# post 할 때는 header가 아니라 'body'에 들어감
In [25]:
resp.text
Out[25]:
In [37]:
# http://www.crawler-test.com/status_codes/status_403
# _ 다음에 숫자 임의로 붙여서 에러 확인
import requests
url = "https://www.google.com/search"
headers = {'user-agent' :'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'}
# headers 에 mozila부분만 들어가도 가능함
# headers에 각자의 user-agent값을 key-value로 입력하면 된다.
def download(url, param=None,retries=3): # 에러가 났을 때, 3번 정도 더 시도해 보는 것.
resp = None
try:
resp = requests.get(url,params=param,headers=headers)
resp.raise_for_status()
except requests.exceptions.HTTPError as e:
if 500 <= resp.status_code < 600 and retries > 0: # 500대 에러이면 한 번 더 시도하는 것
print('Retries: {0}'.format(retries))
return download(url,param,retries-1) # 여기서는 딱 3번 돔 (재귀적으로)
else:
print(resp.status_code)
print(resp.reason)
print(resp.request.headers)
return resp
#html = download(url)
#html.read().decode('utf-8')
## 파이썬 검색해서 하면 안뜸 searchMozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36가 disallowed 이기 때문에 ( forbidden )
## 파라미터는 항상 바이트 타입으로 보내야함.
## 한글로 그대로 대신 적어주면 에러 뜸
### header 추가하면 403 에러 뜨지 않음
### 에러 400 : 내 잘못 / 500 : 서버 잘못, 다시 시도해봐야함
In [39]:
download('http://www.crawler-test.com/status_codes/status_500')
# try except에 의해서 범위에 벗어나기에 403으로 나와야한다.
Out[39]:
In [57]:
# http://pythonscraping.com/pages/files/form.html
In [120]:
# 이건 Post함수
# http://www.crawler-test.com/status_codes/status_403
# _ 다음에 숫자 임의로 붙여서 에러 확인
import requests
url = "https://www.google.com/search"
headers = {'user-agent' :'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'}
# headers 에 mozila부분만 들어가도 가능함
# headers에 각자의 user-agent값을 key-value로 입력하면 된다.
def postDownload(url, data=None,cookie=None,retries=3): # 에러가 났을 때, 3번 정도 더 시도해 보는 것.
resp = None
try:
resp = requests.post(url,data=data,headers=headers,cookies=cookie) # auto login할 때 cookie 필요함
resp.raise_for_status()
except requests.exceptions.HTTPError as e:
if 500 <= resp.status_code < 600 and retries > 0: # 500대 에러이면 한 번 더 시도하는 것
print('Retries: {0}'.format(retries))
return download(url,data,cookie,retries-1) # 여기서는 딱 3번 돔 (재귀적으로)
else:
print(resp.status_code)
print(resp.reason)
print(resp.request.headers)
return resp
#html = download(url)
#html.read().decode('utf-8')
## 파이썬 검색해서 하면 안뜸 searchMozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36가 disallowed 이기 때문에 ( forbidden )
## 파라미터는 항상 바이트 타입으로 보내야함.
## 한글로 그대로 대신 적어주면 에러 뜸
### header 추가하면 403 에러 뜨지 않음
### 에러 400 : 내 잘못 / 500 : 서버 잘못, 다시 시도해봐야함
In [121]:
url = 'http://pythonscraping.com/pages/files/processing.php'
html = postDownload(url,{'firstname':'Lee','lastname':'Chamin'})
print(html.status_code)
print(html.reason)
print(html.request.body)
print(html.request.headers)
html.text
Out[121]:
In [122]:
# get으로 위에랑 똑같이
html2 = download(url,{'firstname':'이','lastname':1})
print(html2.status_code)
print(html2.headers)
print(html2.request.body)
print(html2.request.headers)
# None으로 나온다.
html2.text
# 결과가 안뜨는 것을 보면 이 페이지는 get이 아닌 post만 받는다는 것을 알 수 있다.
Out[122]:
In [141]:
# http://pythonscraping.com/pages/cookies/login.html
# post로 넘겨 자동로그인 하기
cookie = html.cookies.get_dict()
url = 'http://pythonscraping.com/pages/cookies/welcome.php'
html = postDownload(url,{}, cookie)
In [142]:
html.text
# 쿠키를 이용해서 로그인이 완료된 모습을 볼 수 있다
Out[142]:
In [143]:
# parameter는 정상적으로 전해짐
html.request.body
In [144]:
# cookie를 받아와야함 ( response내의 )
html.cookies
# 딕셔너리 정보를 가져오기 위해 get_dict() 붙임
html.cookies.get_dict()
Out[144]:
In [149]:
session = requests.Session()
resp = session.post(url,data={'username':'lee','password':'password'})
In [150]:
resp.text
# login이 안된 모습.
Out[150]:
In [154]:
# cookie값을 들고와야 로그인 할 수 있음
cookie = resp.cookies.get_dict()
resp = session.post(url,{},cookie)
resp.text
Out[154]:
In [177]:
# getDownload
import requests
def getDownload(url, param = None, retries = 3):
resp = None
try:
resp = requests.get(url, params = param, headers = headers)
resp.raise_for_status()
except requests.exceptions.HTTPError as e:
if 500 <= resp.status_code < 600 and retries > 0:
print('Retries : {0}'.format(retries))
return getDownload(url, param, retries -1)
else:
print(resp.status_code)
print(resp.reason)
print(resp.request.headers)
return resp
In [180]:
# _returnType=json 끝에 붙이기 ( 변환 )
# 하나하나 다 뜯어야함
#url = '' # 뒤에거 뜯어서 param으로
url = 'http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty?'
param={
"serviceKey":"sh3rYw7QjwAhsCW88FOOcPwFQ9%2F4E3uFZX6rDHwjtkpu9yFwvVX1fMb%2Bz%2B2n4CSdn50fmS0AbD7IqNL8O4qcAA%3D%3D",
"numOfRows": 10,
"pageNo":1,
"sidoName":"서울",
"ver":1.3,
"_returnType":"json"}
html = getDownload(url,param)
html.text
Out[180]:
In [181]:
requests.utils.urlparse(html.request.url)
org = requests.utils.unquote(param['serviceKey'])
print(param['serviceKey'])
print(org)
print(requests.utils.quote(org))
param['serviceKey'] = org
html = getDownload(url, param)
html.text
# requests.utils.quote() # quote로 해야 바뀐 servicekey와 같아짐
# requests.utils.unquote() # unquote 해줘야함
# requests.utils.urlparse(html.request.url)
Out[181]:
In [182]:
import json
In [183]:
result = json.loads(html.text) # 메모리 부터 읽는 것
result
Out[183]:
In [190]:
for row in result['list']: # result['list']는 10개임
print(row['stationName'],row['pm25Value'])
In [ ]:
대기오염정보 조회 서비스
728x90
반응형