GIGAZINEの記事をPythonでスクレイピング

前回GIGAZINERSSをDBに保存した。今回はソースから本文を抽出してDBに保存する。

urllib2でソースを取得

リンクからソースを取得するには、urllib2.urlopen()を使うのが早い。 articleのlinkを渡す。取得したソースは、idをファイル名にして保存する。

def get_src(self, article):
    html = urllib2.urlopen(article['link'])
    src = html.read()

    f = open('../html/%s.html'%article['id'], 'w')
    f.write(src)
    f.close()

BeautifulSoupでソースをスクレイピング

ここが肝になる。4ステップを踏む。

  1. HTMLファイルの読み込み
  2. 本文の範囲を特定
  3. テキストの抽出
  4. クレンジング

1. 保存したHTMLファイルを読み込む

保存したソースをファイルとして読み込んだら、BeautifulSoupに渡す。 これはスクレイピングの準備。

soup = BeautifulSoup(src)

2. 本文の範囲を特定

Chromeデベロッパーツールを使うと、pタグでclass='preface'の範囲が記事になっていることが分かる。

f:id:Shoto:20161002003721p:plain 複数あるので、すべて取得しておく。

ps = soup.find_all('p', class_='preface')

3. テキストの抽出

2で取得したデータにはリンクや太字などのタグも含まれている。 そのため、タグをすべて取り除いたテキストのみを抽出するために、 次のメソッドに入れる。

# Extract the text from an HTML page (no tags)
def __getTextOnly(self, soup):
    v = soup.string  # Split by tags and check whether nested tags
    if v == None:  # If tags are nested
        c = soup.contents  # Eliminate outmost tags
        resulttext = ''
        for t in c:
            subtext = self.__getTextOnly(t)
            # If the subtext is null(u''), don't append it
            if len(subtext) > 0:
                resulttext += subtext + '\n'
        return resulttext
    else:
        return v.strip()  # Eliminate '\n'

ちなみにこのメソッドは集合知プログラミングで使われたテクニックの一つ。 結構使える。

集合知プログラミング

集合知プログラミング

4. クレンジング

3で抽出したテキストを見てみる。

By
Tony

お酒の飲み過ぎが体に悪いことは誰でも知っていることですが、
街で酔いつぶれている人
がいるように、自分では知らないうちに泥酔するほど飲み続けてしまうことがあります。お酒の席では「自分がどれだけ酔っ払っているか」をしっかり判断する必要があるわけですが、酔っ払いは自分が酔っ払っていることを正確に把握できないことが科学的に証明されました。
A rank based social norms model of how people judge their levels of drunkenness whilst intoxicated | BMC Public Health | Full Text
http://bmcpublichealth.biomedcentral.com/articles/10.1186/s12889-016-3469-z
Science shows that drunk people don’t know how drunk they are | Ars Technica
http://arstechnica.com/science/2016/09/science-shows-that-drunk-people-dont-know-how-drunk-they-are/
イギリスのカーディフ大学の研究チームは、ウェールズの首都カーディフのバーとクラブを巡って「お酒の席で飲んでいる人々が自分の『酔っ払い度』と飲酒がもたらす健康への影響をどれくらい判断できるか」ということを調査しました。研究チームは数カ月間にわたって毎週金曜日・土曜日の20時と3時にカーディフの異なる4つのエリアへ赴き、7番目に会った酔っ払いに調査の協力を依頼し、合計1862人の協力を得ることができました。この選択方法は「異なるグループから1人を無作為に選出するため」とのことです。
By
herooutoftime

依頼が承諾されると研究チームは協力者の呼気アルコールテストを行い、正確な酩酊レベルを記録。その後協力者に対して以下の4つの質問を行うという調査方法になっています。

とりあえず、いらないのは以下の4つぐらいなので、これらをルールベースで取り除いていく。

  • 空文字: u''(見えない)
  • 画像の引用元: By Tony
  • リンク: http://...
  • リンクタイトル: Science ... they are | Ars Technica
def __delete_not_text(self, text):
    text_ex = ''
    by = False
    for t in text.split('\n'):
        # nil string
        if t == u'':
            continue

        # by name
        if by == True:
            by = False
            continue
        if t == u'By' or t == u'by':
            by = True
            continue

        # link
        regex = 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
        urls = re.findall(regex, t)
        if len(urls) != 0:
            continue

        # link title
        if t.find(' - ') != -1:
            continue
        if t.find(' | ') != -1:
            continue

        # combine text
        text_ex += t

    return text_ex

処理後はちゃんとゴミが消えてることが分かる。

お酒の飲み過ぎが体に悪いことは誰でも知っていることですが、
街で酔いつぶれている人
がいるように、自分では知らないうちに泥酔するほど飲み続けてしまうことがあります。お酒の席では「自分がどれだけ酔っ払っているか」をしっかり判断する必要があるわけですが、酔っ払いは自分が酔っ払っていることを正確に把握できないことが科学的に証明されました。
イギリスのカーディフ大学の研究チームは、ウェールズの首都カーディフのバーとクラブを巡って「お酒の席で飲んでいる人々が自分の『酔っ払い度』と飲酒がもたらす健康への影響をどれくらい判断できるか」ということを調査しました。研究チームは数カ月間にわたって毎週金曜日・土曜日の20時と3時にカーディフの異なる4つのエリアへ赴き、7番目に会った酔っ払いに調査の協力を依頼し、合計1862人の協力を得ることができました。この選択方法は「異なるグループから1人を無作為に選出するため」とのことです。
依頼が承諾されると研究チームは協力者の呼気アルコールテストを行い、正確な酩酊レベルを記録。その後協力者に対して以下の4つの質問を行うという調査方法になっています。

以上の4ステップをまとめると、次のようになる。

def get_text(self, article):
    f = open('../html/%s.html'%article['id'])
    src = f.read()
    f.close()

    # 1. HTMLファイルの読み込み
    soup = BeautifulSoup(src)
    # 2. 本文の範囲を特定
    ps = soup.find_all('p', class_='preface')
    # 3. テキストの抽出
    text = ''.join([self.__getTextOnly(p) for p in ps])
    # 4. クレンジング
    text_ex = self.__delete_not_text(text)

    return text_ex

まとめ

前回RSS取得と今回の記事本文スクレイピングをまとめると次のようになる。

def main(self):
    rss = self.get_rss()
    self.save_db(rss)

    rss = self.read_db()
    for i in range(len(rss)):
        article = rss[i]
        self.get_src(article)
        text = self.get_text(article)
        article['text'] = text
    self.save_db(rss)

スクレイピング結果は次の通り。

    rss = self.read_db()        
    for article in rss[:3]:
        print 'title:\t', article['title']
        print 'link:\t', article['link']
        print 'text:\t', article['text']
        print
title:   酔っ払いは自分がどれくらい酔っ払っているか正確に判断できないことが科学的に判明
link:   http://gigazine.net/news/20161001-drunk-people-dont-know-how-drunk/
text:   お酒の飲み過ぎが体に悪いことは誰でも知っていることですが、街で酔いつぶれている人がいるように、自分では知らないうちに泥酔するほど飲み続けてしまうことがあります。お酒の席では「自分がどれだけ酔っ払っているか」をしっかり判断する必要があるわけですが、酔っ払いは自分が酔っ払っていることを正確に把握できないことが科学的に証明されました。イギリスのカーディフ大学の研究チームは、ウェールズの首都カーディフのバーとクラブを巡って「お酒の席で飲んでいる人々が自分の『酔っ払い度』と飲酒がもたらす健康への影響をどれくらい判断できるか」ということを調査しました。研究チームは数カ月間にわたって毎週金曜日・土曜日の20時と3時にカーディフの異なる4つのエリアへ赴き、7番目に会った酔っ払いに調査の協力を依頼し、合計1862人の協力を得ることができました。この選択方法は「異なるグループから1人を無作為に選出するため」とのことです。依頼が承諾されると研究チームは協力者の呼気アルコールテストを行い、正確な酩酊レベルを記録。その後協力者に対して以下の4つの質問を行うという調査方法になっています。1:あなたは今どれくらい酔っていますか?1(全くの冷静)~10(完全に泥酔)で答えて下さい。2:今夜はどれくらい飲みましたか?1(全然飲んでいない)~10(完全に極限まで)で答えて下さい。3:もし毎週末に今夜と同じくらい酔っ払ったら今後15年でどれくらい健康に不調を来すと思いますか?1(絶対に不調を来さない)~10(確実に不調を来す)で答えて下さい。4:もし毎週末に今夜と同じくらい酔っ払ったら今後15年でどれくらいの可能性で肝硬変になると思いますか?1(絶対にならない)~10(確実になる)で答えて下さい。深夜にクラブやバーで楽しく遊んでいたら、突如として研究員が上記のような質問をしてくるという状況はまるで冗談のようですが、呼気アルコールテストの結果と質問の回答を比較した結果、「お酒の席」で飲んでいる人々は実際に血中アルコール濃度を正確に把握しておらず、回りの人々の状態に基づいて「もっと飲むかどうか」という判断を下していることが判明しました。今回の調査で酔っ払っている人は周囲の人を見て自分の状態を過小評価してしまう可能性が高いことがわかっています。パーティーで泥酔してブラックアウトした人を見たことがある人もいると思いますが、その時に酔いが覚めて「自分は冷静だ」と感じたことがあるはず。このことから人々は「最も酔っ払っている人」を基準にするのではなく、「最も酔っ払っていない人」を見て自分の状態を認識する傾向があることがわかっています。この傾向から「お酒の席」で全員がお酒を飲んでいると「最も酔っ払っていない人」の最低値がどんどん上がっていくため、飲み過ぎる人が増えてしまいます。そのためお酒を飲まないハンドルキーパーのような人を増やせば、飲み過ぎを抑制できる可能性があると研究チームは予想しています。

title:  BMWが変形して人型ロボットになるリアルトランスフォーマー「Letrons」のムービー
link:   http://gigazine.net/news/20161001-real-transformer/
text:   映画「トランスフォーマー」のように何の変哲もないBMWが変形しまくってロボットになる様子を収めた驚きのムービーをYouTubeで見ることができます。ピカピカのBMWが登場。ススーっと徐行で進んでいきます。自動車が進んだ先にいた男性の手にはコントローラーが握られており、どうやら車内は無人で運転している様子。すると突如としてドアがウイーンと展開し始め……車体が持ち上がり始めました。二足歩行のロボットへと変形していきます。ボンネットからは頭部も出現。足の間から煙を出したり……腕や指を動かしたりできるようです。一通りアクションを披露すると、また車体が下がり始めました。あっという間に元通りのBMWに。そのまま元の場所まで戻っていきました。なお、この自動車はトルコのLetvisionという会社が開発した「Letrons」という製品で、価格は公開されていないものの、消費者向けに販売することも可能とのこと。Letronsはコントローラーで操作して移動させたり、変形させたりすることが可能ですが、人間が乗って運転することはできないそうです。ほかにも異なる自動車をベースにした4種類のリアルトランスフォーマーも開発されています。Letrons

title:  スペイン統治時代の名残りが感じられるフィリピン・バコロドの名士の邸宅跡「The Ruins」に行ってきました
link:   http://gigazine.net/news/20161001-ruins/
text:   フィリピンでも治安の良さで知られる田舎町バコロド。そのバコロドで最も有名で地元の人の誇りにもなっている観光スポットが、かつてのサトウキビ農園の大地主が建てた邸宅の跡「The Ruins(ルインズ)」です。Ruinsは300年以上も続いたスペイン統治時代を感じさせる建物でした。バコロド市内のメインストリートであるラクソン通りから自動車で約20分ほど東に行ったところにRuinsがあります。道中はサトウキビ畑が広がる農園なので、荷台の付いたバイク(トライシクル)で行くのもアリ。入場料は大人が95ペソ(約200円)入り口から入った一本道を隔てると……広々とした公園が広がっています。手入れの行き届いた芝生はとても爽快。北側には石でできたモニュメントがありました。石の柱の上に大きな石が乗っかっています。なお、モニュメント裏は公衆トイレになっていました。モニュメントから見た光景。西日が差す光景もなかなかです。公園には小川も流れています。小川のそばにあるベンチはスピーカー付き。音楽を聴きながらのんびりくつろぐのも良さそうです。公園をあとにして一本道を歩くと、大きな建物が見えてきました。入り口はこんな感じ。建物の前に、入り口のアイスクリームが気になります。フレーバーは3種類。定番のマンゴーアイスはかなり美味。アイスクリーム以外にもフランクフルトやサンドウィッチなどもありました。アイスクリームで一息ついたらいよいよRuinsへ。これがバコロドの名産であるサトウキビ農園を取り仕切っていた地元有数の名士Don Mariano Ledesma Lacson氏が建てた大邸宅跡「Ruins」階段を上ると……2階への立ち入りは禁止に。老朽化のため2階へは上がれないようになっています。広々とした大邸宅はコンクリート造り。左が主のMariano氏で右が妻のMaria Braga氏。残念ながら、Maria氏はこの大邸宅が完成する前に亡くなってしまったとのこと。イタリア建築のデザインを取り込んだ大邸宅は、アメリカ統治や第二次世界大戦中に旧日本軍の攻撃を受けたりしたため、破壊されてしまいました。しかし、最高級グレードのコンクリートで作られた建物は戦禍をくぐり抜け、決して朽ち果てることはありませんでした。戦後、大補修を経て、現在はバコロドを代表する名所として生まれ変わっています。広間では、地元では人気のテレビキャスターRoger Lucero氏による軽妙な語り口の英語による名物ガイドに、観光客が釘付けになっていました。館内には主たちの衣装や……かつての写真などが飾られていました。ちなみに観光地らしくお土産コーナーも充実しています。Ruinsは夜にライトアップされます。地元の人は夕暮れから夜にかけてのRuinsが一番美しいと言っていました。美しい空間はデートに場所としても人気。バコロドを訪れたからには外すことのできないスポットとなっていました。

リンクタイトルにまだ不備があるが、だいたい上手くいってる。 これでGIGAZINEの記事がDBに保存することができた。