通常、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))