Python requests 에서 post 요청 을 보 내 는 의문점

6410 단어 pythonrequestspost
머리말
Python 파충류 에 서 는 requests 로 요청 을 보 내 고 지정 한 사 이 트 를 방문 하 는 것 이 흔 하 다.일반적으로 GET 요청 이나 POST 요청 을 보 내 는데 GET 요청 에 대해 할 말 이 없 는데 POST 요청 을 보 내 면 POST 제출 방식 을 헷 갈 리 기 쉬 운 친구 들 이 많다.오늘 위 챗 커 뮤 니 케 이 션 그룹 에서 친구 가 이런 문 제 를 만 났 습 니 다.특별히 설명해 드 리 겠 습 니 다.
HTTP 프로 토 콜 에서 post 가 제출 한 데 이 터 는 메시지 주체 에 넣 어야 하지만 프로 토 콜 에 어떤 인 코딩 방식 을 사용 해 야 하 는 지 규정 되 어 있 지 않 아 제출 방식 이 다 릅 니 다.서버 는 요청 헤더 의 Content-type 필드 에 따라 요청 한 메시지 주체 가 어떤 방식 으로 인 코딩 을 하 는 지 알 고 메시지 주 체 를 분석 합 니 다.구체 적 인 인 인 코딩 방식 은 다음 과 같다.
  • application/x-www-form-urlencoded:form 폼 형식 으로 데 이 터 를 제출 하 는 것 이 가장 흔 하고 모두 가 가장 잘 아 는 것 입 니 다
  •  application/json:json 문자열 로 데 이 터 를 제출 합 니 다
  • 다음은 상기 세 가지 인 코딩 의 POST 요청 을 requests 로 보 냅 니 다.
    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)
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기