読者です 読者をやめる 読者になる 読者になる

のぶLab.

流しのソフトウェアエンジニアの雑記帳. Android, Scala, Clojure, Ruby on Railsなど

PythonのクローラフレームワークScrapyを使ってみた(Mac OS X Maverics)

pythonでクローラを作成するためのフレームワークscrapyを使ってみました。

http://doc.scrapy.org/en/latest/index.html

これを使って下の情報をjsonで保存してみます。

http://www.google.co.jp/movies?near=%E6%B8%8B%E8%B0%B7

まずはscrapyのインストール

$ sudo pip install Scrapy


インストールが完了したら、早速プロジェクトを作成してitem.pyを編集します。

$ scrapy startproject movie_spider
$ cd movie_spider
$ vim movie_spider/items.py

items.pyにはサイトから取得するデータを格納するための変数を定義しておきます。

from scrapy.item import Item, Field

class MovieSpiderItem(Item):
        theater = Field()

次にmovie_spider/spiders/MovieSpider.pyにサイトから情報を取得する処理を記述します。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http.request import Request
from movie_spider.items import MovieSpiderItem

class MovieSpider(BaseSpider):
    name = "google"
    allowed_domains = ["www.google.co.jp"]
    start_urls = ["http://www.google.co.jp/movies?near=%E6%B8%8B%E8%B0%B7"]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select("//div[@class='theater']")
        items = []
        for site in sites:
                item = MovieSpiderItem()
                item["theater"] = site.select('div/h2/a/text()').extract()
                items.append(item)
        for item in items:
                yield item

ここではclass名が"theater"のdiv要素を取得し、
その子要素から映画館の名前を出力します。

以下のように実行すると結果をmovie.jsonに保存します。

scrapy crawl google -o movie.json -t json


ソースコードはこちらで公開しています。
https://github.com/atsuya046/MovieSpider