blog

小説 "元順 "をクロールpythonの全過程の詳細な記録は、あなたが〜される参照してください!

浸透テストの基本的な理論の数日間を学び、週末は自分自身をリラックスさせるために、最近、ジャガイモの日は "元順"、学生時代と呼ばれる新しい小説を持っていることを聞いたが、私はジャガイモの小説の日を読む...

Jun 7, 2020 · 6 min. read
シェア

浸透テストの基本的な理論の数日間を学び、週末は自分自身をリラックスさせるために、最近、空のカイコジャガイモは "元順 "と呼ばれる、新しい小説を持っていることを聞いた、私は非常に空のカイコジャガイモの小説を読みたい学生時代だった "斗ブローカーCangdao "私はパートナーの多くはそれを見ていると信じています。今日はステップバイステップで "元順 "すべてのコンテンツを登り詰めるかどうかを確認します。

まず第一に、あなたはクロールするウェブサイトを選択する必要があり、私の側は本のホームサイトを使用していますが、他のサイトの操作は、同様の原則です。

関連ライブラリファイル

使用するライブラリはrequests、re、timeで、reとtimeはpythonに付属しているライブラリで、インストールが必要なのはrequestsライブラリだけです。

pip install requests

コーディングプロセス

まずはBook Homesteadのウェブサイトから、Yuanzun Books- www.shujy.com/5200/9683/のトップページのURLをご覧ください。

リクエストはリクエストを通して行われ、その後htmlがプリントアウトされます。

import requests
url ='"https://..com/5200/9386"/'
response = requests.get(url)
html = response.text
print(html)

印刷結果は以下の通りです:

正規表現でタイトルと作者を抽出

title = re.findall(r'<meta property="og:novel:book_name" content="(.*?)"/>',html)[0]
author = re.findall(r'<meta property="og:novel:author" content="(.*?)"/>',html)[0]

次に、ブラウザのF12ツールを使って、小説の各章へのリンクを取り出します。

  1. 左上の矢印をクリック
  2. 探したい要素をクリックし、各章へのリンクを見つける必要があるので、"Text Chapter 1 "をクリックします。
  3. 開発者ツールに表示されるhtmlで、オブジェクトの位置を確認できます。

リンクの場所を分析すると、それらはすべて"

「divタグが真ん中にあり、それぞれのリンクはhrefタグの後ろにあります。次に、まずこのdivタグの中のコンテンツを取り出して、取り出したコンテンツの中からhrefタグの中にあるリンクをすべて探し出し、リストに入れます。
dl =re.findall(r'<div id="list">.*?</div>',html,re.S)[0]
chapter_info_list=re.findall(r'<a href="(.*?)">(.*?)</a>',dl)

すべての章のリストができたので、次は各章のコンテンツを取得する方法を考えましょう。トップページのURLから各章へのリンクを取り出します。

chapter_url = url+'/'+chapter_url
chapter_url = chapter_url.replace(' ','')

それから、リクエストライブラリを使って各章のHTMLファイルを取得します。

chapter_response = requests.get(chapter_url)
chapter_html = chapter_response.text

同じようにして、本文の内容が "

" というdivタグの中にあります。

このdivタグの中にあるbodyの内容をすべて取り出します。

#最初のページの内容を取得する
chapter_content = re.findall(r'<div id="content">(.*?)</div>',chapter_html,re.S)[0]

取り出した内容を印刷

まだいくつかの "
"や" "などの要素が残っていることがわかりますが、これらは期待されたものではありません。

chapter_content = chapter_content.replace('&emsp;&emsp;','')
chapter_content = chapter_content.replace('<br />','')

フィルタリングされた内容を見てみましょう。

私はまだ何かが間違っていることがわかりました、なぜテキストのすべての行は空ですか?デバッグを通してchapter_contentコンテンツのプロセスを見て

案の定、タブが残っているので、改行を1つだけにしてみましょう。

chapter_content = chapter_content.replace('

', '')

これは、すべてのダウンの本体のページになりますが、各章は1ページだけでなく、2ページ、3ページ、あるいはそれ以上のコンテンツがあるかもしれないことを発見したページの最後に有効にするには、どのように我々はこの不確実なダウンのコンテンツを完了することができますか?

各ページの本文に、その章に必要なページが全部で何ページか書いてあり、次のページへのリンクが貼ってあるのを見ると、このヒントがあります。

まず、総ページ数と次のページへのリンクを削除する必要があります。

chapter_url,current_page,total_pages = re.findall(r'この章はまだ終わっていない。<a style="color:red;" href="(.*?)"> </a>続きを読む最初の(.*?)ページ/合計(.*?) </p>', chapter_content,re.S)[0]

次に、forループを使用してコンテンツを取り、方法を取り、もはや詳細に記述されていない以前の同様の、コードに直接。

for i in range(1,int(total_pages)):
 chapter_url,current_page,total_pages = re.findall(r'この章はまだ終わっていない。<a style="color:red;" href="(.*?)"> </a>続きを読む最初の(.*?)ページ/合計(.*?) </p>',chapter_content)[0]
 chapter_url = url+'/'+chapter_url
 chapter_url = chapter_url.replace(' ','')
 chapter_response = requests.get(chapter_url)
 chapter_html =chapter_response.text
 chapter_content = re.findall(r'<div id="content">(.*?)</div>', chapter_html, re.S)[0]
 chapter_content = chapter_content.replace('&emsp;&emsp;', '')
 chapter_content = chapter_content.replace('<br />', '')
 chapter_content = chapter_content.replace('

', '')
 f.write('
')
 f.write(chapter_content)

最後に、あなただけの外にファイルの書き込み操作を追加する必要があり、それに書き込まれたコンテンツの本体が毎回読み出されます。

with open('%s.txt'%title,'w') as f:
 f.write(title)
 f.write('
')
 f.write(author)
 f.write('
')

list index out of rangeエラー処理

これで全て完了したように見えますが、いざダウンロードしようとすると、違う箇所でこんなエラーがよく出ます。

今回は第4章かもしれないし、次は第10章かもしれません。この種のエラーの一般的なシナリオを2つ調べてみました。

  1. list[index]index範囲外
  2. リストが空で要素が一つもなく、list[0]を実行するとエラーになります!

原因へのクエリが、これらの2つのケースは、ああ、エラーを報告するために現れたランダム章を表示することはできませんが、私はまだ理由を発見していない、1つまたは2つを指定することができます参照してください神がある場合。

しかし、私はそれがランダムな章のエラーであるため、つまり、回避するための措置が見つかりました、一度私は、urlが再び再要求された後にエラーを検出し、一度規則性によって再チェックされます。これを行う関数を思いつきました。

def find(pattern,string,url):
 try:
 chapter_content = re.findall(pattern, string, re.S)[0]
 return chapter_content
 except Exception as e:
 print(e)
 time.sleep(1)
 chapter_response = requests.get(url)
 chapter_html = chapter_response.text
 print(chapter_html)
 print(url)
 i = find(pattern,chapter_html,url)
 return i

実装後、それは本当に動作し、私は実装されている、今では100以上の章をダウンロードしています!

Read next

クラス図の関係はとても簡単なので、あなたはあえて信じている?

一般化は、2つのオブジェクト間の継承関係を表します。 実装は、インターフェースとクラスの関係を表します。 関連は、オブジェクトが常に「知っている」ことを表します。

Jun 6, 2020 · 3 min read