ホームページ  >  記事  >  バックエンド開発  >  [Python] Web クローラー (2): urllib2 を使用して、指定された URL を通じて Web コンテンツをクロールします。

[Python] Web クローラー (2): urllib2 を使用して、指定された URL を通じて Web コンテンツをクロールします。

黄舟
黄舟オリジナル
2017-01-21 13:47:431629ブラウズ

バージョン番号: Python2.7.5、Python3 には大きな変更があります。別のチュートリアルを探してください。

いわゆるWebページのクローリングとは、URLアドレスで指定されたネットワークリソースをネットワークストリームから読み取り、ローカルに保存することです。
IEブラウザの機能をシミュレートするプログラムと同様に、HTTPリクエストの内容としてURLがサーバーに送信され、サーバーの応答リソースが読み取られます。


Python では、urllib2 コンポーネントを使用して Web ページをクロールします。
urllib2 は、URL (Uniform Resource Locators) を取得する Python のコンポーネントです。

urlopen 関数の形式で非常にシンプルなインターフェイスを提供します。

最も単純な urllib2 アプリケーション コードには 4 行しか必要ありません。

urllib2 の役割を確認するために新しいファイル urllib2_test01.py を作成します:

import urllib2  
response = urllib2.urlopen('http://www.baidu.com/')  
html = response.read()  
print html

F5 を押して操作の結果を確認します:

[Python] Web クローラー (2): urllib2 を使用して、指定された URL を通じて Web コンテンツをクロールします。


Baidu ホームページを右クリックして開きます。 [ソース コードの表示] (Firefox または Google Chrome) を選択すると、まったく同じコンテンツが表示されます。

言い換えると、上記の 4 行のコードは、Baidu にアクセスしたときにブラウザーが受信したすべてのコードを出力します。

これは urllib2 の最も単純な例です。


URLは「http:」の他に「ftp:」や「file:」などにも置き換えることができます。

HTTP はリクエストとレスポンスのメカニズムに基づいています:

クライアントがリクエストを作成し、サーバーがレスポンスを提供します。


urllib2 は、Request オブジェクトを使用して、作成した HTTP リクエストをマップします。

その最も単純な使用形式では、リクエストするアドレスを含む Request オブジェクトを作成します。

urlopen を呼び出して Request オブジェクトを渡すと、関連するリクエスト応答オブジェクトが返されます。

この応答オブジェクトは次のとおりです。ファイル オブジェクトと同様なので、応答で .read() を呼び出すことができます。

新しいファイル urllib2_test02.py を作成して体験してみましょう:

import urllib2    
req = urllib2.Request('http://www.baidu.com')    
response = urllib2.urlopen(req)    
the_page = response.read()    
print the_page

出力内容が test01 と同じであることがわかります。

urllib2 は、同じインターフェースを使用してすべての URL ヘッダーを処理します。たとえば、次のような FTP リクエストを作成できます。

req = urllib2.Request('ftp://example.com/')

HTTP リクエストを行うときに、さらに 2 つのことを行うことができます。


1. データ フォーム データを送信する

この内容は、Web 側を担当したことがある方にはよく知られていると思います

場合によっては、URL にデータを送信する必要があります (通常、URL は CGI に関連しています)。 [Common Gateway Interface] スクリプト、またはその他の WEB アプリケーション フック)。

HTTP では、これはよく知られた POST リクエストを使用して送信されることがよくあります。

これは通常、HTML フォームを送信するときにブラウザーによって行われます。

すべての POST がフォームから発生するわけではありません。POST を使用して任意のデータを独自のプログラムに送信できます。

一般的な HTML フォームの場合、データを標準フォームにエンコードする必要があります。次に、それをデータ パラメーターとして Request オブジェクトに渡します。

エンコード作業では、urllib2 の代わりに urllib 関数を使用します。

新しいファイル urllib2_test03.py を作成して体験してみましょう:

import urllib    
import urllib2    
  
url = 'http://www.someserver.com/register.cgi'    
    
values = {'name' : 'WHY',    
          'location' : 'SDU',    
          'language' : 'Python' }    
  
data = urllib.urlencode(values) # 编码工作  
req = urllib2.Request(url, data)  # 发送请求同时传data表单  
response = urllib2.urlopen(req)  #接受反馈的信息  
the_page = response.read()  #读取反馈的内容


data パラメーターが送信されない場合、urllib2 は GET リクエストを使用します。

GET リクエストと POST リクエストの違いは、POST リクエストには通常「副作用」があることです。

何らかの方法でシステムの状態を変更します (ゴミの山を玄関に送り込むなど)。

データは、Get リクエスト内の URL 自体にエンコードして送信することもできます。

import urllib2    
import urllib  
  
data = {}  
  
data['name'] = 'WHY'    
data['location'] = 'SDU'    
data['language'] = 'Python'  
  
url_values = urllib.urlencode(data)    
print url_values  
  
name=Somebody+Here&language=Python&location=Northampton    
url = 'http://www.example.com/example.cgi'    
full_url = url + '?' + url_values  
  
data = urllib2.open(full_url)

このようにして、DataデータのGet送信が実現されます。



2. ヘッダーを http リクエストに設定する

サイトによっては、プログラムによるアクセス (人間以外のアクセス) を好まないサイトや、異なるバージョンのコンテンツを異なるブラウザに送信するサイトがあります。

デフォルトの urllib2 は、それ自体を「Python-urllib/x.y」として識別します (x と y は、Python-urllib/2.7 などの Python のメジャー バージョン番号とマイナー バージョン番号です)、

この ID はサイトを混乱させるか、単に機能しない可能性があります。

ブラウザは、User-Agent ヘッダーを通じてその身元を確認します。リクエスト オブジェクトを作成するときに、ヘッダー データを含むディクショナリを与えることができます。

以下の例は上記と同じコンテンツを送信しますが、それ自体を Internet Explorer としてシミュレートします。

(皆さんに思い出していただきありがとうございます。このデモはもう利用できませんが、原則は同じです)。

import urllib    
import urllib2    
  
url = 'http://www.someserver.com/cgi-bin/register.cgi'  
  
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    
values = {'name' : 'WHY',    
          'location' : 'SDU',    
          'language' : 'Python' }    
  
headers = { 'User-Agent' : user_agent }    
data = urllib.urlencode(values)    
req = urllib2.Request(url, data, headers)    
response = urllib2.urlopen(req)    
the_page = response.read()

上記は、[Python] Web クローラー (2): urllib2 を使用して、指定された URL を通じて Web コンテンツをクロールする方法です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。