Metacriticは、音楽アルバム、ゲーム、映画、テレビ番組、DVDのレビューを収集する英語のアグリゲーターサイトです。 (ウィキペディアから)。
使用されるライブラリ:
lxml 、
asyncio 、
aiohttp (lxml-Pythonを使用してHTMLページを解析するためのライブラリ。非同期と迅速なデータ抽出のためにasyncioとaiohttpを使用します)。 また、XPathを積極的に使用します。 誰がそれが何であるか知らない、素晴らしい
チュートリアル 。
すべてのゲームのページへのリンクを取得する
まず、小さなペンで作業する必要があります。
www.metacritic.com/browse/games/genre/metascore/action/all?view=detailedにアクセスして、すべてを収集します
このリストのURL:

そして、それらをgenres.jsonという.jsonファイルに保存します。 これらのリンクを使用して、サイトのすべてのゲームをジャンル別に解析します。
少し考えた後、ゲームへのすべてのリンクを.csvファイルに収集し、ジャンルに分類することにしました。 各ファイルには、ジャンルに対応する名前が付けられます。 上記のリンクに移動すると、すぐにアクションジャンルのページが表示されます。 ページネーションがあることに気づきます。
htmlページを確認します。

最大ページ数を含む目的の要素
aは、一意の属性
class = page last_pageを持つ
li要素の子孫であり、最初のページを除くすべてのページの
URLが <url of the 1st page> + <&page = page_number>、およびリクエストパラメータの2番目のページは1番です。
最大ページ番号を取得するためにXPathをまとめる:
// li [@ class = 'page last_page'] / a / text()次に、このシートからすべてのゲームへのすべてのリンクを取得する必要があります。

シートのレイアウトを見て、htmlを調べます。

最初に、リスト自体
(ol)を検索のルート要素として取得する必要があります。
class = list_products list_product_summaries属性があり、これはページのhtmlコードに固有です。 次に、
liには、ゲームへの目的のリンクがある
href属性に子要素aを持つ子要素
h3があることがわかります。
すべてをまとめる:
// ol [@ class = 'list_products list_product_summaries'] // h3 [@ class = 'product_title'] / a / @ hrefいいね! 戦いの半分は完了しました。次に、プログラムでページをループし、リンクを収集してファイルに保存する必要があります。 高速化するために、PCのすべてのコアで操作を並列化します。
すべてのファイルとリンクを1つのファイルにマージします。 Linuxの場合は、catを使用して、STDOUTを新しいファイルにリダイレクトするだけです。 Windowsでは、小さなスクリプトを作成し、ジャンルファイルのあるフォルダーで実行します。
from os import listdir from os.path import isfile, join onlyfiles = [f for f in listdir('.') if isfile(join(mypath, f))] fout=open("all_games.csv","a") for path in onlyfiles: f = open(path) f.next() for line in f: fout.write(line) f.close() fout.close()
これで、Metacriticのすべてのゲームへのリンクを含む1つの大きな.csvファイルができました。 十分に大きい、25,000レコード。 さらに、1つのゲームが複数のジャンルを持つことができるため、重複があります。
すべてのゲームに関する情報を取得する
次の計画は? 各リンクをたどり、各ゲームに関する情報を抽出します。
たとえば、
Portal 2ページに移動します。
取得します:
- ゲーム名
- プラットフォーム
- 説明
- メタスコア
- ジャンル
- 発売日
投稿を短くするために、この情報を抽出したxpathをすぐにリストします。
ゲーム名:
// h1 [@ class = 'product_title'] // span [@ itemprop = 'name'] // text()複数のプラットフォームを使用できるため、2つのクエリが必要です。
// span [@ itemprop = 'device'] // text()// li [@ class = 'summary_detail product_platforms'] // a //テキスト()私たちが持っている説明は要約にあります:
// span [@ itemprop = 'description'] // text()メタスコア:
// span [@ itemprop = 'ratingValue'] // text()ジャンル:
// span [@ itemprop = 'description'] // text()発売日:
// span [@ itemprop = 'datePublished'] // text()25,000ページあり、頭を抱えていることを思い出します。 どうする 複数のスレッドがあっても長くなります。 解決策があります-非同期および非ブロッキングコルーチン。
PyConのすばらしいビデオをご覧ください 。 Async-awaitは、Python 3.5.2の非同期プログラミングを簡素化します。
Habréのチュートリアル 。
パーサー用のコードを書いています。
from time import sleep import asyncio from aiohttp import ClientSession from lxml import html
私のコンピューターIntel i5 6600K、16 GB RAM、lan 10 mb / sでは、10ゲーム/秒あたりのどこかで非常にうまくいきました。 コードを微調整して、スクリプトを音楽や映画に適合させることができます。