HTMLスクレイピング

Webスクレイピング

WebサイトはHTMLを使用して書かれています。つまり、各Webページは構造化文書です。時には、それらからいくつかのデータを取得し、私たちがその間に構造を保存することは素晴らしいことでしょう。 Webサイトは、 csvjson などの快適な形式でデータを提供するとは限りません。

Webスクレイピングは、コンピュータプログラムを使用してWebページを調べ、必要なデータを、同時にデータの構造を保持しながら、最も便利な形式で収集するプラクティスです。

lxml と Requests

lxml はXMLやHTML文書を非常に素早く解析するために書かれた非常に広範囲なライブラリです。 また、速度と可読性が向上したため、すでに組み込まれているurllib2モジュールの代わりに Requests モジュールも使用します。 pip install lxmlpip install requests の両方を使って簡単にインストールできます。

インポートから始めましょう:

from lxml import html
import requests

次に、 requests.get を使ってデータを含むウェブページを取得し、 html モジュールを使って解析し、結果を tree に保存します:

page = requests.get('http://econpy.pythonanywhere.com/ex/001.html')
tree = html.fromstring(page.content)

page.text ではなく page.content を使用する必要があります。なぜなら、 html.fromstring は入力として bytes を暗黙的に期待しているからです。)

tree にはHTMLファイル全体がツリー構造で表示され、XPathとCSSSelectの2通りの方法があります。この例では、前者に焦点を当てます。

XPathは、HTMLやXML文書などの構造化文書に情報を配置する方法です。 XPathの良い紹介は、 W3Schools です。

FireBug for FirefoxやChrome Inspectorなどの要素のXPathを取得するためのさまざまなツールもあります。 Chromeを使用している場合は、要素を右クリックして 要素を検査 を選択し、コードを強調表示してもう一度右クリックし、 XPathのコピー を選択します。

簡単な分析の結果、このページのデータは2つの要素に分かれています.1つはdivというタイトルで、 buyer-name という名前のクラスと item-price というクラスのスパンです。

<div title="buyer-name">Carson Busses</div>
<span class="item-price">$29.95</span>

これを知ることで、正しいXPathクエリを作成し、lxmlの xpath 関数を以下のように使用することができます:

#This will create a list of buyers:
buyers = tree.xpath('//div[@title="buyer-name"]/text()')
#This will create a list of prices
prices = tree.xpath('//span[@class="item-price"]/text()')

私たちが正確に何を得たかを見てみましょう:

print 'Buyers: ', buyers
print 'Prices: ', prices
Buyers:  ['Carson Busses', 'Earl E. Byrd', 'Patty Cakes',
'Derri Anne Connecticut', 'Moe Dess', 'Leda Doggslife', 'Dan Druff',
'Al Fresco', 'Ido Hoe', 'Howie Kisses', 'Len Lease', 'Phil Meup',
'Ira Pent', 'Ben D. Rules', 'Ave Sectomy', 'Gary Shattire',
'Bobbi Soks', 'Sheila Takya', 'Rose Tattoo', 'Moe Tell']

Prices:  ['$29.95', '$8.37', '$15.26', '$19.25', '$19.25',
'$13.99', '$31.57', '$8.49', '$14.47', '$15.86', '$11.11',
'$15.98', '$16.27', '$7.50', '$50.85', '$14.26', '$5.68',
'$15.00', '$114.07', '$10.09']

おめでとう! lxmlとRequestsを使用して、Webページから必要なすべてのデータを正常に削除しました。 私たちはそれを2つのリストとしてメモリに格納しています。 今では、あらゆる種類のクールなことを行うことができます。Pythonを使用して解析するか、ファイルに保存して世界と共有できます。

このスクリプトを修正して、このサンプルデータセットの残りのページを繰り返したり、このアプリケーションを書き直してスレッドを使用して速度を向上させたりすることも考えられます。