Python requests 에서 post 요청 을 보 내 는 의문점
Python 파충류 에 서 는 requests 로 요청 을 보 내 고 지정 한 사 이 트 를 방문 하 는 것 이 흔 하 다.일반적으로 GET 요청 이나 POST 요청 을 보 내 는데 GET 요청 에 대해 할 말 이 없 는데 POST 요청 을 보 내 면 POST 제출 방식 을 헷 갈 리 기 쉬 운 친구 들 이 많다.오늘 위 챗 커 뮤 니 케 이 션 그룹 에서 친구 가 이런 문 제 를 만 났 습 니 다.특별히 설명해 드 리 겠 습 니 다.
HTTP 프로 토 콜 에서 post 가 제출 한 데 이 터 는 메시지 주체 에 넣 어야 하지만 프로 토 콜 에 어떤 인 코딩 방식 을 사용 해 야 하 는 지 규정 되 어 있 지 않 아 제출 방식 이 다 릅 니 다.서버 는 요청 헤더 의 Content-type 필드 에 따라 요청 한 메시지 주체 가 어떤 방식 으로 인 코딩 을 하 는 지 알 고 메시지 주 체 를 분석 합 니 다.구체 적 인 인 인 코딩 방식 은 다음 과 같다.
1.양식 양식 제출
requests 는 폼 폼 폼 을 제출 합 니 다.일반적으로 사이트 로그 인 에 존재 하 며 사용자 이름과 비밀 번 호 를 제출 합 니 다.이로써http://httpbin.org/post 예 를 들 어 requests 에 서 는 form 폼 으로 post 요청 을 보 내 고 요청 한 매개 변 수 를 사전 으로 구성 한 다음 requests.post()의 data 매개 변수 에 전달 하면 됩 니 다.코드 는 다음 과 같 습 니 다:
url = 'http://httpbin.org/post'
d = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=d)
print r.text
출력 효 과 는 다음 과 같 습 니 다:{
"args":{},
"data":"",
"files":{},
"form":{"key1":"value1","key2":"value2"},
"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate",
"Connection":"close",
"Content-Length":"23",
"Content-Type":"application/x-www-form-urlencoded",
"Host":"httpbin.org",
"User-Agent":"python-requests/2.12.3"},
"json":null,
"origin":"113.140.11.122",
"url": http://httpbin.org/post }
httpbin.org 사 이 트 는 요청 한 내용 을 표시 할 수 있 습 니 다.출력 된"Content-Type":"application/x-ww-form-urlencoded"를 주의 하여 이것 이 Form 을 제출 하 는 방식 임 을 증명 합 니 다.한 사이트 에 접속 할 때 Content-Type 이 무엇 인지 살 펴 볼 수 있 습 니 다.
2.제 이 슨 꼬치 제출
json 문자열 을 제출 하 는 것 은 주로 ajax 요청 을 보 내 는 데 사 용 됩 니 다.동적 으로 데 이 터 를 불 러 옵 니 다.콜라 보 사 이 트 를 예 로 들 면 상품 을 불 러 오 는 방식 은 aax 이 고 상품 의 내용 은 응답 중이 다.
다음은 요청 헤더 와 요청 실 체 를 열거 합 니 다.
일부 초보 자 들 은 요청 헤드 에 따라 파충 류 를 쓰 면 requests 의 사용 오 류 를 범 할 수 있다.
오류 표기 법
import requests
__author__ = 'qiye'
__date__ = '2018/5/19 21:59'
url = "http://jinbao.pinduoduo.com/network/api/common/goodsList"
data ={"pageSize":60,"pageNumber":1,"withCoupon":0,"sortType":0}
headers = {
'Content-Type':'application/json; charset=UTF-8',
'Host':'jinbao.pinduoduo.com',
'Origin':'http://jinbao.pinduoduo.com',
'Referer':'http://jinbao.pinduoduo.com/',
'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Mobile Safari/537.36',
'Accept': 'application/json, text/javascript, */*; q=0.01',
}
r = requests.post(url=url,data =data,headers=headers)
print(r.text)
인쇄 된 내용 은 다음 과 같 습 니 다.{"success":false,"errorCode":4000000,"errorMsg":"System Error","result":null}
오류 가 발생 했 습 니 다.이 럴 때 아무리 생각해 도 이해 가 안 됩 니 다.요청 헤더 가 일치 합 니 다.'Content-Type':'application/json;charset=UTF-8'다 붙 였 는데 왜 틀 렸 어 요?
정 답 은 요청 실체의 형식 이 틀 려 서 서버 에서 디 코딩 할 수 없다 는 것 이다.
맞 춤 법
정확 한 코드 는 data 를 json 인 코딩 하여 다시 보 내 는 것 입 니 다.코드 는 다음 과 같 습 니 다:
r = requests.post(url=url,data =json.dumps(data),headers=headers)
이때 인쇄 내용 을 다시 한 번 보고 상품 내용 을 정확하게 되 돌려 주 었 습 니 다.{"success":true,"error Code":1000000,"error Msg":null,"result":{"total":2271278,"goods List":[{"goodId":998422995,"goodName":"[4 액+1 기]교교 한 전열 모기향 액 임산부 아기 모기 퇴치 어린이 아기 무미 모기 방지 액체","goods ImageUrl":"http://t11img.yangkeduo.com/images/2018-04-12/0292b5e75053dfa748b9762d3f3e74ef.jpeg","soldQuantity":175,"minGroupPrice":24890,"category Id":4,"category Name":"모유","hasCoupon":true,"coupon MinOrderAmount":5000,"coupon Discount":5000,"coupon TotalQuantity":5000,"coupon RemainQuantity":3940,"coupon StartTime":1526572800,"coupon EndTime":1527782399,"promotion Rate":280}
...
맞 춤 법 2
데이터 의 주동 적 인 인 인 코딩 을 json 으로 보 내 는 것 을 처리 하 는 동시에 requests 는 json 인 자 를 제공 하여 json 방식 으로 자동 으로 보 냅 니 다.또한 요청 헤더 에'Content-Type'을 표시 하지 않 아 도 됩 니 다.'application/json';charset=UTF-8'。전체 코드 는 다음 과 같 습 니 다:
import requests
__author__ = 'qiye'
__date__ = '2018/5/19 21:59'
url = "http://jinbao.pinduoduo.com/network/api/common/goodsList"
data ={"pageSize":60,"pageNumber":1,"withCoupon":0,"sortType":0}
headers = {
'Host':'jinbao.pinduoduo.com',
'Origin':'http://jinbao.pinduoduo.com',
'Referer':'http://jinbao.pinduoduo.com/',
'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Mobile Safari/537.36',
}
r = requests.post(url=url,json =data,headers=headers)
print(r.text)
3.파일 업로드파일 을 업로드 하 는 것 은 파충류 에 서 는 거의 사용 되 지 않 지만,requests 를 사용 하여 사용 방식 을 설명 하 는 것 이 좋 습 니 다.Content-type 형식 은 multipart/form-data 로 multipart 형식 으로 post 요청 을 보 냅 니 다.requests.post()의 files 매개 변수 에 파일 하 나 를 전송 하면 됩 니 다.아니면http://httpbin.org/post 예 를 들 어 코드 는 다음 과 같다.
url = 'http://httpbin.org/post'
files = {'file': open('upload.txt', 'rb')}
r = requests.post(url, files=files)
print(r.text)
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.