1件のリクエスト
RequestsはPythonでHTTPリクエストを実装する方法です。Requestsはサードパーティのモジュールです。このモジュールは、HTTPリクエストを実装するためのurlibおよびurllib3モジュールよりもはるかに単純であり、操作はよりユーザーフレンドリーです。
2基本的なリクエスト方法
リクエストモジュールはサードパーティのモジュールであるため、リクエストモジュールを使用する場合は、「pipinstallrequests」コードを実行してモジュールをインストールする必要があります。
Anacondaを使用する場合、requestsモジュールを個別にインストールする必要はありません。
2.1リクエストがGETリクエストを送信してWebサイトページを取得する場合、文字化けを防ぐためにエンコーディングを設定します
import requests # 导入网络请求模块requests
# 发送网络请求
response = requests.get('https://www.baidu.com')
print('响应状态码:',response.status_code) # 响应状态码: 200
print('请求网络地址',response.url) # 请求网络地址 https://www.baidu.com/
print('头部信息',response.headers) # 头部信息 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 28 Mar 2022 13:01:40 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
print('cookie信息',response.cookies) # cookie信息 <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
response.encoding = 'utf-8' # 设置编码 防止乱码
print(response.text) # 文本的形式打印
2.2リクエストモジュールは画像情報を取得して保存します
import requests # 导入网络请求模块requests
# 发送网络请求,下载百度logo
response = requests.get('https://www.baidu.com/img/bd_logo1.png')
print(response.content) # 打印二进制数据
with open('百度logo.png','wb')as f: # 通过open函数将二进制数据写入本地文件
f.write(response.content) # 写入
2.3リクエストモジュールのPOSTリクエスト
import requests # 导入网络请求模块requests
import json # 导入json模块
# 字典类型的表单参数
data = {'1':'好运常伴',
'2':'平安喜乐'}
# 发送网络请求
response = requests.post('http://httpbin.org/post',data=data)
response_dict = json.loads(response.text) # 将响应数据转换为字典类型
print(response_dict) # 打印转换后的响应数据
3高度なリクエスト方法
リクエストモジュールは、複雑なリクエストヘッダー、Cookie、ネットワークタイムアウトリクエストメソッドを簡素化します。リクエストの送信時に対応するパラメータが設定されている限り、複雑なネットワークリクエストを実装できます。
3.1リクエストヘッダーを設定する
Webページのコンテンツをリクエストすると、GETまたはPOSTやその他のリクエストメソッドを介して403エラーが発生することがわかりました。その理由は、ヘッダー情報を検出することで悪意のある収集が防止されるため、サーバーがユーザーのアクセスを拒否するためです。解決策:アクセスするブラウザーのヘッダー情報をシミュレートします。
3.1.1コードの実装:リクエストモジュールはリクエストヘッダーを設定します
import requests # 导入网络请求模块requests
url = 'https://www.baidu.com/' # 创建需要爬取网页的地址
# 创建头部信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'}
response = requests.get(url, headers=headers) # 发送网络请求
print(response.status_code) # 打印响应状态码 200
3.2クッキーを取得する
一部のデータをクロールする場合、データクロール作業を実行する前にWebページにログインする必要があります。Cookieログインは、多くのWebページの自動ログイン機能に似ており、ユーザーは2回目のログイン時にアカウント番号とパスワードを確認せずに直接ログインできます。
リクエストモジュールを使用してCookieログインを実装する場合、最初にブラウザの開発者ツールページでログインを実現できるCookie情報を見つけ、次にCookie情報を処理してRequestsCookieJarオブジェクトに追加し、最後にRequestsCookieJarオブジェクトをCookieパラメータとして使用しますネットワークリクエストの、ネットワークリクエストを送信することができます。
3.2.1コードの実装:リクエストモジュールはCookieを取得します
import requests # 导入网络请求模块
from lxml import etree # 导入lxml模块
cookies = '此处填写登录后网页中的cookie信息'
headers = {'Host': 'www.XXXXX.com',
'Referer': 'https://www.baidu.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/72.0.3626.121 Safari/537.36'}
# 创建RequestsCookieJar对象,用于设置cookies信息
cookies_jar = requests.cookies.RequestsCookieJar()
for cookie in cookies.split(';'):
key, value = cookie.split('=', 1)
cookies_jar.set(key, value) # 将cookies保存RequestsCookieJar当中
# 发送网络请求
response = requests.get('https://www.douban.com/',headers=headers, cookies=cookies_jar)
if response.status_code == 200: # 请求成功时
html = etree.HTML(response.text) # 解析html代码
# 获取用户名
name = html.xpath('//*[@id="db-global-nav"]/div/div[1]/ul/li[2]/a/span[1]/text()')
print(name[0]) # 打印用户名
3.3セッションリクエスト
クッキーを設定する方法は、最初にシミュレートされたログインを実現し、次に記録されたページの情報コンテンツを取得しますが、これはかなり面倒です。
3.3.1セッションリクエスト機能
リクエストモジュールのSessionオブジェクトは、同じセッション内で複数のネットワークリクエストを送信することを実装します。つまり、ログインしたオブジェクトを作成し、オブジェクトのプロパティでログイン操作を実行します。ログインが完了すると、オブジェクトは正常にログインしたシミュレートされたユーザーであり、データを収集するための要求を自由に送信できます。
3.3.1コードの実装:モジュールセッション要求を要求します
import requests # 导入requests模块
# 原理:使用同一个对象获取,分别从这个对象读取不同的页面信息
s = requests.Session() # 创建会话对象
data={'username': 'LiBiGor', 'password': '123456'} # 创建用户名、密码的表单数据
# 发送登录请求
response_1 = s.post('http://site.XXXX.com:8001/index/checklogin.html',data=data)
response_2 = s.get('http://site.XXXX.com:8001') # 发送登录后页面请求
print('登录信息:',response_1.text) # 打印登录信息
print('登录后页面信息如下:\n',response_2.text) # 打印登录后的页面信息
3.4リクエストページを確認する
3.4.1認証要求の簡単な説明
記事を表示すると、悪意のあるクロールを防ぐために、ログインアカウントのパスワードを要求するポップアップが突然ポップアップ表示されます。
リクエストモジュールには認証機能が付属しています。リクエストメソッドにauthパラメータを入力するだけで済みます。このパラメータの値は、認証パラメータ(ユーザー名とパスワード)を持つHTTPBasicAuthオブジェクトです。
3.4.2コードの実装:リクエストモジュールは検証リクエストを解決します
import requests # 导入requests模块
from requests.auth import HTTPBasicAuth # 导入HTTPBasicAuth类
url = 'http://sck.XXX.com:8001/spider/auth/' # 定义请求地址
ah = HTTPBasicAuth( 'LiBiGor', '123456') #创建HTTPBasicAuth对象,参数为用户名与密码
response = requests.get(url=url,auth=ah) # 发送网络请求
if response.status_code==200: # 如果请求成功
print(response.text) # 打印验证后的HTML代码
3.5ネットワークタイムアウトと例外
Webページにアクセスしたときに、Webページが長時間応答しない場合、システムはWebページがタイムアウトしたと判断するため、Webページを開くことができません。
3.5.1コードの実装:リクエストモジュールはタイムアウト例外をシミュレートします
import requests # 导入网络请求模块
# 循环发送请求50次
for a in range(0, 50):
try: # 捕获异常
# 设置超时为0.5秒
response = requests.get('https://www.baidu999.com/', timeout=0.1)
print(response.status_code) # 打印状态码
except Exception as e: # 捕获异常
print('异常'+str(e)) # 打印异常信息
3.5.2コードの実装:リクエストモジュールがネットワークの異常を判断する
import requests # 导入网络请求模块
# 导入requests.exceptions模块中的三种异常类
from requests.exceptions import ReadTimeout,HTTPError,RequestException
# 循环发送请求50次
for a in range(0, 50):
try: # 捕获异常
# 设置超时为0.1秒
response = requests.get('https://www.baidu999.com/', timeout=0.1)
print(response.status_code) # 打印状态码
except ReadTimeout: # 超时异常
print('timeout')
except HTTPError: # HTTP异常
print('httperror')
except RequestException: # 请求异常
print('reqerror')
3.6ファイルのアップロード
3.6.1画像ファイルのアップロード
リクエストモジュールを使用してファイルをサーバーにアップロードすることも非常に簡単です。post()関数でfilesパラメーターを指定するだけで、組み込みのopen()関数を使用して返すことができるBufferedReaderオブジェクトを指定できます。
3.6.2コードの実装:リクエストモジュールは画像ファイルをアップロードします
import requests # 导入网络请求模块
bd = open('百度logo.png','rb') # 读取指定文件
file = {'file':bd} # 定义需要上传的图片文件
# 发送上传文件的网络请求
response = requests.post('http://httpbin.org/post',files = file)
print(response.text) # 打印响应结果
3.7IPプロキシを設定する
Webページをクロールするプロセスでは、WebサイトをクロールするサーバーによってIPがブロックされ、多くの場合、障害が発生します。現時点では、プロキシサービスでこの問題を解決できます。プロキシを設定するときは、最初にプロキシアドレスを見つける必要があります。
たとえば、1788.176.38に対応するポート番号は3000で、完全な形式は117.88.176.38:3000です。
3.7.1 コードの実装:リクエストモジュールはIPプロキシを設定します
import requests # 导入网络请求模块
# 头部信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/72.0.3626.121 Safari/537.36'}
proxy = {'http': 'http://117.88.176.38:3000',
'https': 'https://117.88.176.38:3000'} # 设置代理ip与对应的端口号
try:
# 对需要爬取的网页发送请求
response = requests.get('http://baidu.com', headers= headers,proxies=proxy,verify=False,timeout=3)
print(response.status_code) # 打印响应状态码
except Exception as e:
print('错误异常信息为:',e) # 打印异常信息