Chapter 3初のネット爬虫類
6260 ワード
1.1ネットワーク爬虫類とその応用
ネットワーク爬虫類は安州のある一定の規則であり、自動的に万次元ネットワーク情報をキャプチャするプログラムとスクリプトである.
ネットワーク爬虫類はシステム構造と実現技術によって、大まかに分けることができる:汎用ネットワーク爬虫類、フォーカスネットワーク爬虫類、増量式ネットワーク爬虫類、深層ネットワーク爬虫類.
従来の汎用検索エンジンは汎用爬虫類に属している.
フォーカス爬虫類:Webページを自動的にダウンロードできるプログラムで、既定のキャプチャ目標に基づいて、インターネット上のWebページと関連する接続に選択的にアクセスし、必要な情報を取得します.
インクリメンタルネットワーク爬虫類:Webページをダウンロードするためにインクリメンタル更新を行い、新しく生成されたまたは変化したWebページだけを爬虫類に対して、爬虫類ができるだけ新しいページであることをある程度保証することができます.しかし,爬行アルゴリズムの複雑さと実現の難しさを増した.
深層ネットワーク爬虫類:深層ネットワークのデータを這い出すことができます.
1.2ネットワーク爬虫構造
1)まず、入念に選んだシードURLの一部を選択
2)これらのURLを取り込むURLキューに入れる
3)キャプチャ対象URLキューからキャプチャ対象キューのURLを読み出し、DNSを解析し、ホストのIPを取得し、URLに対応するウェブページをダウンロードしてダウンロードするウェブライブラリに格納し、また、これらのURLをキャプチャ済みURLキューに格納する
4)キャプチャされたURLキュー内のURLを解析し、ダウンロードされたウェブデータから他のURLを解析し、キャプチャされたURLと比較してデリフティングし、最後にデリフティングされたURLをキャプチャされるべきURLキューに入れて次のループに進む.
2.3より人間的なReuqests
前の2つの実装方式(urlib 2/urlib httplib/urlib)は時間関係のため大まかな理解しか行われていないが,以下ではRequests方式に重点を置いて説明する.
Requestsはサードパーティ製ライブラリなのでインストールが必要です.
1.まず、完全な要求と応答モデルを実現する.
GETを例にとると、最も簡単な形式は以下の通りである.
次はPOSTリクエストです.
次に、少し複雑な方法を説明します.似たようなURLを見たことがあります.http://zzk.cnblogs.com/s/blogpost?Keywords=blog:qiyeboy&pageindex=1ああ、URLの後ろに「?」と続いていて、“?”後にパラメータがついてきますが、このようなGETリクエストはどのように送信しますか?例は次のとおりです.
2.応答と符号化
本の上でtextの出力の結果は文字化けしていると言っていますが、私が見た出力は文字化けしていません...Bサイトの文字コードはすでにutf-8なので、utf-8にコードする必要はありません.正しいかどうかは検討しなければなりません.
chardetが検出する符号化を直接r.encodingに与えて復号を実現する.text出力は文字化けしません
上記のようなすべての応答を直接取得する方法に加えて、次のようなストリームモードがあります.
3.要求ヘッダheaders処理
Requestsのheadersに対する処理はurllib 2とよく似ています.Requestsのget関数にheadersパラメータを追加すればいいです.例は次のとおりです.
4.レスポンスコードcodeとレスポンスヘッダheaders処理
レスポンスコードを取得するには、Requestsのstatus_を使用します.codeフィールド、取得応答ヘッダはRequestsのheadersフィールドを使用します.例は次のとおりです.
5.Cookie処理
応答にCookie値が含まれている場合、以下のようにCookieフィールドの値を取得できます.
Cookie値をカスタマイズして送信する場合は、次の方法を使用します.
さらに高度で、Cookieを自動的に処理できる方法もあります.Cookie値がどれだけあるかに関心を持つ必要はありません.ただ、アクセスするたびに自動的にCookieを持っていきたいだけです.Requestsはsessionの概念を提供します.例は次のとおりです.
6.リダイレクトと履歴情報
リダイレクトを処理するには、設定する必要があります.allow_redirectsフィールド、例えばr=requestss.get('http://www.baidu.com'.allow_redirects=True).すべてをredirectsがTrueに設定されている場合はリダイレクトが許可され、リダイレクトが許可されている場合はr.historyフィールドで履歴メッセージを表示できます.すなわち、成功する前に、次のようなジャンプメッセージがすべて表示されます.
7.タイムアウト設定
タイムアウトオプションは、パラメータtimeoutによって設定されます.例は次のとおりです.
requests.get('http://github.com',timeout=2)
8.エージェントの設定
プロキシProxyを使用すると、任意のリクエストメソッドに対してproxiesパラメータを設定することで、リクエストを構成できます.
ネットワーク爬虫類は安州のある一定の規則であり、自動的に万次元ネットワーク情報をキャプチャするプログラムとスクリプトである.
ネットワーク爬虫類はシステム構造と実現技術によって、大まかに分けることができる:汎用ネットワーク爬虫類、フォーカスネットワーク爬虫類、増量式ネットワーク爬虫類、深層ネットワーク爬虫類.
従来の汎用検索エンジンは汎用爬虫類に属している.
フォーカス爬虫類:Webページを自動的にダウンロードできるプログラムで、既定のキャプチャ目標に基づいて、インターネット上のWebページと関連する接続に選択的にアクセスし、必要な情報を取得します.
インクリメンタルネットワーク爬虫類:Webページをダウンロードするためにインクリメンタル更新を行い、新しく生成されたまたは変化したWebページだけを爬虫類に対して、爬虫類ができるだけ新しいページであることをある程度保証することができます.しかし,爬行アルゴリズムの複雑さと実現の難しさを増した.
深層ネットワーク爬虫類:深層ネットワークのデータを這い出すことができます.
1.2ネットワーク爬虫構造
1)まず、入念に選んだシードURLの一部を選択
2)これらのURLを取り込むURLキューに入れる
3)キャプチャ対象URLキューからキャプチャ対象キューのURLを読み出し、DNSを解析し、ホストのIPを取得し、URLに対応するウェブページをダウンロードしてダウンロードするウェブライブラリに格納し、また、これらのURLをキャプチャ済みURLキューに格納する
4)キャプチャされたURLキュー内のURLを解析し、ダウンロードされたウェブデータから他のURLを解析し、キャプチャされたURLと比較してデリフティングし、最後にデリフティングされたURLをキャプチャされるべきURLキューに入れて次のループに進む.
2.3より人間的なReuqests
前の2つの実装方式(urlib 2/urlib httplib/urlib)は時間関係のため大まかな理解しか行われていないが,以下ではRequests方式に重点を置いて説明する.
Requestsはサードパーティ製ライブラリなのでインストールが必要です.
1.まず、完全な要求と応答モデルを実現する.
GETを例にとると、最も簡単な形式は以下の通りである.
import requests
r=requests.get('http://www.baidu.com')
print r.content
次はPOSTリクエストです.
import requests
postdata={'key':'value'}
r=requests.post{'http://www.xxxxx.com/login' data=postdata}
print r.content
次に、少し複雑な方法を説明します.似たようなURLを見たことがあります.http://zzk.cnblogs.com/s/blogpost?Keywords=blog:qiyeboy&pageindex=1ああ、URLの後ろに「?」と続いていて、“?”後にパラメータがついてきますが、このようなGETリクエストはどのように送信しますか?例は次のとおりです.
import requests
payload={'Keywords':'blog:qiyeboy','pageindex':1}
r=requests.get('http://zzk.cnblogs.com/s/blogpost',params=payload)
print r.url
2.応答と符号化
import requests
r=requests.get('http://www.zhihu.com')
print 'content-->'+r.content
print 'text-->'+r.text
print 'encoding-->'+r.encoding
r.encoding='utf-8'
print 'new text-->'+r.text
本の上でtextの出力の結果は文字化けしていると言っていますが、私が見た出力は文字化けしていません...Bサイトの文字コードはすでにutf-8なので、utf-8にコードする必要はありません.正しいかどうかは検討しなければなりません.
import requests,chardet
r=requests.get('http://www.baidu.com')
print chardet.detect(r.content)
r.encoding=chardet.detect(r.content)['encoding']
print r.text
chardetが検出する符号化を直接r.encodingに与えて復号を実現する.text出力は文字化けしません
上記のようなすべての応答を直接取得する方法に加えて、次のようなストリームモードがあります.
import requests
r=requests.get('http://www.baidu.com',stream=True)
print r.raw.read(10)
3.要求ヘッダheaders処理
Requestsのheadersに対する処理はurllib 2とよく似ています.Requestsのget関数にheadersパラメータを追加すればいいです.例は次のとおりです.
import requests
user_agent ='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
r=requests.get('http://www.baidu.com',headers=headers)
print r.content
4.レスポンスコードcodeとレスポンスヘッダheaders処理
レスポンスコードを取得するには、Requestsのstatus_を使用します.codeフィールド、取得応答ヘッダはRequestsのheadersフィールドを使用します.例は次のとおりです.
#coding:utf-8
import requests
r=requests.get('http://www.baidu.com')
if r.status_code==requests.codes.ok:
print r.status_code #
print r.headers#
print r.headers.get('content-type')# ,
print r.headers['content-type']#
else:
r.raise_for_status()
5.Cookie処理
応答にCookie値が含まれている場合、以下のようにCookieフィールドの値を取得できます.
#coding:utf-8
import requests
user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
r=requests.get('http://www.baidu.com',headers=headers)
# Cookie
for cookie in r.cookies.keys():
print cookie+':'+r.cookies.get(cookie)
Cookie値をカスタマイズして送信する場合は、次の方法を使用します.
import requests
user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
cookies=dict(name='qiye',age='10')
r=requests.get('http://www.baidu.com',headers=headers,cookies=cookies)
print r.text
さらに高度で、Cookieを自動的に処理できる方法もあります.Cookie値がどれだけあるかに関心を持つ必要はありません.ただ、アクセスするたびに自動的にCookieを持っていきたいだけです.Requestsはsessionの概念を提供します.例は次のとおりです.
import requests
loginUrl='http://www.xxxxx.com/login'
s=requests.Session()# , Cookie
r=s.get(loginUrl,allow_redirects=True)
datas={'name0:'qiye','passwd:':'qiye'}
# post , ,
r=s.post(loginUrl,data=datas,allow_redirects=True)
print r.text
6.リダイレクトと履歴情報
リダイレクトを処理するには、設定する必要があります.allow_redirectsフィールド、例えばr=requestss.get('http://www.baidu.com'.allow_redirects=True).すべてをredirectsがTrueに設定されている場合はリダイレクトが許可され、リダイレクトが許可されている場合はr.historyフィールドで履歴メッセージを表示できます.すなわち、成功する前に、次のようなジャンプメッセージがすべて表示されます.
import requests
r=requests.get('http://www.github.com')
print r.url
print r.status_code
print r.history
7.タイムアウト設定
タイムアウトオプションは、パラメータtimeoutによって設定されます.例は次のとおりです.
requests.get('http://github.com',timeout=2)
8.エージェントの設定
プロキシProxyを使用すると、任意のリクエストメソッドに対してproxiesパラメータを設定することで、リクエストを構成できます.
import requests
proxies={
"http": "http://0.10.1.10:3128",
"https": "http"//10.10.1.10:1080",
}
requests.get("http://example.org",proxies=proxies)
小結:本章では主にネットワーク爬虫類の構造と応用,およびPythonがHTTP要求を実現するためのいくつかの方法について説明した.本章のネットワークワームワークフローとRequestsによるHTTPリクエストの実現方法を重点的に吸収・消化してほしい