【Ruby】nokogiriでWikipediaから都道府県と県旗の画像をスクレイピング

Wikipedia的には「ページをスクレイピングするのは止めてね」って言ってるんですが、遊びがてらやってみたら実行できたのでノウハウ共有

コード的には下のようになってます。


class Scraping

require "nokogiri"
require "open-uri"

@base_url = "https://ja.wikipedia.org" (①)

# 画像の検索(県のロゴを検索)
def self.image_serch(url)
  doc = Nokogiri::HTML(open(@base_url+url))
  return doc.xpath("//a[@class = 'image']/img").attribute("src").value (④)
end

def self.category_serch
  # 日本の都道府県カテゴリURL
  url = "/wiki/Category:%E6%97%A5%E6%9C%AC%E3%81%AE%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C" (②)
  doc = Nokogiri::HTML(open(@base_url+url))
  doc.xpath("//div[@class = 'CategoryTreeItem']/a").each do |element|
  # 関係ないページを省く(県名の長さで排除)
  if element.text.length <= 4 (③)
    name = element.text
    image_url = image_serch(element[:href])
    link = element[:href]
    elements = Element.new(name: name, image_url: image_url, link: link)
    elements.save
  end
  end
end

category_serch
end

これをアプリケーションのmodelsでコンソール画面から実行すると、データベースにゴリゴリデータ取って来れます。

全体の流れをサクッと説明してみる。

①@base_urlにWikipediaのホームURLを指定。
②self.category_serchアクションで、Wikipediaのカテゴリ一覧から各都道府県のページを取得する。
③都道府県のカテゴリには、「戦前日本の府県の区‎」「日本の都道府県議会‎」みたいに、サブカテゴリの項目も含まれてしまうので、これを排除するために「名前を4文字以下」に設定。
(※あまり美しくないやり方ですが、問題ないですし、コード上はこれが一番シンプルかと。)
④探索した都道府県のページごとに、内部の画像データ(今回は県の旗の画像)を取ってくる。


こんな感じです。
本当は県の旗ではなく、サムネイルそのものを持って来たかったんですが、全然取ってこれず一旦断念。
指定するclassもないし、画像がリスト形式で表示されてるんで、うまいことタグで指定できないんだなぁ。

以下、注意事項です。

①そもそもWikipediaがページそのもののスクレイピングを推奨していない。
  (※ページに負荷がかかるため。都道府県レベルのデータ取得でやめておきましょう。)
②「self.image_serch(url)」と「self.category_serch」の順番が逆だとうまく行きません。。。なぜだろうか。
③今後、名前の長い都道府県が出てくると通用しない。笑


こんなところです。

ビッグデータやマーケティングの絡みもあり、スクレイピングクローラは今後重要な技術になると思います。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください