ネット爬虫類の初級

2563 ワード

まず、PythonがWebページをキャプチャするライブラリを見てみましょう.urllibまたはurllib 2です.
ではurllibとurllib 2の違いは何でしょうか.
urllib 2をurllibの増幅と見なすことができ、比較的明らかな優位性はurllib 2である.urlopen()は、パラメータとしてRequestオブジェクトを受け入れることができ、HTTP Requestのヘッダ部を制御することができる.
HTTP Requestをするときはなるべくurllib 2ライブラリを使うべきですが、urllib.urlretrieve()関数およびurllib.quoteなどの一連のquoteやunquote機能はurllib 2に組み込まれていないため、urllibの補助が必要になる場合もある.
urllib.Open()ここで入力されるパラメータは、http、ftp、fileなど、いくつかのプロトコルに従います.例:
urllib.open('http://www.baidu.com')
urllib.open('file:D\Python\Hello.py')
Webサイト上のすべてのgif形式の画像をダウンロードする例があります.ではPythonコードは次のとおりです.
import re
import urllib

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

def getImg(html):
    reg = r'src="(.*?\.gif)"'
    imgre = re.compile(reg)
    imgList = re.findall(imgre,html)
    print imgList
    cnt = 1
    for imgurl in imgList:
        urllib.urlretrieve(imgurl,'%s.jpg' %cnt)
        cnt += 1

if __name__ == '__main__':
    html = getHtml('http://www.baidu.com')
    getImg(html)

上記の方法によれば、一定のページをキャプチャし、必要なデータを抽出することができます.
実際,urllibというモジュールを用いてネットワーク爬虫類を作るのは極めて効率的ではないが,Tornado Webサーバを紹介する.
Tornado web serverはPythonを使用して作成された軽量級、高伸縮性、非ブロックIOのWebサーバソフトウェアで、有名なFriendfeedサイトはそれを使用して構築されています.Tornadoは他の主流のWebサーバフレームワーク(主にPythonフレームワーク)とは異なり、epoll非ブロックIOを採用し、応答が迅速で、数千の同時接続を処理することができ、特にリアルタイムのWebサービスに適している.
Tornado WebサーバでWebページをキャプチャする方が効率的です.
Tornadoの公式サイトから見るとbackportsもインストールされています.ssl_match_hostname、公式サイトは以下の通りです.
http://www.tornadoweb.org/en/stable/
import tornado.httpclient

def Fetch(url):
    http_header = {'User-Agent' : 'Chrome'}
    http_request = tornado.httpclient.HTTPRequest(url=url,method='GET',headers=http_header,connect_timeout=200,request_timeout=600)
    print 'Hello'
    http_client = tornado.httpclient.HTTPClient()
    print 'Hello World'

    print 'Start downloading data...'
    http_response = http_client.fetch(http_request)
    print 'Finish downloading data...'

    print http_response.code

    all_fields = http_response.headers.get_all()
    for field in all_fields:
        print field

    print http_response.body

if __name__ == '__main__':
    Fetch('http://www.baidu.com')

 
 
urllib 2の一般的な方法:
 
(1)info()WebページのHeader情報の取得
(2)getcode()Webページのステータスコードを取得する
(3)geturl()受信したURLを取得する
(4)read()ファイルの内容を読み取る