Python 시뮬레이션 로그인, POST / GET 요청

일반적으로 웹 페이지를 방문하면 입력 상자를 통해 데이터를 입력하고 웹 페이지는 POST, GET 또는 기타 양식을 전송하여 서버에 요청을 시작하고 성공하면 데이터가 프런트 데스크로 반환됩니다. 디스플레이. 다음은 Python의 요청 라이브러리에 대한 간략한 소개입니다.
전제 조건은 먼저 Python을 설치하고 라이브러리를
요청하는 것 입니다. 설치 요청 :

pip install requests

테스트 URL 요청 = http://www.test.com

하나, GET 요청

1. 요청 매개 변수 없음 : 데이터를 얻기 위해 URL 링크에 직접 액세스

result = requests.get(url=url)
print(result.status_code) # 请求状态
print(result.url)# 请求url
print(result.text) # 请求结果

2. 요청 매개 변수가 있습니다. 키-값 쌍이 매개 변수를 형성합니다.

result = requests.get(url=url, params={
    
    'keyword1':'val1','keyword2':'val2'})
#或者可以直接先拼接url
#new_url = url + '?keyword1=' + val1 + '&keyword1=' +val2
#result = requests.get(url=new_url)

print(result.status_code) # 请求状态
print(result.url)# 请求url
print(result.text) # 请求结果

3. 요청 헤더 매개 변수가 있습니다. 키-값 쌍 양식 매개 변수

header = {
    
    
'Host': 'test.com',
'Content-Type': 'application/json; charset=UTF-8',
}
result = requests.get(url=url, header=header)
print(result.status_code) # 请求状态
print(result.url)# 请求url
print(result.text) # 请求结果

둘째, POST 요청

1. 요청 된 결과 집합은 application / x-www-form-urlencoded입니다.

result = requests.post(url=url,data={
    
    'keyword1':'val1','keyword2':'val2'},headers={
    
    'Content-Type':'application/x-www-form-urlencoded'})
print(result.status_code) # 请求状态
print(result.url)# 请求url
print(result.text) # 请求结果

2. 요청 된 결과 집합은 multipart / form-data입니다.

result = requests.post(url=url,data={
    
    'keyword1':'val1','keyword2':'val2'},headers={
    
    'Content-Type':'multipart/form-data'})
print(result.status_code) # 请求状态
print(result.url)# 请求url
print(result.text) # 请求结果

3. 요청 된 결과 집합은 application / json입니다.

import json
data = {
    
    'keyword1':'val1','keyword2':'val2'}
json_data = json.dumps(data)
result = requests.post(url=url,data=json_data,headers={
    
    'Content-Type':'application/json'})
print(result.status_code) # 请求状态
print(result.url)# 请求url
print(result.text) # 请求结果

아래 그림에서 볼 수 있듯이
여기에 사진 설명 삽입
이전에 만난 구덩이에 대해 이야기 해 보겠습니다. 요청 메서드는 POST이고 Request Payload 형식의 요청입니다.
처음에는 양식 데이터와 동일하다고 생각하고 URL과 데이터가 하나만 전달되었고 데이터가 JSON으로 형식화되지 않아 상태가 415 : 서버가 요청에 첨부 된 미디어 형식을 처리 할 수 ​​없습니다. 상담 후 형식과 요청 헤더를 변경하여 원활하게 데이터를 반환합니다.
전체 데모는 다음과 같습니다.

import json
import requests
import datetime
import re, urllib.request, lxml.html, http.cookiejar

url = 'http://test.com/products'
# payloadData数据
payload_data = {
    
    'keyword1': "val1", 'keyword2': "val2"}
# 请求头设置
payload_header = {
    
    
'Host': 'test.com',
'Content-Type': 'application/json; charset=UTF-8',
}
# 下载超时
timeout = 30
# 代理IP
# proxy_list = {"HTTP":'http://210.22.5.117"3128',"HTTP":'http://163.172.189.32:8811',"HTTP":'http://180.153.144.138:8800'}
json_data = json.dumps(payload_data)
# allow_redirects 是否重定向
# result = requests.post(url=url, data=json_data, headers=payloadHeader, timeout=timeout, proxies=proxy_list, allow_redirects=True)

result = requests.post(url, data=json_data, headers=payload_header, timeout=timeout, allow_redirects=True)
# 下面这种直接填充json参数的方式也OK
# result = requests.post(url, json=json_data, headers=payload_header)
print("请求耗时:{0}, 状态码:{1}, 结果:{2}".format(datetime.datetime.now(),res.status_code,res.text))

셋, 게시 요청을 보내기 전에 로그인 시뮬레이션 필요

예를 들어 로그인 후 페이지에서 미묘한 작업을 시뮬레이션하고 싶을 때가 있습니다. ajax 요청을 사용하여 프런트 엔드에서 데이터를 수정해야합니다. 변경 횟수가 매우 적 으면 프런트 엔드 직접 작업이 더 빠릅니다. 대규모 수정 인 경우에도 수정 사항을 탐색하려면 프로그램을 사용해야합니다.
로그인 페이지 :
여기에 사진 설명 삽입
먼저 F12를 열어 개발자 모드로 들어간 다음 위의 양식에 데이터를 입력하고 로그인을 클릭합니다. 로그인 데이터가 잘못 되었더라도 아래와 같이 로그인 요청에 의해 제출 된 데이터 형식을 볼 수 있습니다.
여기에 사진 설명 삽입

일부는 입력 한 숨겨진 값이 아닙니다. 페이지 소스 코드의 양식에서 가져온 다음 마우스 오른쪽 버튼을 클릭하여 페이지 소스 코드를보고 "__VIEWSTATE", "의 값을 검색해야합니다. __VIEWSTATEGENERATOR ","__EVENTVALIDATION "이 원본 페이지에 직접 입력되지 않았습니다. 예 :
여기에 사진 설명 삽입

즉, 페이지의 소스 코드를 미리 방문하고 위의 속성 값을 얻기 위해 구문 분석해야합니다.

import requests, string
import re, urllib.request, lxml.html, http.cookiejar

login_url = "http://test.com/Login.aspx"
response = urllib.request.urlopen(login_url)
f = response.read()
doc = lxml.html.document_fromstring(f)

VIEWSTATE = doc.xpath("//input[@id='__VIEWSTATE']/@value")
VIEWSTATEGENERATOR = doc.xpath("//input[@id='__VIEWSTATEGENERATOR']/@value")
EVENTVALIDATION = doc.xpath("//input[@id='__EVENTVALIDATION']/@value")

이러한 값을 얻은 후에는 이러한 값을 Form-Data (양식 데이터)에 다시 넣어야합니다.

from urllib.parse import quote
login_data = urllib.parse.urlencode({
    
    
       '__EVENTTARGET' : '',
       '__EVENTARGUMENT' : '',
       '__VIEWSTATE' : VIEWSTATE[0],
       '__VIEWSTATEGENERATOR' : VIEWSTATEGENERATOR[0],
       '__EVENTVALIDATION' : EVENTVALIDATION[0],
       'TextCustomerID' : "真实商户号",
       'TextAdminName' : '真实用户名',
       'TextPassword' : '真实密码',
       'btnLogin.x' : 40,
       'btnLogin.y' : 10
    }).encode('utf-8')

로그인 매개 변수의 인코딩은 매우 중요합니다. utf-8 인코딩을 수행하지 않으면 다음 오류가보고됩니다.

Traceback (most recent call last):
  File "c:\users\user\appdata\local\programs\python\python38\lib\http\client.py", line 965, in send
    self.sock.sendall(data)
  File "c:\users\user\appdata\local\programs\python\python38\lib\ssl.py", line 1201, in sendall
    with memoryview(data) as view, view.cast("B") as byte_view:
TypeError: memoryview: a bytes-like object is required, not 'str'

양식 데이터를 사용하여 다음 단계는 요청 헤더를 가져 오는 것입니다.
여기에 사진 설명 삽입

header = {
    
    
   'Host': 'www.test.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Accept-Encoding': 'gzip, deflate',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Origin': 'http://www.test.com',
    'Connection': 'keep-alive',
    'Referer': 'http://www.test.com/Login.aspx',
    'Upgrade-Insecure-Requests': 1
}

로그인 시뮬레이션 및 쿠키 저장 :

#模拟登录请求
login_request = urllib.request.Request(login_url, login_data, Headers)
#创建cookie,利用cookie实现持久化登录
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
login_result = opener.open(login_request)

최종 시뮬레이션 로그인 후 특정 페이지에 대한 데이터를 수집하려면 urllib.request.urlopen을 통해 페이지 링크에 액세스하여 데이터 수집을위한 페이지 소스 코드를 읽을 수도 있습니다. Post / Get 처리해야하는 데이터 배치가있는 경우 처리 할 데이터를 가져온 다음 Post 또는 Get 요청을 트래버스하고 시작할 수 있습니다.

import time, random

var datas = {
    
    .....}
for data in datas:
    response = requests.get(url, headers = headers, data=json_data, cookies = cj)
    # 或
    response = requests.post(url, headers = headers, data=json_data, cookies = cj)
    time.sleep(random.randint(3, 5))

추천

출처blog.csdn.net/Lin_Hv/article/details/105137605