satewn-memo

だいたい技術っぽい雑記

Python3でWebスクレイピング・クローリング入門:Scrapy実践編

前回の入門編の続き。 今回はScrapyの公式ドキュメントに沿って、簡単なチュートリアルを解説する。

Scrapy導入

MacLinuxでpipが使える環境にあるなら、いつも通り

pip install scrapy

で問題ない。もしエラーが出たら

pip install twisted

でtwistedを導入してからやり直そう。

Windowsでまともにインストールしようとすると幾つもライブラリを追加しなければならなかったり、幾つもパスを通さなければいけなかったりと面倒くさいが、Anacondaに一任すれば問題なかった。Anaconda導入については他記事に任せる。

activate py35con

コマンドプロンプトで上記を入力し、Anacondaのcondaで作ったPython3.5環境に入る。 あとは以下のコマンドであっさりと導入できる。

conda install -c conda-forge scrapy

公式ドキュメントにも、Windowsを使用している場合はcondaで導入するのが一番良い方法だと書かれている。

Scrapyによるスクレイピングのテスト

適当な作業用ディレクトリに移動し、以下のコマンドを入力するとScrapyのプロジェクトが作成される(tutorialはプロジェクト名なのでなんでもよい)。

scrapy startproject tutorial

次に、Spiderを作成する。Spiderというのはどのページの情報をどのように抽出するかを定義するもの。 以下のようなサンプルファイルを用意し、quotes_spider.pyという名前で/tutorial/tutorial/spiderディレクトリに保存する。

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
    ]

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)

各自で作成するSpiderクラスはscrapy.Spiderを継承している必要がある。 このサンプルではquotesというサイトのページを二つ取得するが、抽出処理は行っておらず、ただ指定されたURLのHTMLコピーをローカルに作成するだけのものである。 Spiderを用意したら以下のコマンドで起動できる(上記コードのnameで指定した名前を使う)。

scrapy crawl quotes

コマンドラインにログが出力され、正しく終了していればtutorialディレクトリにquotes-1.htmlとquotes-2.htmlが作成されている。 これらのファイルは元のサイトのHTMLそのままだが、cssが無いためブラウザで開いても見た目が悪い。

先ほどのサンプルで、parseメソッドを書き換えることによってデータの抽出が出来る。

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.css('span small::text').extract_first(),
                'tags': quote.css('div.tags a.tag::text').extract(),
            }

このコードの動作を簡単に説明すると、

  • quoteというクラス名を持つすべてのdiv要素の子に対して
  • textというクラス名を持つspan要素のテキストを抽出し
  • span要素の子のsmall要素のテキストを抽出し
  • tagsというクラス名を持つdiv要素の子でかつ、tagというクラス名を持つa要素のテキストを抽出し
  • 辞書に格納する

ちなみにexctract_firstメソッドを用いると、条件にマッチした要素が存在しなくてもNoneを返してくれるためエラーにならない。 このようにSpiderを変更し、コマンドプロンプト

scrapy crawl quotes -o quotes.json

と入力してやると、所望の辞書がjsonとして出力される。 この他にも条件に合うリンクを辿り、その先でデータの抽出を行ったり、辿る深さなども設定できる。 これらのオプションは初めからScrapyに用意されており、複雑な記述をする必要がない。

Scrapy 実行の流れ

Scrapyのアーキテクチャ図を以下に示す(こちらの記事から拝借)。

Scrapy Architecture

Spiderが実行された時の処理の流れは以下のようになる。

  1. まず、start_urlsに含まれるURLを指すRequestオブジェクトがSpiderからSchedulerに渡される
  2. SchedulerはRequestをキューに溜める
  3. キューに追加されたオブジェクトは順にDownloaderに渡される
  4. DownloaderはWebページを取得し、Responseオブジェクトに格納し、それをSpiderに渡す
  5. Responseを引数としてparse()が呼び出される
  6. SpiderからItemや辞書が出力された場合はFeed Exporterへ、Requestが出力された場合はSchedulerに渡される
  7. 以上を繰り返し、キューからRequestがなくなれば実行完了

図にある各種ミドルウェアは、DownloaderやResponse, Requestに対する処理を拡張する役割をもつ。

おわりに

かなり駆け足になってしまったが、公式のチュートリアルに沿って簡単なスクレイピングを解説した。この短いコードだけではScrapyの強力さを説明しきれないので、是非いろいろとオプションなり拡張なり試してもらえると、楽しくスクレイピングが出来るはずだ。

Python3でWebスクレイピング・クローリング入門:基礎知識編

※もし間違っている部分がございましたら修正しますので、コメント等でお知らせ頂けると幸いです。

スクレイピングって、すごくワクワクする技術の割にそこまで取沙汰されていないような(気のせい?)。なので今回は、「なんかスクレイピング興味ある! やってみたい!」という方向けに、簡単な入門記事を基礎知識編・入門編に分けて書いてみることにした。Pythonを選んだのは個人的にスクレイピングに向いてて書きやすいと思ったから。ライブラリも沢山あるしね。

言葉の定義

そもそもスクレイピングって何ぞや? クローリングって言葉も聞くけどどう違うの?

  • クローリング・・・Webサイトのリンクを辿り、その内容を収集すること
  • スクレイピング・・・収集されたデータ(HTMLなど)を解析、抽出、整形、再利用すること

例えばある特定のWebページから情報を抜き出してゴニョゴニョするのがスクレイピング。あるドメイン全体や、不特定多数のWebページからどんどんリンクを辿っていくのがクローリング。Googleなんかはスクレイピング・クローリングの親玉。

環境について

Python向けのスクレイピング・クローリングのためのライブラリは数多くあり、単純な処理であればPython標準のモジュールでも対応できる。

ライブラリ名 用途
requests Webページの取得を行う。
BeautifulSoup HTMLを解析し、目的のデータを抽出できる。
Selenium フォームへの入力やクリックなど、ブラウザの操作を自動で行える。Javascriptレンダリングされているページでも対応できるのが強み。
Scrapy スクレイピングのためのフレームワーク。例えばrequestsとBeautifulSoupを組み合わせてやることをScrapyだけで行える。

Scrapyについて

Scrapyはここ最近人気上昇中のフレームワーク。情報も豊富で使い勝手も良さそうだが、ブラウザの自動操作は出来ない。 自動操作をしたい場合は、ScrapyとSelenuimを組み合わせて使う。

フレームワークであるScrapyを使うメリットをこちらから引用。

Scrapyを使わなくても、Seleniumだけでもスクレイピングはできるんだけど、

  • 並行処理で複数ページをスクレイピングしてくれる(マルチスレッド?プロセス?)、
  • 何ページクロールしたかとか、エラーは何回起こったかとか、ログをいい感じにまとめてくれる、
  • クロール対象ページの重複を回避してくれる、
  • クロールの間隔とか、いろんな設定オプションを提供してくれる、
  • CSSXPathを組み合わせて、DOMから情報を抜ける(組み合わせが結構便利!)、
  • クロール結果を、JSONとかXMLで吐き出せる、
  • いい感じのプログラム設計でクローラーを書ける(下手に自分で設計するより良いと思う)、

など、思いつくScrapyを使うメリットはこんな感じ。

次回は実際にScrapyを使って簡単なスクレイピングチュートリアルをやってみる。

ネットワーク系・OS系の国際カンファレンスまとめ

私用ですが。特にOS系については全く網羅しきれていない自信あり。


【OS系】

USENIX OSDI

Operating Systems Design and Implementation

ACM ASPLOS

Architectural Support for Programming Languages and Operating Systems

ACM SOSP

Symposium on Operating Systems Principles


【ネットワーク系】

ACM SIGCOMM

Special Interest Group on Data Communication

ACM SIGMETRICS

Special Interest Group on Measurement and Evaluation

ACM SIGKDD

Special Interest Group on Knowledge Discovery and Data Mining

IEEE INFOCOM

International Conference on Computer Communications

USENIX NSDI

Network Systems Design and Implementation


【分野が広く、OSやネットワークも含むもの】

USENIX ATC

Annual Technical Conference

EuroSys

The European Conference on Computer Systems

Xamarin.Forms の Android プロジェクトをビルドできない時のメモ

こんにちは。最近クロスプラットフォームアプリを製作する機会を得たため、せっかくだし Visual Studio 2015 に統合されることになったXamarinを使ってみようと色々セットアップをしていた。基本的にはytabuchiさんの

 

ytabuchi.hatenablog.com

 

この記事に従って進めていたが、Xamarin.Forms の Android ビルドで詰まってしまう。

 

スクショは撮り忘れたが、not exist や unzipping failed などいわゆる「あるはずのモノがない」系エラーが36個程度出た記憶がある(これでもエラーの数は少ない方なのでは……)。

当該記事に書いてあった Android SDK 5.1/6.0 を導入し、プロジェクトフォルダ内の bin/obj を消去する方法を試してみたものの変わらず。

 

StackOverFlow などを漁った結果、C:\Users\*****\AppData\Local\Xamarin フォルダ内のファイルを全削除する、という方法が上手くいった。多少強引な気もするがクリーン→リビルドすれば全て勝手にダウンロードし直してくれるので問題ない。

 

改めてデバッグ開始してみると……。

 

f:id:lct:20160429022150p:plain

 

よっしゃ。Android 単体のサンプルよりもシンプルなんだね。(あっちはボタンがついてた)

志方あきこさんの『caTra』発売記念ミニライブ&握手会に行ってきた

行って参りました。『caTra』発売記念イベント。当日一週間前になっても当選ハガキが届かず、外れちゃったかーと思いきや無事当選してた。

 

会場は新宿アニメイト地下二階のイベントホール。新宿アニメイト自体お初だったわけだけど、この場所は汎用イベントステージといった感じで、特段ライブ向きのホールって訳ではなかったかな。当選者は130人程で、イスが会場にぎゅうぎゅう詰めで並べられている。はがきと身分証明書による確認の後着席してしばらく待つ。客席側の照明が消え、バイオリニストとパーカッショニストのお二方、そして志方さんが入場。

 

2013年の『Turaida』発売記念イベントにもお邪魔させて頂いたのだが、その時よりは大人しめの格好だった。だがマシンガントークは相変わらずで、早速会場の雰囲気が緩む。僕もイベントでは緊張しがちなので、志方さんのトークには非常に和まされていた。

 

セットリストは以下の通り。

一曲目は『caTra』、二・三曲目は昨年九月に発売した『をかし』から。

 

ご本人の生歌を聴いたのは今回が初めてだが、やはり上手かった……。音源で聴くのと全く遜色ない透明感。来て良かった。もう一度コンサートが開催されれば必ず行くのだが……。

 

百鬼夜行』では早口の歌詞をミスらず歌い切るというチャレンジに挑戦したものの、見事敗北した志方さん。しかし僕はどこでトチってたのか気づかなかった。また、肝心の『caTra』が発売延期になったこともあり、ご本人曰く「『をかし』の発売記念イベントみたいで……すみません!」とのこと。客席から笑いが。

 

ミニライブ終了後、ゲストのお二方は退場しトークパートへ。ここでは『caTra』製作のモロモロを聞くことができた。延期の理由として、四曲目の『キオカイト』はもともとインスト曲の予定だったが、作っている途中で「これはヴォーカル曲にしろと曲が言っている!!」となってしまったらしく、急遽変更することに。三曲目の『螺旋の涙』も一応完成はしたものの雰囲気をもっと『caTra』の設定に近づけたいようで、こちらも再製作中らしい。

 

意外なことに新曲の試聴コーナーもあった。『ヒト型式PF試奏例α』はなんと志方さん初のアカペラ曲で、多重ボーカルが際立つ『caTra』のイメージそのままの曲。「人の声だけどまるで鍵盤を叩いているような」曲にしたかったとのこと。そして『螺旋の涙』……僕はオルゴールアルバムの『Petit Fours』(2002年)が大好きなのだが、この時までまさかこんな古いアルバムに収録されていた曲がボーカル版になるとは思ってもみなかった。びっくり。しかし先述の通り試聴バージョンは残念ながらお蔵入りとなってしまうらしく、「お土産として耳の中に入れて持ち帰ってください」と本人談。だが客席からの評判が良かったため、アニメイト限定特装版にもしかしたら追加されるかもしれない。この発言の後客席から拍手が湧いてしまい、引き下がるのは難しそうだけどどうなるんだろうか。というか特装版予約しときゃ良かったな。

 

最後に握手会。三言くらい交わさせて頂いた。にこやかでいい人だなあ……。

 

志方さんが作曲を担当される新プロジェクトもそろそろ発表になるそうで、そちらも気になるところだ。

『AR-拡張現実』を読んだ

技術的な事柄には全くといっていいほど触れていないという点で、この本はARの入門書ではない。

実際にARが使われたサービスを取り上げ、表現・コミュニケーション・都市空間など様々な面からARが私達にもらたす影響を考察してゆくスタイルで、良くも悪くも終始素朴な一冊だった。

刊行は2010年なので、内容の面では古く感じられる。2016年現在、この本で引用されている普及予想よりも大幅に速くスマートフォンが人々の手に渡ったにもかかわらず、著者が予測したほどAR業界が盛り上がりを見せていないことに気がつき、多少悲しくなってしまったけども、まだ勃興期だしね。仕方ない。

「ARが何かは知ってるんだけど、実際にどんなサービスがあるのかはよく知らない」って人にはお勧めかもしれない。

秋葉原が「姉ヶ崎寧々エアタグ」で埋め尽くされた事件なんてあっただんだね。知らなかった。ローソン主催の「ARエヴァ」も知らなかった。箱根のローソンの店名が「第3新東京市店」なのはもしかしてその時の名残なんだろうか。

AR-拡張現実 (マイコミ新書)

AR-拡張現実 (マイコミ新書)