ホームページ  >  記事  >  バックエンド開発  >  【Python】Webクローラ(5):urllib2の使い方詳細とWebサイト巡回手法

【Python】Webクローラ(5):urllib2の使い方詳細とWebサイト巡回手法

黄舟
黄舟オリジナル
2017-01-21 14:04:031090ブラウズ

先ほど urllib2 の簡単な紹介について説明しましたが、ここでは urllib2 の使用方法について詳しく説明します。


1.プロキシ設定

urllib2は、環境変数http_proxyを使用してデフォルトでHTTPプロキシを設定します。

環境変数の影響を受けずにプログラム内で Proxy を明示的に制御したい場合は、プロキシを使用できます。

新しい test14 を作成して単純なプロキシ デモを実装します:

import urllib2  
enable_proxy = True  
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})  
null_proxy_handler = urllib2.ProxyHandler({})  
if enable_proxy:  
    opener = urllib2.build_opener(proxy_handler)  
else:  
    opener = urllib2.build_opener(null_proxy_handler)  
urllib2.install_opener(opener)

ここで注意すべき点の 1 つは、urllib2.install_opener() を使用すると、urllib2 のグローバル オープナーが設定されることです。

これは後で使用する場合に非常に便利ですが、プログラム内で 2 つの異なる Proxy 設定を使用したい場合など、より詳細な制御はできません。

より良いアプローチは、グローバル設定を変更するために install_opener を使用するのではなく、グローバル urlopen メソッドの代わりにオープナーの open メソッドを直接呼び出すことです。


2. タイムアウト設定
Python の古いバージョン (Python 2.6 より前) では、urllib2 の API はタイムアウト設定を公開していません。タイムアウト値を設定するには、ソケットのグローバル タイムアウト値を変更することしかできません。

import urllib2  
import socket  
socket.setdefaulttimeout(10) # 10 秒钟后超时  
urllib2.socket.setdefaulttimeout(10) # 另一种方式

Python 2.6 以降では、urllib2.urlopen() の timeout パラメーターを通じてタイムアウトを直接設定できます。

import urllib2  
response = urllib2.urlopen('http://www.google.com', timeout=10)

3. HTTP リクエストに特定のヘッダーを追加します

ヘッダーを追加するには、Request オブジェクトを使用する必要があります:

import urllib2  
request = urllib2.Request('http://www.baidu.com/')  
request.add_header('User-Agent', 'fake-client')  
response = urllib2.urlopen(request)  
print response.read()

一部のヘッダーには特に注意してください。サーバーはこれらのヘッダーをチェックします
ユーザーエージェント:一部のサーバーまたはプロキシは、この値を使用して、リクエストがブラウザーによって行われたかどうかを判断します。
Content-Type: REST インターフェイスを使用する場合、サーバーはこの値をチェックして、HTTP 本文のコンテンツをどのように解析するかを決定します。一般的な値は次のとおりです:
application/xml: RESTful/SOAP などの XML RPC を呼び出すときに使用されます
application/json: JSON RPC を呼び出すときに使用されます
application/x-www-form-urlencoded: ブラウザーが Web フォームを送信するときに使用しますサーバーが提供する RESTful または SOAP サービスを使用する場合、誤った Content-Type 設定によりサーバーがサービスを拒否します



4。Redirect

urllib2 は HTTP 3XX リターン コードに対してリダイレクト アクションを自動的に実行します。デフォルトでは、手動構成は必要ありません。リダイレクト アクションが発生したかどうかを検出するには、レスポンスの URL とリクエストの URL が一致しているかどうかを確認するだけです。

import urllib2  
my_url = 'http://www.google.cn'  
response = urllib2.urlopen(my_url)  
redirected = response.geturl() == my_url  
print redirected  
  
my_url = 'http://rrurl.cn/b1UZuP'  
response = urllib2.urlopen(my_url)  
redirected = response.geturl() == my_url  
print redirected

自動的にリダイレクトしたくない場合は、下位レベルの httplib ライブラリを使用することに加えて、HTTPRedirectHandler クラスをカスタマイズすることもできます。


import urllib2  
class RedirectHandler(urllib2.HTTPRedirectHandler):  
    def http_error_301(self, req, fp, code, msg, headers):  
        print "301"  
        pass  
    def http_error_302(self, req, fp, code, msg, headers):  
        print "303"  
        pass  
  
opener = urllib2.build_opener(RedirectHandler)  
opener.open('http://rrurl.cn/b1UZuP')

5.Cookie

urllib2 も Cookie を自動的に処理します。 Cookie 項目の値を取得する必要がある場合は、次のようにすることができます:

import urllib2  
import cookielib  
cookie = cookielib.CookieJar()  
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))  
response = opener.open('http://www.baidu.com')  
for item in cookie:  
    print 'Name = '+item.name  
    print 'Value = '+item.value

実行後、Baidu にアクセスするための Cookie 値が出力されます:

【Python】Webクローラ(5):urllib2の使い方詳細とWebサイト巡回手法

6. HTTP PUT メソッドと DELETE メソッド

urllib2 のみを使用します。 HTTP GET および POST メソッドをサポートしていますが、HTTP PUT および DELETE を使用する場合は、下位レベルの httplib ライブラリのみを使用できます。それでも、次の方法で urllib2 が PUT または DELETE リクエストを発行できるようにすることができます:

import urllib2  
request = urllib2.Request(uri, data=data)  
request.get_method = lambda: 'PUT' # or 'DELETE'  
response = urllib2.urlopen(request)

7. HTTP リターン コードを取得します

200 OK の場合は、urlopen メソッドによって返された応答オブジェクトの getcode() を使用して取得します。 HTTP 戻りコード。ただし、他の戻りコードの場合、urlopen は例外をスローします。このとき、例外オブジェクトの code 属性を確認する必要があります:

import urllib2  
try:  
    response = urllib2.urlopen('http://bbs.csdn.net/why')  
except urllib2.HTTPError, e:  
    print e.code

8.デバッグログ

urllib2 を使用する場合、以下のメソッドでデバッグログを開くことができ、送受信の内容が確認できます。パケットは画面に表示され、デバッグに便利です。場合によっては、パケット キャプチャの作業を保存できます

import urllib2  
httpHandler = urllib2.HTTPHandler(debuglevel=1)  
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)  
opener = urllib2.build_opener(httpHandler, httpsHandler)  
urllib2.install_opener(opener)  
response = urllib2.urlopen('http://www.google.com')

このようにして、送信されたデータ パケットの内容を確認できます:

【Python】Webクローラ(5):urllib2の使い方詳細とWebサイト巡回手法


9。フォーム処理

ログインするにはフォームへの記入が必要ですが、フォームへの記入方法は?

まず、ツールを使用して、入力するフォームのコンテンツを傍受します。

たとえば、私は通常、Firefox + httpfox プラグインを使用して、送信したパッケージを確認します。
verycd を例として考えます。まず、送信した POST リクエストと POST フォーム項目を見つけます。
verycd の場合、username、password、 continueURI、fk、login_submit を入力する必要があることがわかります。このうち、fk はランダムに生成されます (実際にはそれほどランダムではなく、単にエポックタイムをエンコードすることによって生成されているように見えます)。 「Web ページの取得から開始する必要がある」とは、最初に Web ページにアクセスし、正規表現などのツールを使用して、返されたデータ内の fk 項目をインターセプトする必要があることを意味します。名前の通り、 continueURI は気軽に書けるのに対し、login_submit は固定であることがソースコードからも分かります。ユーザー名とパスワードもありますが、これは明白です:

# -*- coding: utf-8 -*-  
import urllib  
import urllib2  
postdata=urllib.urlencode({  
    'username':'汪小光',  
    'password':'why888',  
    'continueURI':'http://www.verycd.com/',  
    'fk':'',  
    'login_submit':'登录'  
})  
req = urllib2.Request(  
    url = 'http://secure.verycd.com/signin',  
    data = postdata  
)  
result = urllib2.urlopen(req)  
print result.read()

10. ブラウザに偽装してアクセスします

一部の Web サイトはクローラーの訪問を嫌うため、クローラーからのリクエストを拒否します
現時点では、ブラウザに偽装する必要があります。 、これは、

#…  
  
headers = {  
    'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'  
}  
req = urllib2.Request(  
    url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/',  
    data = postdata,  
    headers = headers  
)  
#...

11 を達成するために http パッケージのヘッダーを変更することで実行できます。「アンチホットリンク」に対処するには

一部のサイトには、いわゆるアンチホットリンク設定があります。実際、それを行うのは非常に簡単です。率直に言って、


それはあなたが送信するリクエストのヘッダーをチェックするためです、それはそれ自身のリファラーサイトです

それで、私たちはこのウェブサイトへのヘッダーのリファラーを変更するだけで済みます:

#...
headers = {
    'Referer':'http://www.cnbeta.com/articles'
}
#...


headers は dict データ構造で、好きなものを入れることができます。必須のヘッダーは、何らかの偽装を行うために使用されます。

たとえば、一部の Web サイトはヘッダーの X-Forwarded-For を読み取り、実際の IP を確認することを好み、X-Forwarde-For を直接変更できます。

上記は、[Python] Web クローラー (5): urllib2 の使用方法の詳細と Web サイトのクローリング技術です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


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