Python Webクローラー(練習)

01 Webページをすばやくクロールする

1.1 urlopen()関数##

import urllib.request
file=urllib.request.urlopen("http://www.baidu.com")
data=file.read()
fhandle=open("./1.html","wb")
fhandle.write(data)
fhandle.close()

コンテンツを読む一般的な方法は3つあり、使用法は次のとおりです。
file.read()はファイルのコンテンツ全体を読み取り、読み取ったコンテンツを文字列変数に割り当てます。
file.readlines()はファイルのコンテンツ全体を読み取り、読み取ったコンテンツをリスト変数に割り当てます。
file.readline()はファイルの行を読み取ります

1.2 urlretrieve()関数##

urlretrieve()関数は、対応する情報をローカルファイルに直接書き込むことができます。

import urllib.request
filename=urllib.request.urlretrieve("http://edu.51cto.com",filename="./1.html")
# urlretrieve()実行プロセス中に、いくつかのキャッシュが生成されます。urlcleanupを使用できます。()掃除
urllib.request.urlcleanup()

1.3 urllib#での他の一般的な使用法

import urllib.request
file=urllib.request.urlopen("http://www.baidu.com")
# 現在の環境に関連する情報を取得する
print(file.info())
 
# Bdpagetype:1
# Bdqid:0xb36679e8000736c1
# Cache-Control:private
# Content-Type: text/html;charset=utf-8
# Date: Sun,24 May 202010:53:30 GMT
# Expires: Sun,24 May 202010:52:53 GMT
# P3p: CP=" OTI DSP COR IVA OUR IND COM "
# P3p: CP=" OTI DSP COR IVA OUR IND COM "
# Server: BWS/1.1
# Set-Cookie: BAIDUID=D5BBF02F4454CBA7D3962001F33E17C6:FG=1; expires=Thu,31-Dec-3723:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
# Set-Cookie: BIDUPSID=D5BBF02F4454CBA7D3962001F33E17C6; expires=Thu,31-Dec-3723:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
# Set-Cookie: PSTM=1590317610; expires=Thu,31-Dec-3723:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
# Set-Cookie: BAIDUID=D5BBF02F4454CBA7FDDF8A87AF5416A6:FG=1; max-age=31536000; expires=Mon,24-May-2110:53:30 GMT; domain=.baidu.com; path=/; version=1; comment=bd
# Set-Cookie: BDSVRTM=0; path=/
# Set-Cookie: BD_HOME=1; path=/
# Set-Cookie: H_PS_PSSID=31729_1436_21118_31592_31673_31464_31322_30824; path=/; domain=.baidu.com
# Traceid:1590317610038396263412927153817753433793
# Vary: Accept-Encoding
# Vary: Accept-Encoding
# X-Ua-Compatible: IE=Edge,chrome=1
# Connection: close
# Transfer-Encoding: chunked

# 現在クロールされているWebページのステータスコードを取得します
print(file.getcode())                     
# 200

# 現在クロールされているURLアドレスを取得します
print(file.geturl())                      
# ' http://www.baidu.com'

一般的に、URL標準では、数字、文字、記号などの一部のASCII文字のみが許可されており、中国語文字などの他の一部の文字はURL標準に準拠していません。この場合、それを解決するにはURLエンコーディングが必要です。

import urllib.request
print(urllib.request.quote("http://www.baidu.com"))
# http%3A//www.baidu.comprint(urllib.request.unquote("http%3A//www.baidu.com"))
# http://www.baidu.com

02 ブラウザシミュレーション-ヘッダー属性#

他の人が悪意を持って情報を収集するのを防ぐために、一部のWebページではクローラー防止設定が実行されています。クロールすると、403エラーが表示されます。
これらのWebサイトへのブラウザーアクセスをシミュレートするために、いくつかのヘッダー情報を設定できます。
クローラーがブラウザーアクセスをシミュレートできるようにする2つの設定方法があります。

br

2.1 build_opener()を使用してヘッダーを変更します##

import urllib.request

url="http://www.baidu.com"
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0")
opener = urllib.request.build_opener()
opener.addheaders =[headers]
data=opener.open(url).read()
fhandle=open("./2.html","wb")
fhandle.write(data)
fhandle.close()

2.2 add_header()を使用してヘッダーを追加します##

import urllib.request

url="http://www.baidu.com"
req=urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
data=urllib.request.urlopen(req).read()
fhandle=open("./2.html","wb")
fhandle.write(data)
fhandle.close()

03 タイムアウト設定#

Webページにアクセスしたときに、Webページが長時間応答しない場合、システムはWebページがタイムアウトした、つまりWebページを開くことができないと判断します。

import urllib.request

# timeoutは、タイムアウト時間を秒単位で設定します
file = urllib.request.urlopen("http://yum.iqianyue.com", timeout=1)
data = file.read()

04 プロキシサーバー#

プロキシサーバーを使用して特定のウェブサイトのコンテンツをクロールする場合、相手のウェブサイトに表示されるのは実際のIPアドレスではなく、プロキシサーバーのIPアドレスです。このように、相手が表示されたIPアドレスをブロックしても、問題にはなりません。別のIPアドレスに変更して、クロールを続行できます。

def use_proxy(proxy_addr,url):import urllib.request
 proxy= urllib.request.ProxyHandler({'http':proxy_addr})
 opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
 urllib.request.install_opener(opener)
 data = urllib.request.urlopen(url).read().decode('utf-8')return data
proxy_addr="xxx.xx.xxx.xx:xxxx"
data=use_proxy(proxy_addr,"http://www.baidu.com")print(len(data))

urllib.request.install_opener()を使用してグローバルオープナーオブジェクトを作成します。インストールしたオープナーオブジェクトは、urlopen()を使用するときにも使用されます。

05 Cookie

HTTPプロトコルのみを使用して、Webサイトにログインすると、ログインは成功しますが、Webサイトの他のページにアクセスすると、ログインステータスが消えます。このとき、一度ログインする必要があるため、対応するものを変更する必要があります。ログインの成功などのセッション情報は、いくつかの方法で保存されます。
一般的に使用される方法は2つあります。
1 )Cookieを使用してセッション情報を保存する
2 )セッションを通じてセッション情報を保存します
ただし、セッション制御にどの方法を使用する場合でも、ほとんどの場合Cookieが使用されます。
Cookie処理の一般的な手順は次のとおりです。
1 )Cookie処理モジュールhttp.cookiejarをインポートします。
2 )http.cookiejar.CookieJar()を使用してCookieJarオブジェクトを作成します。
3 )HTTPCookieProcessorを使用してCookieプロセッサを作成し、それをパラメータとして使用してオープナーオブジェクトを作成します。
4 )グローバルなデフォルトのオープナーオブジェクトを作成します。

import urllib.request
import urllib.parse
import http.cookiejar
url ="http://xx.xx.xx/1.html"
postdata = urllib.parse.urlencode({"username":"xxxxxx","password":"xxxxxx"}).encode("utf-8")
req = urllib.request.Request(url,postdata)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
# httpを使用する.cookiejar.CookieJar()CookieJarオブジェクトを作成します
cjar = http.cookiejar.CookieJar()
# HTTPCookieProcessorを使用してCookieプロセッサを作成し、それをパラメータとして使用してオープナーオブジェクトを作成します
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
# グローバルなデフォルトのオープナーオブジェクトを作成します
urllib.request.install_opener(opener)
file = opener.open(req)

data=file.read()
fhandle=open("./4.html","wb")
fhandle.write(data)
fhandle.close()

url1 ="http://xx.xx.xx/2.html"
data1= urllib.request.urlopen(url1).read()
fhandle1=open("./5.html","wb")
fhandle1.write(data1)
fhandle1.close()

06 DebugLog

プログラムの実行中にデバッグログを印刷します。

import urllib.request
httphd=urllib.request.HTTPHandler(debuglevel=1)
httpshd=urllib.request.HTTPSHandler(debuglevel=1)
opener=urllib.request.build_opener(httphd,httpshd)
urllib.request.install_opener(opener)
data=urllib.request.urlopen("http://www.baidu.com")

07 例外処理-URLError#

import urllib.request
import urllib.error
try:
 urllib.request.urlopen("http://blog.baidusss.net")
except urllib.error.HTTPError as e:print(e.code)print(e.reason)
except urllib.error.URLError as e:print(e.reason)

または

import urllib.request
import urllib.error
try:
 urllib.request.urlopen("http://blog.csdn.net")
except urllib.error.URLError as e:ifhasattr(e,"code"):print(e.code)ifhasattr(e,"reason"):print(e.reason)

08 HTTPプロトコルリクエストの戦闘#

HTTPプロトコルリクエストは主に6つのタイプに分けられ、各タイプの主な機能は次のとおりです。
1 )GETリクエスト:GETリクエストはURL URLを介して情報を渡します。URLに直接渡す情報を書き込むか、フォームで渡すことができます。
配信用のフォームを使用する場合、このフォームの情報は自動的にURLアドレスのデータに変換され、URLアドレスを介して渡されます。
2 )POSTリクエスト:サーバーにデータを送信できます。これは、より主流で安全なデータ転送方法です。
3 )PUT要求:通常は保存場所を指定するために、リソースを保存するようにサーバーに要求します。
4 )DELETEリクエスト:サーバーにリソースの削除をリクエストします。
5 )HEADリクエスト:対応するHTTPヘッダー情報を取得するリクエスト。
6 )OPTIONSリクエスト:現在のURLでサポートされているリクエストタイプを取得します
また、TRACEリクエストとCONNECTリクエストがあります。TRACEリクエストは主にテストや診断に使用されます。

8.1 GETリクエストの例##

GETリクエストを使用した場合の手順は、次のとおりです。
1 )対応するURLアドレスを作成します。これには、GETリクエストのフィールド名やフィールドコンテンツなどの情報が含まれています。
GETリクエストフォーマット:http:// URL?Field1 = Field content&Field2 = Field content
2 )対応するURLをパラメーターとして使用してRequestオブジェクトを作成します。
3 )urlopen()を使用して、作成されたRequestオブジェクトを開きます。
4 )必要に応じてフォローアップ処理操作。

import urllib.request

url="http://www.baidu.com/s?wd="
key="こんにちは"
key_code=urllib.request.quote(key)
url_all=url+key_code
req=urllib.request.Request(url_all)
data=urllib.request.urlopen(req).read()
fh=open("./3.html","wb")
fh.write(data)
fh.close()

8.2 POSTリクエストの例##

POStリクエストを使用するには、次の手順に従います。
1 )URLアドレスを設定します。
2 )フォームデータを作成し、urllib.parse.urlencodeを使用してデータをエンコードします。
3 )Requestオブジェクトを作成します。パラメータには、渡されるURLアドレスとデータが含まれます。
4 )add_header()を使用してヘッダー情報を追加し、ブラウザーのクロールをシミュレートします。
5 )urllib.request.urlopen()を使用して、対応するRequestオブジェクトを開き、情報の転送を完了します。
6 )フォローアップ処理。

import urllib.request
import urllib.parse

url ="http://www.xxxx.com/post/"
postdata =urllib.parse.urlencode({"name":"[email protected]","pass":"xxxxxxx"}).encode('utf-8') 
req = urllib.request.Request(url,postdata)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
data=urllib.request.urlopen(req).read()
fhandle=open("D:/Python35/myweb/part4/6.html","wb")
fhandle.write(data)
fhandle.close()

Recommended Posts

Python Webクローラー(練習)
Python3クローラーlearning.md
PythonによるWebスクレイピング
python_クローラーの基本的な学習
Pythonクローラーgerapyクローラー管理
Pythonはクローラーとアンチクローラーを知っています
Python3クローラーデータクリーニング分析
PythonクローラーのJSの分析
pythonクローラー用のSeleniumビジュアルクローラー
クイックスタートWebクローラーシリーズChapter08 | Pythonライブラリ抽出を使用する
Pythonクローラー|コグニティブクローラーのリクエストとレスポンス
Pythonクローラーの基本的な知識ポイントの仕上げ
PythonはユニバーサルWebフレームワークを実装しています
Pythonクローラーのスクレイピーシミュレーションログイン
本当のゼロの基本的なPython開発ウェブ
pythonクローラーのMongodbとpythonの相互作用
パイソンクローラー開発の学習パス
pythonクローラーは簡単に習得できますか
Python3クローラーでのAjaxの使用
PythonWeb開発の完全ガイド
アニメのスクリーンショットを取得するためのPythonクローラーの例
pythonのWeb開発フレームワークとは何ですか