Python クローラー - urllib ライブラリの使用 (get/post リクエスト + シミュレートされたタイムアウト/ブラウザ)

Python クローラー - urllib ライブラリの使用 (get/post リクエスト + シミュレートされたタイムアウト/ブラウザ)

1. Pythonクローラの動作手順

クローラーの概要: Web クローラーは、特定のルールに従ってインターネット情報を自動的に取得するプログラムまたはスクリプトです。インターネット データの多様性と限られたリソースのため、ユーザーのニーズに応じて関連する Web ページをクローリングおよび分析することがクローラーの役割です。

なぜそれをクモと呼ぶのでしょうか?インターネットは大きなネットワークのようなもので、各 Web ページはこの大きなネットワーク上の各ノードであり、これらのノード間の通信やジャンプはリンクを通じて実現され、このリンクがインターネットという大きなネットワーク上のノード間の接続となります。クローラーがノードに到達すると、このページの情報をクロールできることになり、これらの接続 (リンク) に沿って別のノード (Web ページ) をクロールすると、Web サイト全体の情報をクロールできます。

ブラウザ経由でアクセスできるデータがクローラー経由で取得できる限り

クローラーの主な仕事はWebページの情報を取得することであり、実際にはWebページを取得して情報を抽出・保存する自動プログラムです。そのワークフローはWebページの取得→情報の抽出→データの保存に分けられます。

1.1 Webページを取得する

クロールしたい Web ページのリンクを取得した後、最初に行う必要があるのは、HTML、CSS、およびいくつかの埋め込み JS コードで記述された Web ページのソース コードを取得することです。これらのコード情報には、必要な情報が含まれています。クロールをすること

Web ページのソース コードをどのように取得するか? これが問題の核心です。ユーザー (ブラウザ) としてこの Web サイトのサーバーにリクエストを送信すると、サーバーは Web ページのソース コードを返します。 Python では、完全なページを表示するために、この操作の実現に役立つ多くのライブラリが提供されています。ソース コードを取得した後、その中のデータに対して一連のデータ分析を行うことができます。

1.2 情報の抽出

ページのソース コードを取得した後、その中の情報の取得を開始し、Web ページのソース コードを分析してそこから情報を抽出する必要があります。情報を抽出するには正規表現を使用するか、Web ページのノード属性を使用します。情報を抽出する CSS セレクターまたは XPath ライブラリ: Beautiful Soup (美しいスープ)、pyquery、lxml など、これらのライブラリを通じて、Web ページのソース コードから Web ページ情報を抽出できます。

正規表現は構築が複雑でエラー耐性が低いため、あまり普及していません。むしろあまり役に立ちません。

1.3 データの保存

指定した情報を抽出した後、通常は後で使用するためにその情報を保存しますが、データを保存するときに最初に考えるのはデータベース MySQL と MongDB です。もちろん、単純に txt テキストまたは json テキストとして保存することもできます。

2. POST / GETリクエストを取得する

このパートでは、サーバーにリクエストを送信し、GET および POST の形式でレスポンスを取得する方法を見てみましょう。

2.1 GETリクエストの取得

urllib ライブラリのリクエスト オブジェクトには urlopen() メソッドがあり、Web ページを開いてサーバーにリクエストを送信してソース コードを取得するのに役立ちます。

urlopen メソッドによって返された情報を受け取る応答を定義し、read() メソッドを使用してソース コードを読み取ります。

response = urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode('utf-8'))

ここに画像の説明を挿入

urllib を使用してページにアクセスする場合は、返されたコンテンツをデコードするために decode() メソッドを使用することをお勧めします。これに対応して、encode() はエンコード方法を指定します。

2.2 POSTリクエストの取得

POST リクエストを取得するには、Web サイト http://httpbin.org を使用する必要があります。これはテスト用に特別に使用される Web サイトです。ポスト モードでこの Web サイトのサーバーにリクエストを送信すると、応答固有の情報

ここに画像の説明を挿入

これは、/post サフィックスを付けて http://httpbin.org にアクセスすると、post を通じて応答を取得することを意味し、post を直接使用することはできません。これは、このメソッドは通常、サーバーが次のようなフォーム情報を送信するために使用されるためです。アカウントのパスワードとして使用するため、フォーム情報を追加する必要があり、キーと値のペアを通じてフォーム情報を送信します。

次に、フォーム情報を解析するためのパーサーである urllib ライブラリのオブジェクト解析を見ていきます。これは、フォーム情報を配置するための urlencode() メソッドを提供し、また、指定されたエンコード属性も必要とします。これは、私たちにとって便利です。情報はエンコードされてサーバーに渡されます

data = bytes(urllib.parse.urlencode({
    
    "hello": "world"}), encoding="utf-8")    
# 需要使用urllib的parse对象,它是一个解析器,对我们的表单信息进行解析
response02 = urllib.request.urlopen("http://httpbin.org/post", data=data)
print(response02.read().decode('utf-8'))

ここに画像の説明を挿入

3. アクセスページのタイムアウトをシミュレートする

インターネット速度が制限されているか、クローラーであることが判明したため、長期間ページにアクセスしないことがあります。

# 模拟超时(网速有限或对方发现你是爬虫)
try:
    response03 = urllib.request.urlopen("http://httpbin.org/get", timeout=0.01)
    print(response03.read().decode('utf-8'))
except urllib.error.URLError as e:
    print("访问已超时 !!!!")

このタイムアウトはタイムアウト情報であり、ページへのアクセス時間がこの時間を超えるとアクセスタイムアウトとみなされ、その際Webサーバーが対応する動作を行う場合があります。

ここに画像の説明を挿入

4. 本物のブラウザのふりをする

しかし、一般的な Web サイトにはさまざまなクロール防止機構が備わっています。このとき、私たちはクローラーではないふりをする必要があります。私たちは本物のブラウザーであり、ユーザーです。通常のユーザーとしてページにアクセスすると、そのページに関する情報を取得できます。ページ

私たちがクローラーであることがサイトに知られると、418 ステータス コードが返されます。

# 响应头(被别人发现你是爬虫会爆418)
response04 = urllib.request.urlopen("http://httpbin.org/get")
print(response04.status)    
# 状态码,被别人发现你是爬虫会爆418
print(response04.getheader("Server"))   
# 这个就是浏览器在NetWork中response Header中的信息
# 在getHeader()中传入参数,例如Server,就会返回指定的信息

上記のコードでは、http://httpbin.org/get に get リクエストでアクセスしましたが、この Web ページのクロール防止メカニズムはそれほど厳密ではなく機密性が高いため、ソース コード情報は正常にクロールできます。

ここに画像の説明を挿入

でも、ウェブサイトを Douban に変更して試してみましょう

ここに画像の説明を挿入

ほら、これでは面子が失われ、HTTPErrorが出て、相手にクローラーであることがバレてしまいます

では、どうすれば相手に爬虫類であることがバレないのでしょうか?上で述べたように、ブラウザ(ユーザー)になりすまして、レスポンスを送信する際にサーバーに渡すべき情報を渡す必要があるのですが、このときサーバーは私を真面目なユーザーだと認識し、 Web ページ情報を通常どおりクロールします。アカウントとパスワードのフォーム情報を渡す必要がある Web ページの場合は、これらの情報を通常どおり渡すことでアクセスできます。

url = "http://httpbin.org/post"
headers = {
    
         # 注意键和值
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"
}
data = bytes(urllib.parse.urlencode({
    
    'name': 'MJJ'}), encoding="utf-8")
req = urllib.request.Request(url=url, data=data, headers=headers, method="POST")
# 上述就是我们的请求,内部包含了我们模拟的浏览器的信息
response05 = urllib.request.urlopen(req)
# User-Agent(用户代理)是最能体现的,这个在任意一个网页的Request-Header的User-Agent
print(response05.read().decode("utf-8"))

上記のコードは比較的完全なプロセスです。まず、基本 URL、つまりアクセスしたい URL が指定され、次にヘッダー情報が設定されます。ヘッダー情報はキーと値のペアの形式であることに注意してください。 data はデータ情報に対応します Req は URL、ヘッダー、データ、メソッドなどの情報を含むリクエストが定義されています このとき、Web ページの応答を取得したい場合は、req を置くことができますurlopen() メソッドでのリクエスト

ここに画像の説明を挿入


上記の内容は、ステーション B の IT 塾の Python 入門 + データ分析ビデオ シリーズおよび CSDN の記事「クローラの基本原理」から借用しました。

この記事が役に立った場合は、ワンクリックと 3 つのリンクでサポートしてください。

おすすめ

転載: blog.csdn.net/qq_50587771/article/details/123840479