Python の Requests パッケージを使用してシミュレートされたログインを実装する方法

不言
リリース: 2018-05-02 14:22:20
オリジナル
2886 人が閲覧しました

この記事では、主に Python の Requests パッケージを使ってログインをシミュレートする方法を詳しく紹介します。興味のある方は参考にしてください。少し前に、私は Python を使っていくつかのページを取得するのが好きでしたが、基本的に、それらはすべて get を使用していくつかのページをリクエストし、通常のルールに従ってそれらをフィルタリングします。

今日試して、個人ウェブサイトへのログインをシミュレートしました。発見も比較的簡単です。この記事を読むには、http プロトコルと http セッションについてある程度の理解が必要です。

注: シミュレートされたログインは私の個人 Web サイトであるため、次のコードは個人 Web サイトとアカウントのパスワードを処理します。

ウェブサイト分析

クローラーにとって重要な最初のステップは、ターゲットのウェブサイトを分析することです。ここでは、分析に Google Chrome の開発者ツールを使用します。

ログインをクロールすると、そのようなリクエストが見つかりました。

上の部分はリクエストヘッダー、下の部分はリクエストによって渡されるパラメータです。図からわかるように、ページはフォームを通じて 3 つのパラメーターを送信します。それぞれ _csrf、usermane、password です。

csrf は、クロスドメインのスクリプト偽造を防ぐためのものです。原理は非常に単純です。つまり、リクエストごとにサーバーが暗号化された文字列を生成します。非表示の入力フォームに配置します。別のリクエストを行う場合は、この文字列を一緒に渡して、同じユーザーからのリクエストであるかどうかを確認します。

それで、私たちのコードロジックはそこにあります。まず、ログイン ページをリクエストします。次に、ページを分析して csrf 文字列を取得します。最後に、この文字列とアカウントのパスワードがログインのためにサーバーに渡されます。

最初のコード

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import requests
import re

# 头部信息
headers = {
 'Host':"localhost",
 'Accept-Language':"zh-CN,zh;q=0.8",
 'Accept-Encoding':"gzip, deflate",
 'Content-Type':"application/x-www-form-urlencoded",
 'Connection':"keep-alive",
 'Referer':"http://localhost/login",
 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}

# 登陆方法
def login(url,csrf):
 data = {
 "_csrf" : csrf,
 "username": "xiedj",
 "password": "***"
 }

 response = requests.post(url, data=data, headers=headers)
 return response.content


# 第一次访问获取csrf值
def get_login_web(url):
 page = requests.get('http://localhost/login')
 reg = r&#39;<meta name="csrf-token" content="(.+)">&#39;
 csrf = re.findall(reg,page.content)[0]
 login_page = login(url,csrf)
 print login_page


if __name__ == "__main__":
 url = "http://localhost/login/checklogin"
 get_login_web(url)
ログイン後にコピー

コードには問題ないようです。しかし、実行中にエラーが発生しました。確認すると、エラーの原因は csrf 検証に失敗したためです。

取得したcsrfとログインに要求したcsrf文字列がOKであることを何度も確認した後、問題を思いつきました。

エラーの原因がまだわからない場合は、ここで一時停止して問題について考えることができます。 「サーバーは、csrf を取得するための最初のリクエストと、ログイン後の 2 番目のリクエストが同じユーザーからのものであることをどのようにして知るのでしょうか?」


この時点で、正常にログインしたい場合は、その方法を解決する必要があることが明らかです。 2 つのリクエストが同じユーザーからのものであるとサービスに認識させるためです。ここでは http セッションを使用する必要があります (よくわからない場合は、Baidu を自分で使用できます。ここで簡単に説明します)。

http プロトコルはステートレス プロトコルです。これをステートレスにするために、セッションが導入されました。簡単に言うと、セッションを通じてこのステータスを記録します。ユーザーが初めて Web サービスをリクエストすると、サーバーはユーザーの情報を保存するためのセッションを生成します。同時に、ユーザーに戻るときに、セッション ID が Cookie に保存されます。ユーザーが再度リクエストすると、ブラウザはこの Cookie を一緒に持ち込んでくれます。したがって、サーバーは複数のリクエストが同じユーザーに対するものであるかどうかを知ることができます。

したがって、最初のリクエストを行うときに、コードはこのセッション ID を取得する必要があります。このセッション ID を 2 番目のリクエストと一緒に渡します。リクエストの優れた点は、このセッション オブジェクトを単純な request.Session() で使用できることです。

2 番目のコード

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import requests
import re

# 头部信息
headers = {
 &#39;Host&#39;:"localhost",
 &#39;Accept-Language&#39;:"zh-CN,zh;q=0.8",
 &#39;Accept-Encoding&#39;:"gzip, deflate",
 &#39;Content-Type&#39;:"application/x-www-form-urlencoded",
 &#39;Connection&#39;:"keep-alive",
 &#39;Referer&#39;:"http://localhost/login",
 &#39;User-Agent&#39;:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}

# 登陆方法
def login(url,csrf,r_session):
 data = {
 "_csrf" : csrf,
 "username": "xiedj",
 "password": "***"
 }

 response = r_session.post(url, data=data, headers=headers)
 return response.content


# 第一次访问获取csrf值
def get_login_web(url):
 r_session = requests.Session()
 page = r_session.get(&#39;http://localhost/login&#39;)
 reg = r&#39;<meta name="csrf-token" content="(.+)">&#39;
 csrf = re.findall(reg,page.content)[0]


 login_page = login(url,csrf,r_session)
 print login_page


if __name__ == "__main__":
 url = "http://localhost/login/checklogin"
 get_login_web(url)
ログイン後にコピー

ログイン後にページを正常に取得します

このコードから、requests.Session() がセッション オブジェクトを開始した後、2 番目のリクエストによってセッション オブジェクトが自動的に変更されることがわかります。前のもの セッションIDを一緒に渡します。関連する推奨事項:Pythonを使用してExcelチャートをエクスポートし、Picturesとしてエクスポートする方法Pythonのオープン関数を使用する場合のそのようなファイルやディールエラーの原因を解析する方法

以上がPython の Requests パッケージを使用してシミュレートされたログインを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!