前回の内容の続きですが、前回の記事では、スケジューラはクローラプログラム全体の「頭脳」であり、コマンドセンターとも言えます。ここで、スケジューラで使用される他のコンポーネントを作成する必要があります。 1 つ目は URL マネージャーです。これはマネージャーとして機能するため、クロールされる URL とクロールされた URL を区別する必要があります。そうしないと、クロールが繰り返されます。ここのチュートリアルでは、セット コレクションを使用して 2 つの URL をコレクション、つまりメモリに一時的に保存します。もちろん、クロールされたデータは、キャッシュやメモリなどの他の場所に保存することもできます。リレーショナルデータベース。
1回目は、スケジューラの初期化関数でurlmanagerオブジェクトを作成することです、
2回目は、add_new_urlメソッドを呼び出して、クローリングでコレクションに初期URLを追加することです、
3回目は、クローリング中、取得中このプロセスでは、クロールする URL があるかどうかを判断します。
4 回目は、コレクションからクロールされる URL を取得します。
5 回目は、ページから解析された新しい URL セットをクローラーに追加します。もう一度コレクションに移動します
次にしなければならないことは、コードを使用してこれらの関数を実装することです:
1 class UrlManager(object): 2 """docstring for UrlManager""" 3 def __init__(self): 4 self.new_urls = set() 5 self.old_urls = set() 6 #向管理器中添加一个新的url 7 def add_new_url(self,url): 8 if url is None: 9 return10 if url not in self.new_urls and url not in self.old_urls:11 self.new_urls.add(url)12 #从爬取数据中向管理器中批量添加url13 def add_new_urls(self,urls):14 if urls is None or len(urls) == 0:15 return16 for url in urls:17 self.add_new_url(url)18 #判断是否有新的url19 def has_new_url(self):20 return (len(self.new_urls) != 0)21 #从管理器中取出一个新的url22 def get_new_url(self):23 new_url = self.new_urls.pop()24 self.old_urls.add(new_url)25 return new_url
さて、これで URL マネージャーが完成しました。
次のステップは URL ダウンローダーです。これは、プログラムがアクセスしたページを保存する非常に単純な機能です。
ダウンローダーはスケジューラーに 2 回のみ表示されます:
1 回目は初期化中に作成されます
2 回目は URL を取得した直後に、ページをダウンロードするために呼び出されます
URL ダウンローダーでは、元のチュートリアルでは次のメソッドが使用されますurllib ライブラリですが、これは少し面倒だと思います。そこで、より便利なライブラリである request に切り替えました。このライブラリは、多くの技術的な問題をブロックし、アクセスしたいページを直接クロールするのに役立ちます。また、使い方は非常に簡単です。
1 import requests 2 3 class HtmlDownloader(object): 4 """docstring for HtmlDownloader""" 5 def download(self,url): 6 if url is None: 7 return 8 response = requests.get(url, timeout = 0.1) 9 response.encoding = 'utf-8'10 if response.status_code == requests.codes.ok:11 return response.text12 else:13 return
このコードについて簡単に説明します:
a. まず、リクエストライブラリをインポートします。そのため、コマンドラインで「pip」と入力する必要があります。 install request
b .次に、ダウンローダー クラスの作成を開始します。このクラスには、download というメソッドが 1 つだけあります。このメソッドは、まず指定した URL を受け入れ、次にそれが存在するかどうかを判断します。
c. 次に、リクエストの get メソッドを呼び出します。これは 2 つのパラメータを受け入れます。1 つは URL で、もう 1 つはタイムアウトです
タイムアウトはアクセス タイムアウトです。タイムアウトが追加されていない場合、プログラムはフリーズします。つまり、例外をスローせずに常にページの応答を待ちます。
d. 次に、返されるレスポンスのエンコーディングを設定します。クロールされた Baidu Encyclopedia ページは utf-8 なので、ここで設定するのが最適ですが、リクエストは手動で変更することをお勧めします。
e. 次に、ページが応答するかどうかを確認します。ここでの codes.ok は実際には 200 であり、これは Web ページが正常に応答することを意味します。ここで、response.status_code == 200 を直接記述しても問題ありません。
f. 最後に、ページのすべてのコンテンツを返します。ここでのテキストは、ページのすべてのコード (html、css、js) を含む文字列です。
以上がPythonスケジューラの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。