記事のディレクトリ
リクエストモジュールの概要
これらのリクエストとレスポンスのコンテンツをブラウザで取得できるので、リクエストを「偽造」できますか?つまり、これらのデータをブラウザー経由で送信するのではなく、Pythonを介してブラウザーをシミュレートしてリクエストを送信します。答えは実行可能です。リクエストモジュールはこの機能を実行できます。
Requestsモジュールは、Pythonによって実装されたシンプルで使いやすいHTTPライブラリです。
他に図書館はありますか?答えはイエス、例えばですurllib
、urllib2
、httplib
、httplib2
およびその他のモジュール。しかし現在、Requestsモジュールが最も人気があります。そしてそれはまた良いモジュールです
リクエストの送信:
Requests
ネットワークリクエストの送信に使用するのは非常に簡単です。最初に、リクエストモジュールをインポートする必要があります。
import requests
次に、特定のWebページを取得してみます。この例では、SogouWebページのホームページを取得しましょう。
r=requests.get('https://www.sogou.com/')
これで、rという名前のResponseオブジェクトができました。このオブジェクトから、必要な情報を取得できます。例:返されたコンテンツを印刷します
r.text
実際、ブラウザでこのURLを開き、右クリックして[ページのソースコードを表示]を選択すると、印刷したものとまったく同じであることがわかります(クロール防止またはWebサイトがない場合)。静的なWebサイトです)。つまり、上記の数行のコードは、Sogouのホームページのすべてのソースコードをクロールするのに役立ちました。
スプライシングURL:
1。
import requests
url='https://www.sogou.com/web?query='+'挖掘机小王子'
response=request.get(url)
print(response.text)
import requests
url='https://www.sogou.com/web?‘
param={
'query' : '挖掘机小王子'
}
response=request.get(url,params=param)
print(response.text)
注:辞書内のどのキーもURLのクエリ文字列に追加されません
知識の拡大:
リストを渡すこともできます:
import requests
payload={
’key1‘:'value1','key2':['value2','value3']}
r=requests.get('http://httpbin.org/get',params=payload)
print(r.url)
印刷結果は次のとおりです。 http://httpbin.org/get?key1=vavlue1&key2=value2&key2=value3
テキスト応答内容
サーバー応答の内容を読み取ることができます。その前は、r.textを使用して、サーバーから返されたコンテンツにアクセスしていました。そして、返されたコンテンツを見ることができます。魔法は、エンコードとデコードについて何もしなかったことです。実際には
リクエストはサーバーからのコンテンツを自動的にデコードします。ほとんどのUNICODE文字セットはシームレスにデコードできます。
リクエストが送信された後、リクエストはHTTPヘッダーレスポンスのエンコーディングに基づいて知識に基づいた推測を行います。r.textにアクセスすると、リクエストは推測されたテキストエンコーディングを使用します。リクエストが使用するエンコーディングを確認し、e.encodingプロパティを使用して変更
でき
ます。r.encodingの結果は「utf -8」になります。
r.encoding='gb2312'
エンコーディングを変更すると、r.textにアクセスするたびに、Requestはr.encodingの新しい値を使用します
HTMLページでは、エンコーディング情報を設定し、エンコーディング情報を表示してから、r.encodingを対応するエンコーディングに
設定して、正しいエンコーディングを使用してr.textを解析できるようにすることができます。そして、ウェブページのエンコーディングはブラウザで見ることができます
バイナリ:
リクエストは自動的にgzipをデコードし、送信コード化された応答データをデフレートします
たとえば、画像情報をファイルに簡単に保存できます。写真、mp3、ビデオ、その他のデータの場合、
インポート要求を読み取るためにバイナリメソッドを使用する必要があることがよくあります
url='https://pic.sogou.com/pics/recompic/detail.jsp?category=%E7%BE%8E%E5%A5%B3&tag=%E5%86%99%E7%9C%9F#1%263976741'
r=requests.get(url)
print(r.content)
with open('baidu.png','wb') as f:
f.write(r.content)
1.r.contentはバイナリ情報です2.open
()はコンテキストマネージャーでファイルオブジェクトを開きます。ファイルを自動的に閉じるのに役立ちます
f = open()
f.write()
f.close()3。
現状のまま1つのエイリアスを取るために、ニックネーム
4.wb wは書き込み用で、ファイルがデータの書き込み用に開かれている場合でも、bはバイナリデータの書き込み用、
rはデータの読み取り用、
aはデータの上書きではなくデータの追加用です。
gbk gb2312
カスタムリクエストヘッダー:
ウェブサイトを構築する最終的な目的は、人々が訪問することです。実際、ほとんどすべてのウェブサイトはクローラーを歓迎していません。現在でも、相手がクローラープログラムであることがわかった場合、クローラーのアクセスを直接禁止するWebサイトが増えています。つまり、クローラーに情報が返されることはなく、プロンプトが返されるものもあります。現在、違法にアクセスしています。!
Webサーバーは、私たちがクローラーであることをどのように認識しますか?判断する方法はたくさんありますが、最も一般的な方法は、リクエストヘッダーから判断することです。
HTTPリクエストを送信するとき、プログラムがリクエストヘッダー情報を提供しない場合、またはリクエストヘッダー情報が間違っている場合、つまり、リクエストヘッダー情報が提供されない場合、ブラウザはリクエストヘッダー情報などを提供します(デフォルトはプログラムの送信時ではありません)。サーバーによって送信されます。はい、サーバーによって拒否されます。
リクエストヘッダーの検証は、最も単純なアンチクローラー戦略でもあります
リクエストヘッダーを追加する
私たちの解決策は、ブラウザの機能や動作を可能な限りシミュレートすることです。ブラウザはリクエストヘッダーを送信するので、プログラムも当然それを追加する必要があります。リクエストでは、headersパラメータを介してリクエストヘッダー情報を追加します
imports requests
url=''
headers={
'User-Agent':' '
}
e=requests.get(url,headers=headers)
POSTリクエストは主にフォームデータの送信に使用され、サーバーはフォームデータを分析して、クライアントに返すデータの種類を決定します
フォームフォーム送信データ
RequestsでPOSTリクエストを実行することも比較的簡単です。これを実現するには、データパラメータにディクショナリを渡すだけで、リクエストを行うときにデータディクショナリがフォームとして自動的にエンコードされます。
ペイロード= {'key1': 'value1'、 'key2': 'value2'}
r = requests.post {''、data = payload}
もちろん、リクエストのpostメソッドは、 getメソッド。その他パラメータは類似しています。たとえば、クエリ文字列paramsパラメータをPOSTのURLに追加したり、getメソッドのようにheadersパラメータを追加したりすることもできます。
POSTデータ
Content-Typeは、転送されるデータのタイプです。1。Content-Type
:application / x-www-form-urlencoded(フォームフォーム)
データパラメータは、フォームが渡され、辞書が受け入れられるときに使用されます。
2. Content-Type:データを転送する
ときのapplication / json(json形式でデータを転送する)、jsonパラメーターを使用し、辞書を受け入れる
。data= json.dumps()を使用して形式を変換する(辞書を文字列に変換する)こともできます。)
応答ステータスコード
応答ステータスコードは、それが簡単に私たちの応答の状態を確認することができます私たちは、応答ステータスコードをチェックすることができます。
R = requests.get(「https://httpbin.org/get」)
r.status_codeを
エラーリクエストが送信された場合(A 4XXクライアントのエラー、または5XXサーバーエラー応答)、我々はできる
例外をスローして(response.raise_for_status):
R = requests.get( 'https://httpbin.org/status/404')
#404 r.status_code
Rを。 raise_for_status()#トレイ例外#例外
エラー
トレースバック(最後の最後の呼び出し):
ファイル「requests / models.py」、行832、raise_for_statusで
raise http_errorrequests.exceptions.HTTPError:404クライアントエラー
例のrのstatus_codeが200の場合、raise_for_status()を呼び出すと、次のようになります。
r.raise_for_status()#200
なし
ステータスコードr.status_code200を確認します。これは、リクエストが成功したかどうかを判断するためによく使用されます。
応答ヘッダー
サーバーの応答ヘッダーをPython辞書の形式で表示できます
r.headers#
結果は
{'content-encoding': 'gzip'、 'transfer-encoding': 'chunked'、 'connection': 'close'}ですが
、この辞書は特別ですか?:HTTPヘッダー専用です。RFC2616(HTTP1.1プロトコル)によると、HTTPヘッダーでは大文字と小文字は区別されません。
したがって、大文字の形式を使用して、次の応答ヘッダーフィールドにアクセスできます
。r.headers['Content-Type']# 'application / json'
r.headers.get( 'Content-Type')# 'application / json'
応答ヘッダーr.headersは、応答ヘッダー情報を辞書形式で返し、辞書でアクセスできます。
クッキー
現在のウェブサイトには、ユーザーがアクセスするために登録してログインする必要があるウェブサイト、またはWeibo、WeChatなどのログインせずに個人データにアクセスできないタイプのウェブサイトがあります。
ウェブサイトがユーザー情報を記録する方法は、クライアントのCookie値を使用します。たとえば、ブラウザにアカウントとパスワードを保存すると、ブラウザはユーザー情報をコンピュータに保存し、次にこのページにアクセスしたときに自動的に保存されます。私たちのためにクッキー情報をロードする
ログインが必要なWebサイトでは、ブラウザがCookie内の情報を送信し、サーバーがCookie情報を確認してログインを確認します。ブラウザはリクエストの送信時にCookie情報を伝達するため、プログラムもCookie情報を伝達する必要があります
Cookieは、特定のサイトまたは特定のページにアクセスしたときにコンピューターに保存されるテキストの一部であり、検索設定、動作クリック、アカウント番号、パスワードなど、Webサイト訪問者の関連データを追跡および記録するために使用されます。 。
通常、Cookie値の情報はブラウザにコピーして、ヘッダーに配置できます。
headers = { 'Accept': 'application / json、text / javascript、/ ; q = 0.01'、'Accept-Encoding': 'gzip、deflate、br'、'Connection': 'keep-alive''Cookie ': 'xxxxxxxxxxxxxxxxxxxxxx'#ブラウザでコピー………………………… }これはリクエストヘッダーと一緒に送信できます。もちろん、リクエストはCookie情報を送信するためのCookieパラメータも提供します。
import requests
url=xxx
cookies={
'Cookie':'你的cookie值'}
r=request.get(url,cookies=cookies)
駅B訪問事例
import requests
url='https://account.bilibili.com/home/userInfo'
r=requests.get(url)
print(r.json())
リダイレクトとリクエスト履歴
リダイレクト
リダイレクトとは、さまざまな方法でネットワーク要求を別の場所にリダイレクトすることです。考えられる理由は、一部のURLが非推奨になり、使用する準備ができていないことなどです。
リダイレクトを処理する
デフォルトでは、一般的に使用されるGETおよびPOSTリクエストなどの場合、リクエストはすべてのリダイレクトを自動的に処理します。たとえば、GithubはすべてのHTTPリクエストをHTTPSにリダイレクトします。
r=requests.get('http://github.com')
r.url #'https://github.com'
r.status_code #200
GET、POSTなどを使用している場合は、allow_redirectsパラメーターを使用してリダイレクト処理を無効にできます。
r=requests.get('http://github.com',allow_redirects=Flase)
r.status_code #301
応答オブジェクトのhistoryメソッドを使用して、リダイレクトを追跡できます。response.historyは、Responseオブジェクトのリストです。これらのオブジェクトは、リクエストを完了するために作成されます。オブジェクトのリストは、古いリクエストから最新のリクエストの順に並べ替えられます。
r=requests.get('http://github.com')
r.history #[<Response[301]>]
タイムアウト
時間や相手のウェブサイトの関係で長時間待ちたくない場合があり、応答が返されるのを待ちます。その後、タイムアウトパラメータを追加できます。設定した時間を超えても応答が返らない場合は、その後、私たちは再び待つことはありません。
timeoutパラメーターで設定された秒数が経過すると、応答の待機を停止するように要求に指示できます。すべての製品コードでこのパラメーターを使用することをお勧めします
requests.get(( 'http://github.com'、timeout = 0.001)
エラーと例外
ネットワークの問題(DNSクエリの失敗、接続の拒否など)が発生すると、リクエストはConnectionError例外
1をスローします。HTTPリクエストが失敗したステータスコードを返す場合、Response.raise_for_status()はHTTPError例外
2をスローします。リクエストがタイムアウトすると、タイムアウト例外
がスローされます3。リクエストが設定された最大リセット数を超えると、TooManyRedirects例外がスローされます。
Requestsによって明示的にスローされたすべての例外は、requests.exceptions.RequestExceptionから継承されます
文字は、国別文字、句読点、グラフィック記号、数字など、さまざまな文字や記号の総称です。文字セットは複数の
文字の集合です。文字セットには、ASCII文字セット、GB2313文字セット、GB18030文字セット、Unicode文字セットなどが含まれます
。ASCIIコードは1バイト、Unicodeコードは通常2バイトです。
ユーザーエージェント:
Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML、Geckoなど)Chrome / 70.0.3538.25 Safari / 537.36 Core / 1.70.3866.400 QQBrowser / 10.8.4379.400
XPはWindowsNT5.1に
対応しますWindows7はWindowsNT6.1に
対応しますWindows8はWindowsNT6.3に対応します
GETリクエストとは、サーバーからのデータのリクエストを指します
ユーザーエージェント:
Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML、Geckoなど)Chrome / 70.0.3538.25 Safari / 537.36 Core / 1.70.3866.400 QQBrowser / 10.8.4379.400
ヘッダーを変更する
Requestのheadersパラメーターによって変更されました
import requests
url='https://www.baidu.com/'
heads={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400'
}
e=requests.get(url,headers=heads)
print(e.status_code)
import json
import urllib.request
import urllib.parse
url='https://www.baidu.com/'
heads={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400'
}
e=urllib.request.Request(url,heads)
print(e)
request.add_header()メソッドによって変更されました
import json
import urllib.request
import urllib.parse
url='https://www.baidu.com/'
heads={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400'
}
e=urllib.request.Request(url)
e.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400')
print(e)