Pythonシミュレーションログイン、POST / GETリクエスト

通常、Webページにアクセスすると、入力ボックスからデータを入力し、WebページはPOST、GET、またはその他のフォームを送信してサーバーへの要求を開始し、成功するとデータはフロントデスクに返されます。表示用。以下は、Pythonのリクエストライブラリの簡単な紹介です。
前提条件は、最初にpythonとrequestsライブラリ
をインストールすることですインストール要求:

pip install requests

テストURLのリクエスト= http://www.test.com

1つ、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) # 请求结果

2、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であり、リクエストペイロードの形式のリクエストです。
最初はform-dataと同じだと思いましたが、渡されたURLとデータは1つだけで、データは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))

3、POSTリクエストを送信する前にログインをシミュレートする必要があります

たとえば、ログイン後に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")

これらを取得した後、これらの値を(フォームデータの)フォームデータに戻す必要があります:

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
}

ログインをシミュレートし、Cookieを保存します。

#模拟登录请求
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