ミニWebクローラー。 インターネットから本をダウンロードする

私はほとんどの本をハンドヘルドから読んでいるので、読む本はどこかに持っていく必要があります。 原則として、テキストライブラリ(txt、html、fb2)のネットワークライブラリに興味のある本があります。 同時に、ダウンロードが原則として提供されていないサイトに投稿され、さらにいくつかのhtmlページ(たとえば、 このような)に分割されている本を読みたい場合があります。 この場合、各htmlページを手動で保存できますが、この方法には2つの重要な欠点があります。 まず、本が15〜20ページに分割されている場合、手動での保存に多くの時間がかかり、面倒です。 第二に、本のテキストと一緒に、本、表、スクリプト、他のサイトへのリンク、および他のかすに関係しないテキストの束を取得します。



私たちの生活を簡素化するために、私たちのために本をダウンロードするプログラムを書きます。 上記から、次のプログラムが必要になります。a)書籍が散在しているすべてのページを必要な順序でダウンロードする。 b)各ページからテストのみを受け取り、それ以上何もしません; c)本のテキスト全体を1つのhtmlファイルに保存します。



例として、私たちはウラジミール・プルンヤンの本を取り上げます。 人気の言語学 テキスト形式でダウンロードできるネットワークライブラリが1つだけ見つかったため、そこに登録する必要があるため、後で説明するプログラムを使用して指定されたリンクからダウンロードします。 プログラムを作成するには、Pythonプログラミング言語を使用します。 Pythonバージョン2.6を使用しました。 このバージョンまたは新しいバージョンは、公式Webサイトから無料ダウンロードできます。



ダウンロードページ



ページをダウンロードするには、アドレスが必要です。 ご覧のとおり、最初のページを除くすべてのページのアドレスは同じであり、数のみが異なります。



http://profismart.ru/web/bookreader-115980- page_number .php



これにより、それらを手動で作成することはできませんが、次のコードを使用して生成できます。



for i in range(2,29): url = "http://profismart.ru/web/bookreader-115980-%i.php" % i
      
      





これにより、2〜28ページのすべてのページのアドレスが得られます。 最初のページのアドレスは他のページ(http://profismart.ru/web/bookreader-115980.php)とは異なるため、プログラムに手動で挿入します。



次に、これらの各ページをダウンロードし、htmlコード自体をhtml



変数に書き込みます。



 for i in range(2,29): #   url = "http://profismart.ru/web/bookreader-115980-%i.php" % i #   html = "" sock = urllib.urlopen(url) html = sock.read() sock.close()
      
      







ページから目的のテキストを抽出します



本のテキストを含むHTMLコードは、正規表現(正規表現)を使用してページコードから抽出します。 この場合、テキストはページ内のタグ<td style="padding:7px" class="ps24 ps37">



</td>



ます。 テキストの各段落は</div>



タグと</div>



タグの間に配置され、追加パラメーターなしの<div>



タグ自体は本のテキストでのみ使用されます。 したがって、テキストを抽出するには、最初の<div>



を見つけて、そこからすべてのテキストを取得して最初のタグ</td>



です。 正規表現は次のようになります。



 (<div>.+?</div>)</td>
      
      





ドットは任意の文字を示し、プラス記号はその文字が少なくとも1つでなければならないことを示します。 組み合わせ後の疑問符.+



要求を満たす最小数の文字を取得したいと言います。 したがって、htmlコードにある最初の<div>



タグから最初の(疑問符のおかげで)組み合わせ</div></td>



までのすべてのテキストを探します。 括弧は、検出されたテキストの一部を示します。 この場合、必要のない</td>



なしで見つかったすべてのテキストを取得します。 プログラムで正規表現を使用するには、その先頭に次の行を追加します。



 text_regex = re.compile(u"(<div>.+?</div>)</td>", re.IGNORECASE | re.DOTALL | re.UNICODE)
      
      





式をtext_regex



という名前でtext_regex



ます。 本のテキストを変数book



保存します。 正規表現を追加すると、ページ2〜28を処理するコードは次のようになります。



 for i in range(2,29): #   url = "http://profismart.ru/web/bookreader-115980-%i.php" % i #   html = "" sock = urllib.urlopen(url) html = sock.read() sock.close() #            book = book + text_regex.search(html).group(1)
      
      





最初のページは個別に処理します。 それから、本のテキストと、プログラムが作成する新しいhtmlファイルのタイトルを取得します。 次の正規表現を使用してヘッダーを取得します。



 (<html.+?<body>)
      
      





つまり、 <html>



タグから<body>



までのすべてのコードを取ります。 取得するコードには小さなゴミがありますが、ブラウザまたはハンドヘルド画面でのページの表示には影響しないため、そのままにしておきます。 本当に必要な場合は、後でエディターで手動で削除します。 前の式については、プログラムの先頭に次の行を追加します。



 head_regex = re.compile(u"(<html.+?<body>)", re.IGNORECASE | re.DOTALL | re.UNICODE)
      
      





最初のページを処理するコードは次のようになります。



 #    url = "http://profismart.ru/web/bookreader-115980.php" html = "" sock = urllib.urlopen(url) html = sock.read() sock.close() #   head = head_regex.search(html).group(1) book = book + head #      book = book + text_regex.search(html).group(1)
      
      







本のテキストをファイルに保存する



ここではすべてが簡単です。 book変数の内容に、 <html>



および<body>



終了タグを追加して、ファイルに書き込みます。 これは次のコードを実行します。



 #     file_out = open('book.html', 'w') #    file_out.write(book) #    file_out.write("\n</body></html>") #   file_out.close()
      
      







プログラム全体をまとめる



プログラムの最終バージョンでは、 <div>...</div>



タグを<p align=justify>...</p>



置き換え、現在処理中のページに関する情報を表示することを追加しました。 1つは、テキストがページの幅に揃えられているときに気に入っているからです。 2つ目は、動作中のプログラムが少なくとも生命の兆候を示すことです。



プログラムの全文は、拡張子が.pyのファイルに保存して実行できます。 ここにあります:



 import urllib import re text_regex = re.compile(u"(<div>.+?</div>)</td>", re.IGNORECASE | re.DOTALL | re.UNICODE) head_regex = re.compile(u"(<html.+?<body>)", re.IGNORECASE | re.DOTALL | re.UNICODE) book = "" # Download first page url = "http://profismart.ru/web/bookreader-115980.php" print "Page 1" print url html = "" sock = urllib.urlopen(url) html = sock.read() sock.close() print "Page downloaded." # Extract page head and book text book = book + head_regex.search(html).group(1) book = book + text_regex.search(html).group(1) for i in range(2,29): # Generate page url url = "http://profismart.ru/web/bookreader-115980-%i.php" % i print "Page %i" % i print url # Download the page sock = urllib.urlopen(url) html = sock.read() sock.close() print "Page downloaded." # Extract required text book = book + text_regex.search(html).group(1) # Replace <div> with <p align=justify> book = book.replace("<div>", "\n<p align=justify>") book = book.replace("</div>", "</p>") # Write to file file_out = open('book.html', 'w') file_out.write(book) file_out.write("\n</body></html>") file_out.close()
      
      






All Articles