勧告:コンピュータを伴うが、この記事を読んで。本論文では、このような読み取り処理として戦闘、少し不快感をベースとするだけでなく、より多くの練習を見て。
ウェブクローラの概要
Webクローラーは、また、ウェブスパイダー(ウェブスパイダー)として知られています。それは私たちがブラウザに入力したページアドレス(URL)に基づいてページをクロールし、ウェブサイトへのリンクページアドレス(URL)。します。https:たとえば//www.baidu.com/、それはURLです。
爬虫類の内容を説明する前に、我々は爬虫類不可欠なスキルを書くことを学ぶ必要がある:要素の見直しを(すでに習得している場合、あなたはこの部分をスキップすることができます) 。
エレメントを点検1
ブラウザのアドレスバーにURLを入力し、検査を見つけることで、ページ上で右クリックします。(チェックすると呼ばれる別のブラウザのために別の名前、Chromeブラウザは、Firefoxブラウザは、ビュー要素と呼ばれますが、機能は同じです)
python3のWebクローラのクイックスタートセッション
私たちは、HTMLと呼ばれる大きなプッシュコードは、あった右側に、見ることができます。HTMLとは何ですか?例えば、簡単に理解するために:私たちの遺伝子は、私たちの元の外観を決定し、サーバはHTMLが元のサイトの外観を決定返します。
python3のWebクローラのクイックスタートセッション
なぜと言う元ルックス それの?人々が整形手術ああすることができるので!心にカットし、そして木があるのでしょうか?そのウェブサイトはまた、「化粧品」することができますか?次のことができます!以下を参照してください。
python3のWebクローラのクイックスタートセッション
私はあまりお金を持っていますか?明らかに不可能。私のウェブサイトはどのように「化粧品」ことにありますか?これは、HTMLサーバ情報を変更することによって返されます。私たちはそれぞれ、ページ情報を変更することができ、「化粧品の教祖」です。我々はページ上の位置を確認した要素をクリックして、私たちは、対応するHTMLの場所を検索するためのブラウザは次のようになります、そして、あなたは、ローカルのHTML情報を変更することができます。
別の小さな例として:我々はすべて知っている、ブラウザを使用して機能「パスワードを覚えている」、パスワードはそれが見えない、黒の斑点の山となります。パスワード表示はそれからできますか?はい、ちょうどページ「マイナーな操作」へ!淘宝網は、例えば、正しいパスワードの入力ボックスに、チェックをクリックしてください。
python3のWebクローラのクイックスタートセッション
我々は、適切なHTMLの場所に自動的にナビゲートし、当社のブラウザを見ることができます。パスワード属性の値は、(テキスト属性値に把握コードの右側に直接変更します ):
python3のWebクローラのクイックスタートセッション
私たちは、ブラウザがそう浮上したパスワードを覚えてみましょう:
python3のWebクローラのクイックスタートセッション
あまりにも多く、どのようなことが意味するのでしょうか?ブラウザがサーバーからクライアント取得情報であり、その情報を解析し、それが私たちに示しています。私たちは、「化粧品」ページのローカルHTML内の情報を変更することができますが、我々は、HTMLサーバを格納する情報は変更されません、サーバーへの情報の背中を変更しません。画面を更新し、ページが元の外観に戻ります。人々とこの改築は、我々は物事の表面の一部を変更することができますが、私たちの遺伝子を変更することはできません。
2、簡単な例
最初のステップは、WebクローラーのURLに基づいており、情報のHTMLページを取得します。python3では、使用することができるurllib.request と要求 ウェブクローリングのために。
urllibはパイソンライブラリが構築され、我々は限りPythonは、あなたがこのライブラリを使用することができますインストールされているとして、追加のインストールは必要ありません。
リクエスト・ライブラリは、サードパーティのライブラリであり、我々は自分自身をインストールする必要があります。このライブラリの使用要求がHTMLページ上の情報を取得するように、このライブラリは、使用への強力な簡単です。アドレス要求githubのリポジトリます。https://github.com/requests/requests
インストールするには、(1)要求
CMDには、次の要求を使用して、インストール手順:
リクエストをインストール1pip
次のようにライブラリがベースのアプローチを要求します。
python3のWebクローラのクイックスタートセッション
中国の公式チュートリアルアドレスします。http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
詳細な中国のチュートリアルをご提供するために、ライブラリの開発者を要求し、クエリを使用するのは簡単です。この記事では、そのすべての内容の行為は、コンテンツへの利用の一部の除去は、実際の説明も説明していません。
まず、サーバーへのGETリクエストを開始するために使用されて見てみましょうのrequests.get()メソッドは、GET要求は問題ではない理解していません。我々は理解することができます:中国の意味は得ることです取得し、キャッチ、このrequests.get()メソッドは、データが取得され、データをつかむために、サーバから取得されます。(例えばwww.gitbook.cnまで)の例で見てみましょうは理解深めるします:
1# - * - コーディング:UTF-8 - * - 2import要求 3 4if __name__ == '__main__': 5ターゲット= 'http://gitbook.cn/' 6 REQ = requests.get(URL =ターゲット) 7プリント(req.text)
セットでなければならないパラメータrequests.get()メソッドは、我々がGET要求を伝えるために持っているので、私たちの目標は、我々は情報を取得したい人を、である、URLです。結果のプログラムを見て実行します。
python3のWebクローラのクイックスタートセッション
左側には正しい情報を得るために、私たちのプログラムの結果は、審査要素www.gitbook.cn当社のウェブサイトで提供されています。我々は成功したHTMLページ上の情報を取得していることがわかります。これは、爬虫類の簡単な例で、私はちょうどこのページの情報をクロール、求めることができるそれが何であるかを使用、HTMLのですか?Keguan Shaoanwuzaoは、その後、私たちの本当の体を入力します。
爬虫類戦闘
次に、我々は上のテキスト「を参照してペン面白い」ネット小説サイトでクロール、実際の爬虫類に来ます。
(1)実用的な背景
フィクションウェブサイト - ペン興味深いが参照するには:
URL:のhttp://www.biqukan.com/
見るのは興味深いペンは、中国のネットワーク、サイトの速度が少し中国のネットワークの更新レート本物の小説から小説遅れている小説がたくさんある、海賊小説サイトです。サイトはオンラインでのみブラウジングをサポートしており、小説はダウンロードにパッケージをサポートしていません。したがって、この戦闘は「アイデア永遠」と呼ばれる小説を取り、保存するためのサイトから登ることで、小説はファンタジー小説が耳に連載されています。PS:この例では、学習の交換のみで、サポート耳を大幅に、中国のネットワーク上で購読してください。
(2)小規模チョッパー
私たちは、「アイデア永遠」の小説の最初の章を見て、URLます。http://www.biqukan.com/1_1094/5403177.html
python3のWebクローラのクイックスタートセッション
のは、次のようにすでに書き込みコードに学んだHTMLの知識と情報を入手してみましょう:
1# - * - コーディング:UTF-8 - * - 2import要求 3 4if __name__ == '__main__': 5ターゲット= 'http://www.biqukan.com/1_1094/5403177.html' 6 REQ = requests.get(URL =ターゲット) 7プリント(req.text)
コードを実行するには、次のような結果を見ることができます:
python3のWebクローラのクイックスタートセッション
我々は簡単にHTML情報を入手、確認することができます。しかし、右側に示すように、我々が見たいと思っていないことを、多くの情報は、我々だけでテキストの内容を取得したい、我々はDIV気にしない、BRのHTMLタグことは明らかです。それから、これらのHTMLタグの多くからテキストの内容を抽出する方法は?これは戦闘の主な内容です。
(3)美しいスープ
最初のステップ爬虫類、HTMLページ全体のための情報へのアクセスは、我々が完了しました。そして、爬虫類の第二段階があり、HTMLメッセージを解析し、興味のあるコンテンツを抽出します。実際のこのセクションでは、私たちが興味を持っていることは、記事のテキストです。正規表現、XPathの、美しいスープなどを使用して例えばエキスに多くの方法が、あります。手始めに、簡単な方法を理解して使用するのが最も簡単では、関心のあるコンテンツを抽出するために美しいスープを使用することです。
美しいスープの要求と同じインストール方法は、以下の(代替)を使用して、インストール手順:
- ピップbeautifulsoup4をインストール
- easy_installをbeautifulsoup4
強力なサードパーティ製のライブラリ、詳細な公式ドキュメントが存在します。私たちはラッキーだった、美しいスープは、中国の公式文書です。URL:
http://beautifulsoup.readthedocs.io/zh_CN/latest/
同様に、私は実際の需要に基づいて行われます、一部、使用美しいスープライブラリ、詳細を説明する公式ドキュメントを参照してください。
今、私たちはすでに要素法を調べて知って使用し、私たちのゴールページを見て、次のように表示されます。
python3のWebクローラのクイックスタートセッション
見つけるのは困難ではない、記事のすべての内容が呼び出さdiv要素に配置されている「物事の下に、」この「もの」はhtmlタグです。HTMLタグは基本単位でHTML言語は、HTMLタグはHTMLの中で最も重要な部分です。理解していない、それは問題では、我々は簡単な例を引用していません。
女性のバッグは、多くのことがあるだろう、彼らは物事が彼らの習慣に従って分類されて離れて配置されます。ミラーや口紅、多くの場合、これらのものを使用しますが、ポケットの外へ出ることは容易になります。頻繁に使用していない人たちは、あなたがバックサイドポケットに入ることは容易ではありません文書の安全な保管に注意を払う必要があります。
HTMLタグを一つの「ポケット」のように、それぞれの「ポケット」は、異なるコンテンツの保存を担当し、独自の特定の機能を有しています。明らかに、divタグの上記の例は、我々の懸念のテキストコンテンツを格納します。このようなdivタグ:
1 <DIV ID = "コンテンツ"、クラス= "showtxt">
慎重な友人が発見したことがあり、divの単語に加えて、idとクラスがあります。DIV IDとクラス属性は、タグ、コンテンツ、及びshowtxt属性値、プロパティに対応する属性値です。これは、使用何何かありますか?divタグは、我々は彼らに別のdivタグそれを区別しますか、の多くを持つことができるので、別のdivタグを区別するために使用されていますか?これは、異なる属性値を使用することです。
それについての注意深い観察対象サイトは、私たちは、このような事実を見つける:クラス属性showtxtのdivタグ、一つだけ!店のコンテンツ内のラベルは、私たちの関心の本体です。
次のようにこの情報を知っている、我々が望むものを抽出するために、美しいスープを使用し、書き込みコードすることができます:
1# - * - コーディング:UTF-8 - * - 2from BS4インポートBeautifulSoup 3import要求 4if __name__ == "__main__": 5ターゲット= 'http://www.biqukan.com/1_1094/5403177.html' 6 REQ = requests.get(URL =ターゲット) 7 HTML = req.text 8 BF = BeautifulSoup(HTML) 9つのテキスト= bf.find_all( 'DIV'、class_が= 'showtxt') 10印刷(テキスト)
パースのhtmlに先立ち、我々は美しいスープオブジェクトを作成する必要があります。HTMLパラメータでBeautifulSoup機能は、私たちが用意して情報です。その後、我々はfind_allメソッドを使用し、すべての情報のhtmlクラス属性showtxtのdivタグを取得します。最初の引数のfind_all方法は、タグ名を取得することで、2番目のパラメータは、それアンダースコアを持つプロパティタグclass_が、なぜないクラスがありますか?Pythonは使用がclass_がshowtxt背後に沿ってクラス属性タグは、プロパティの値で表すclass_が紛争を防止するために、クラスのキーワードであるため。私たちは、ラベルフォーマットに一致するように見えます。
1 <DIV ID = "コンテンツ"、クラス= "showtxt">
見てこの対応は、理解することはないでしょうか?いくつかは、なぜfind_all(「のdiv」、idは=「コンテンツ」、class_が=「showtxt」)?これは実際に可能ではない、尋ねることがあり、プロパティがクエリ時間の制約などで、クラスを追加します_ =「showtxt」状態私たちは、こののid属性を追加する必要はありませんので、正確には、私たちが望むラベルと一致することができました。私たちの試合の結果を確認するためのコードを実行します。
python3のWebクローラのクイックスタートセッション
我々は成功した私たちの懸念のテキストコンテンツにマッチしていることがわかりますが、我々が望んでいないいくつかのものがあります。例えば、divタグ名、BRタグ、およびスペースの多様。これらの事を削除する方法?私たちは、書き込みコードに進みます。
1# - * - コーディング:UTF-8 - * - 2from BS4インポートBeautifulSoup 3import要求 4if __name__ == "__main__": 5ターゲット= 'http://www.biqukan.com/1_1094/5403177.html' 6 REQ = requests.get(URL =ターゲット) 7 HTML = req.text 8 BF = BeautifulSoup(HTML) 9つのテキスト= bf.find_all( 'DIV'、class_が= 'showtxt') 10プリント(テキスト[0] .text.replace( '\ XA0' * 8、 '\ n \ n'))
結果は一致リターンリストをfind_all。抽出マッチング結果の後に、テキストプロパティを使用して、テキスト抽出、BRタグを濾過しました。その後、スペースを除く、方法を置き換える使用して、キャリッジリターンを交換に細分化しています。&NBSP; HTML内のスペースを表すために使用されます。図8の空白文字で除去し、キャリッジリターンに置き換えられます(「\ XA0」* 8、「\ N \ N」)を置き換えます。
python3のWebクローラのクイックスタートセッション
次のようにプログラムの結果は以下のとおりです。
python3のWebクローラのクイックスタートセッション
あなたが見ることができる、我々はテキストおよびステージングのすべてのコンテンツに自然に一致しています。我々は成功した原作小説をダウンロードするために、我々は各章へのリンクを取得します、章の内容を取得しています。私たちは、最初のディレクトリの下に小説を分析:URL:のhttp://www.biqukan.com/1_1094/を
python3のWebクローラのクイックスタートセッション
要素を見直すことで、私たちは、あなたがこれらの章は、次のlistmainのdivタグのクラス属性に格納されて見つけることができることを発見し、HTMLコードの一部を選択し、次のとおりです。
1 <のdivクラス= "listmain"> 2 <DL> 3 <DT> "永遠のアイデア、" 最新のチャプタリスト</ DT> 4 <DD> <a href="/1_1094/15932394.html"> 1027章Xドア</a>の</ DD> 5 <DD> <a href="/1_1094/15923072.html">章絶妙Daofa 1026!</a>の</ DD> 6 <DD>のhref = "/ 1_1094 / 15921862.html"> <章ランプ寿命1025!</a>の</ DD> 7 <DD> <a href="/1_1094/15918591.html">第1024章一目晶渊</a>の</ DD> 8 <DD> <a href="/1_1094/15906236.html"> 1023第10章ドア</a>の</ DD> 9 <DD>のhref = "/ 1_1094 / 15903775.html"> <4匹の獣の章1022!</a>の</ DD> 10 <DD> <a href="/1_1094/15890427.html">第1021章鳄首!</a>の</ DD> 11 <DD>のhref = "/ 1_1094 / 15886627.html"> <章1020爆発!</a>の</ DD> 12 <DD> <a href="/1_1094/15875306.html">章1019ケベック先祖の息吹!</a>の</ DD> 13 <DD> <a href="/1_1094/15871572.html">章絶望ケベック1018インペリアル</a>の</ DD> 14 <DD> <a href="/1_1094/15859514.html">章1017年、私はあなたを憎みます!</a>の</ DD> 15 <DD> <a href="/1_1094/15856137.html">章1016年の世界への扉は決して!</a>の</ DD> 16 <DT>ボディロール</ DT> <DD> <a href="/1_1094/5386269.html">噂 "パーマネントを読んで" 1ケ親。</a>の</ DD> 17 <DD> <a href="/1_1094/5386270.html">噂2ヤンがはるかに重要。</a>の</ DD> <DD> <a href="/1_1094/5386271.html">噂3羽のオウムと皮膚の凍結。</a>の</ DD> 18 <DD>のhref = "/ 1_1094 / 5403177.html">章は彼が白い小さなネットと呼ばれる<aする</a> </ DD> <DD>のhref = "/ 1_1094 / 5428081.html">章<A火災Zaofangする</a> </ DD> 19 <DD> <a href="/1_1094/5433843.html">章6ワード</a>の</ DD> <DD> <a href="/1_1094/5447905.html">章IV陵精製する</a> </ DD> 20 </ DL> 21 </ div>
親、子ノード、孫ノード:分析の前に、私たちが最初のコンセプトをご紹介しましょう。<DIV>と</ div>を定義A <div>タグの開始位置と終了位置、それらはそこ開始位置、終了位置と対にされます。私たちは、<dtは、<div>タグは、<DL>タグが含まれている中で、この<DL>タグは、<div>タグの子ノードである、<DL>タグも<DT>タグと<DD>タグが含まれていることを見ることができます>タグと<DD>タグは、孫ノードの<div>タグです。ビットアラウンド?あなたはこれらの単語を覚えていますか:誰が含まれている、ある息子を!
それらの間の関係は相対的なものです。たとえば、<DD>タグは、親ノード<DL>タグである子ノードの<a>タグ、です。それは古いと小さな下、私達と同じです。
いくつかは、ああ<A> <DD>タグやラベルがたくさんある、ここを参照してくださいすることが求められる場合があり!<DD>タグ異なる、ある関係ああは何ですか?明らかに、自分の兄弟や姉妹!私たちは兄弟としてそれらを参照してください。
まあ、はっきりと明確なコンセプト、そして、私たちは問題を分析してみましょう。私たちは、各章の名前が<A>ラベル内部に格納されて参照してください。<A>ラベルはまた、href属性を持っています。aは、ここではラベルの定義に言及しなければならない、<A>タグは、ハイパーリンク、別のページへ1ページからのリンクを定義します。最も重要な属性は、リンクのターゲットを示し、href属性でラベル<A>。
私たちは、URLの前に最初の章を取得し、<A>ラベルの比較になります。
1http://www.biqukan.com/1_1094/5403177.html
見つけるのは難しいことではありません、プロパティ値/1_1094/5403177.html <A>タグのhref属性は、URL http://www.biqukan.com/1_1094/5403177.html章の後半に格納されます。他のセクション、あまりにも!そうすれば、私たちは、各章のリンクの名前を取得し、href属性値の<a>タグに基づいてすることができます。
要約すると:ラベルの下の<div> <A>タブlistmainクラス属性の小説リンクの各章。HTML-> body-> div-> DL-> DD-> A href属性にリンクの特定の場所があります。クラス属性listmain <div>タグ、タグの一致<A>を一致させます。次のようにコードを書きます:
1# - * - コーディング:UTF-8 - * - 2from BS4インポートBeautifulSoup 3import要求 4if __name__ == "__main__": 5ターゲット= 'http://www.biqukan.com/1_1094/' 6 REQ = requests.get(URL =ターゲット) 7 HTML = req.text 8 div_bf = BeautifulSoup(HTML) 9 DIV = div_bf.find_all( 'DIV'、class_が= 'listmain') 10プリント(DIV [0])
またはfind_allメソッドを使用し、以下のように、結果は以下のとおりです。
python3のWebクローラのクイックスタートセッション
非常によく、その後、次の試合には、各ラベルをを<a>、およびエキスの章のタイトルやチャプターの記事。我々は、次の<a>ラベルと一致する美しいスープを使用している場合は、どのようにそのチャプター名タグのhref属性を抽出し、それを格納<A>?
彼は小さな純白</a>に呼ば<A 1のhref = "/ 1_1094 / 5403177.html">第一章
この方法は、マッチング結果美しいスープを返すために、非常に簡単です、a.getを使用して(「のhref」)プロパティメソッドのhrefの値を取得することができ、次のようにチャプター名、書き込みコードをa.string使用して取得することができます。
1# - * - コーディング:UTF-8 - * - 2from BS4インポートBeautifulSoup 3import要求 4if __name__ == "__main__": 5サーバー= 'http://www.biqukan.com/' 6ターゲット= 'http://www.biqukan.com/1_1094/' 7 REQ = requests.get(URL =目標)HTML = req.text 8 div_bf = BeautifulSoup(HTML) 9 DIV = div_bf.find_all( 'DIV'、class_が= 'listmain') 10 a_bf = BeautifulSoup(STR(DIV [0])) 11 A = a_bf.find_all( '') 各12: 13プリント(each.string、サーバ+ each.get( 'のhref'))
find_allが<A>ラベルたくさんの内部に格納リストを返すので、それぞれの<a>ラベルをループのために使用し、それをプリントアウトしているので、以下のように、結果は以下のとおりです。
python3のWebクローラのクイックスタートセッション
以上千章の内容は、トップがリンク12章の最新のアップデートで一致します。私たちはフィルタリングする必要がありますのでこの章12と、以下の内容を加えて、我々は望んでいない3噂があったが、繰り返されます。これらは、単に十分に淘汰されました。
(3)統合コード
各章のリンク、チャプター名、章はされています。次のステップは、十分に保存されたテキストファイルの内容を書き込みますコードを統合することです。次のようにコードを書きます:
1# - * - コーディング:UTF-8 - * - 2from BS4インポートBeautifulSoup 3importリクエスト、SYS 4 5classダウンローダ(オブジェクト): 6デフ__init __(自己): 7 self.server = 'http://www.biqukan.com/' 8 self.target = 'http://www.biqukan.com/1_1094/' 9 self.names = []#記憶部名 10 self.urls = []#記憶部リンク 11 self.nums = 0#チャプター番号 12 13デフget_download_url(自己): 14 REQ = requests.get(URL = self.target) 15 HTML = req.text 16 div_bf = BeautifulSoup(HTML) 17 DIV = div_bf.find_all( 'DIV'、class_が= 'listmain') 18 a_bf = BeautifulSoup(STR(DIV [0])) 19 A = a_bf.find_all( '') 20 self.nums = LEN([15:])#排除不要章、セクション、および統計 [15:]の各21: 22 self.names.append(each.string) 23 self.urls.append(self.server + each.get( 'のhref')) 24 25 ""」 26機能説明:ゲット章 27個のパラメータ: 28ターゲット - ダウンロードリンク(文字列) 29の戻り値: 30のテキスト - 章(文字列) 31 ""」 32 DEF get_contents(自己、ターゲット) 33 REQ = requests.get(URL =ターゲット) 34 HTML = req.text 35 BF = BeautifulSoup(HTML) 36のテキスト= bf.find_all( 'DIV'、class_が= 'showtxt') 37のテキスト=テキスト[0] .text.replace( '\ XA0' * 8、 '\ n \ n') 38のリターンテキスト 39 40 ""」 41関数の説明:ファイルに書かれた記事の内容をクロール 42個のパラメータ: 43名 - 章名(文字列) 44パス - 現在のパス、名前(文字列)を保存小説 45テキスト - 章(文字列) 46の戻り値: ません47 48 ""」 49デフ・ライター(自己、名前、パス、テキスト): 50 write_flag =真 Fとして(パス、 ''、コード= 'UTF-8')オープンと51: 52 f.write(名+ '\ n' は) 53 f.writelines(テキスト) 54 f.write( '\ N \ N') 55 56if __name__ == "__main__": 57 DL =ダウンローダ() 58 dl.get_download_url() (「ダウンロードを開始するには、 『永遠の年』:」)59印刷 範囲のI 60(dl.nums): 61 dl.writer(dl.names [i]は、 '一念永恒の.txt'、dl.get_contents(dl.urls [I])) 62 sys.stdout.write( "已下载:%3F %%" %フロート(I / dl.nums * 100)+ '\ r' が) 63 sys.stdout.flush() 64プリント( ' 『永遠の年に、』「完全ダウンロード)
非常に簡単な手順は、単一のプロセスの実行には、何も開いてプロセスプールはありません。ダウンロード速度は、わずかに遅いお茶、残りのカップです。以下に示すような結果を実行するコード:
python3のWebクローラのクイックスタートセッション
上記は、爬虫類の戦闘です。
そして、小さなパートナーはそれに育つために!