Webサイトから情報を取得するための基本的なWebクローラーを構築する方法

Webサイトから情報を取得するための基本的なWebクローラーを構築する方法

WebサイトまたはWebクローラーから情報を読み取るプログラムには、あらゆる種類の便利なアプリケーションがあります。株式情報、スポーツスコア、Twitterアカウントからのテキストを取得したり、ショッピングWebサイトから価格を取得したりできます。





これらのWebクロールプログラムの作成は、想像以上に簡単です。 Pythonには、Webサイトから情報を抽出するスクリプトを作成するための優れたライブラリがあります。 Scrapyを使用してWebクローラーを作成する方法を見てみましょう。





Scrapyのインストール

Scrapy は、WebをスクレイピングしてWebクローラーを構築するために作成されたPythonライブラリです。高速でシンプルで、多くの労力をかけずに複数のWebページをナビゲートできます。





Scrapyは、Pip Installs Python(PIP)ライブラリから入手できます。 Windows、Mac、およびLinuxにPIPをインストールする方法

Python仮想環境を使用すると、システムファイルをそのままにしておく仮想ディレクトリにScrapyをインストールできるため、推奨されます。 Scrapyのドキュメントでは、最良の結果を得るためにこれを行うことを推奨しています。



ディレクトリを作成し、仮想環境を初期化します。

Android用の最高の無料VRアプリ
mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate

これで、PIPコマンドを使用してScrapyをそのディレクトリにインストールできます。





pip install scrapy

Scrapyが正しくインストールされていることを確認するための簡単なチェック

scrapy
# prints
Scrapy 1.4.0 - no active project
Usage:
scrapy [options] [args]
Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
...

Webクローラーを構築する方法

環境の準備ができたので、Webクローラーの構築を開始できます。バッテリーに関するウィキペディアのページからいくつかの情報を削りましょう。 https://en.wikipedia.org/wiki/Battery_(electricity)





クローラーを作成するための最初のステップは、 Scrapy.Spider 。これにより、Scrapyのすべての機能にアクセスできます。このクラスを呼びましょう スパイダー1

スパイダークラスには、いくつかの情報が必要です。

  • 名前 クモを識別するため
  • start_urls クロールするURLのリストを含む変数(ウィキペディアのURLがこのチュートリアルの例になります)
  • parse() 情報を抽出するためにウェブページを処理するために使用される方法
import scrapy
class spider1(scrapy.Spider):
name = 'Wikipedia'
start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']
def parse(self, response):
pass

すべてが正しく実行されていることを確認するための簡単なテスト。

scrapy runspider spider1.py
# prints
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
2017-11-23 09:09:21 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.logstats.LogStats',
...

ロギングをオフにする

このクラスでScrapyを実行すると、現時点では役に立たないログ情報が出力されます。この余分なログ情報を削除して、簡単にしましょう。使う 警告 ファイルの先頭にコードを追加することによるステートメント。

import logging
logging.getLogger('scrapy').setLevel(logging.WARNING)

これで、スクリプトを再度実行すると、ログ情報は出力されません。

Chromeインスペクターの使用

Webページ上のすべてがHTML要素に保存されます。要素は、ドキュメントオブジェクトモデル(DOM)に配置されます。 DOMを理解することは、Webクローラーを最大限に活用するために重要です。 Webクローラーは、ページ上のすべてのHTML要素を検索して情報を見つけるため、それらがどのように配置されているかを知ることが重要です。

Google Chromeには、HTML要素をすばやく見つけるのに役立つツールがあります。インスペクターを使用して、Webページに表示されている要素のHTMLを見つけることができます。

  • Chromeのページに移動します
  • 表示したい要素にマウスを置きます
  • 右クリックして選択します 検査する メニューから

これらの手順により、開発者コンソールが開きます。 要素 タブが選択されました。コンソールの下部に、要素のツリーが表示されます。このツリーは、スクリプトの情報を取得する方法です。

タイトルの抽出

スクリプトを取得して、いくつかの作業を実行してみましょう。 Webページのタイトルテキストを取得するための簡単なクロール。

にコードを追加してスクリプトを開始します parse() タイトルを抽出するメソッド。

...
def parse(self, response):
print response.css('h1#firstHeading::text').extract()
...

NS 応答 引数はと呼ばれるメソッドをサポートします CSS() 指定した場所を使用してページから要素を選択します。

この例では、要素は h1.firstHeading 。追加する

::text

スクリプトに、要素のテキストコンテンツを提供します。最後に、 エキス() メソッドは、選択された要素を返します。

このスクリプトをScrapyで実行すると、タイトルがテキスト形式で印刷されます。

[u'Battery (electricity)']

説明を見つける

タイトルテキストをスクレイピングしたので、スクリプトをさらに活用してみましょう。クローラーは、タイトルの後の最初の段落を見つけて、この情報を抽出します。

Chromeデベロッパーコンソールの要素ツリーは次のとおりです。

ps4はいつ出ますか
div#mw-content-text>div>p

右矢印(>)は、要素間の親子関係を示します。

この場所はすべてを返します NS 一致した要素。これには説明全体が含まれます。最初に取得するには NS このコードを書くことができる要素:

response.css('div#mw-content-text>div>p')[0]

タイトルと同じように、CSSエクストラクタを追加します

::text

要素のテキストコンテンツを取得します。

response.css('div#mw-content-text>div>p')[0].css('::text')

最終的な式は エキス() リストを返します。 Pythonを使用できます 加入() すべてのクロールが完了したら、リストに参加する関数。

def parse(self, response):
print ''.join(response.css('div#mw-content-text>div>p')[0].css('::text').extract())

結果はテキストの最初の段落です!

An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is
...

JSONデータの収集

Scrapyはテキスト形式で情報を抽出できるので便利です。 Scrapyでは、データのJavaScript Object Notation(JSON)を表示することもできます。 JSONは情報を整理するための優れた方法であり、Web開発で広く使用されています。 JSONはPythonで非常にうまく機能します 同様に。

データをJSONとして収集する必要がある場合は、 収率 Scrapyに組み込まれたステートメント。

これは、yieldステートメントを使用した新しいバージョンのスクリプトです。最初のp要素をテキスト形式で取得する代わりに、これによりすべてのp要素が取得され、JSON形式で整理されます。

YouTubeをkodiに追加する方法
...
def parse(self, response):
for e in response.css('div#mw-content-text>div>p'):
yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...

これで、出力JSONファイルを指定してスパイダーを実行できます。

scrapy runspider spider3.py -o joe.json

スクリプトはすべてのp要素を出力します。

[
{'para': 'An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is the cathode and its negative terminal is the anode.[2] The terminal marked negative is the source of electrons that when connected to an external circuit will flow and deliver energy to an external device. When a battery is connected to an external circuit, electrolytes are able to move as ions within, allowing the chemical reactions to be completed at the separate terminals and so deliver energy to the external circuit. It is the movement of those ions within the battery which allows current to flow out of the battery to perform work.[3] Historically the term 'battery' specifically referred to a device composed of multiple cells, however the usage has evolved additionally to include devices composed of a single cell.[4]'},
{'para': 'Primary (single-use or 'disposable') batteries are used once and discarded; the electrode materials are irreversibly changed during discharge. Common examples are the alkaline battery used for flashlights and a multitude of portable electronic devices. Secondary (rechargeable) batteries can be discharged and recharged multiple
...

複数の要素をスクレイピングする

これまでのところ、Webクローラーはページからタイトルと1種類の要素を削り取っています。 Scrapyは、1つのスクリプトでさまざまなタイプの要素から情報を抽出することもできます。

週末のIMDb興行収入のトップヒットを抽出しましょう。この情報はから取得されます http://www.imdb.com/chart/boxoffice 、各メトリックの行を含むテーブル内。

NS parse() メソッドは、行から複数​​のフィールドを抽出できます。 Chromeデベロッパーツールを使用すると、テーブル内にネストされた要素を見つけることができます。

...
def parse(self, response):
for e in response.css('div#boxoffice>table>tbody>tr'):
yield {
'title': ''.join(e.css('td.titleColumn>a::text').extract()).strip(),
'weekend': ''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(),
'gross': ''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(),
'weeks': ''.join(e.css('td.weeksColumn::text').extract()).strip(),
'image': e.css('td.posterColumn img::attr(src)').extract_first(),
}
...

NS 画像 セレクターはそれを指定します img の子孫です td.posterColumn 。適切な属性を抽出するには、式::attr(src)を使用します。

スパイダーを実行するとJSONが返されます。

[
{'gross': '.8M', 'weeks': '1', 'weekend': '.8M', 'image': 'https://images-na.ssl-images-amazon.com/images/M/MV5BYWVhZjZkYTItOGIwYS00NmRkLWJlYjctMWM0ZjFmMDU4ZjEzXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UY67_CR0,0,45,67_AL_.jpg', 'title': 'Justice League'},
{'gross': '.5M', 'weeks': '1', 'weekend': '.5M', 'image': 'https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgtNDkzMC00YWJkLTk1NGEtYWUxNjhmMmQ5ZjYyXkEyXkFqcGdeQXVyMjMxOTE0ODA@._V1_UX45_CR0,0,45,67_AL_.jpg', 'title': 'Wonder'},
{'gross': '7.3M', 'weeks': '3', 'weekend': '.7M', 'image': 'https://images-na.ssl-images-amazon.com/images/M/MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI@._V1_UY67_CR0,0,45,67_AL_.jpg', 'title': 'Thor: Ragnarok'},
...
]

その他のWebスクレイパーとボット

Scrapyは、要求されたほぼすべての種類のWebクロールを実行できる詳細なライブラリです。 Pythonのサポートと組み合わせて、HTML要素で情報を見つけることになると、他に勝るものはありません。 Webクローラーを構築する場合でも、Webスクレイピングの基本について学習する場合でも、唯一の制限は、学習する意思がある量です。

クローラーやボットを構築する他の方法を探している場合は、 Pythonを使用してTwitterとInstagramのボットを構築する 。 PythonはWeb開発でいくつかの驚くべきものを構築できるので、この言語を探索するときはWebクローラーを超える価値があります。

共有 共有 つぶやき Eメール 知っておくべき15のWindowsコマンドプロンプト(CMD)コマンド

コマンドプロンプトは依然として強力なWindowsツールです。これは、すべてのWindowsユーザーが知っておく必要のある最も便利なCMDコマンドです。

次を読む
関連トピック
  • プログラミング
  • ウェブマスターツール
  • プログラミング
  • Python
  • コーディングチュートリアル
  • Webクローラー
著者について アンソニー・グラント(公開された40の記事)

Anthony Grantは、プログラミングとソフトウェアをカバーするフリーランスのライターです。彼は、プログラミング、Excel、ソフトウェア、およびテクノロジーに手を出しているコンピューターサイエンスの専攻です。

アンソニー・グラントのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください