毎日テキストマイニング

180日間、毎日テキストマイニングをするブログです

2018/7/25【32日目】Pythonでブログをクローリングさせる:その2

その1からの続きです。どうもこの頃日にちをまたいでしまいますね(仕事が忙しい、、、)。

その1で躓いたh3タグの中を取得するには、そのまま変数をprintすれば良いだけでした。こんな感じです。

for link in soup.find_all('h3'):
    print(link)

実行結果

<h3 class="skin-widgetTitle" data-uranus-component="widgetTitle" lang="en">Profile</h3>
<h3 class="skin-widgetTitle" data-uranus-component="widgetTitle" lang="en">Recent Entries</h3>
<h3 class="skin-widgetTitle" data-uranus-component="widgetTitle" lang="en">Theme</h3>
<h3 class="skin-widgetTitle" data-uranus-component="widgetTitle" lang="en">Archives</h3>
<h3 class="skin-widgetTitle" data-uranus-component="widgetTitle" lang="en">Readers</h3>

とはいえ、別に欲しいのはh3タグではないので、続けていきます。

Google Chormの検証機能でブログのエントリーのタイトルはh2に入っていることがわかりました。 f:id:rimt:20180727023423p:plain

h2を取得してみます。

for link in soup.find_all('h2'):
    print(link)

実行結果。

<h2 data-uranus-component="entryItemTitle"><a class="" href="/saho-iwatate/entry-12392720547.html">大事なこと</a></h2>
<h2 data-uranus-component="entryItemTitle"><a class="" href="/saho-iwatate/entry-12389250032.html">はむっと</a></h2>
<h2 data-uranus-component="entryItemTitle"><a class="" href="/saho-iwatate/entry-12387116933.html">まさか…</a></h2>
(以下、省略)

あとはh2タグのtextを抜き出せばタイトルは得られるはずです。

h2 = soup.find_all('h2')
for title in h2:
    print(title.text)

実行結果。

大事なこと
はむっと
まさか…
おもちゃの夏
朝なのか夜なのか
世界選抜総選挙
君は僕の風
(以下、省略)

ブログの各エントリーのタイトルを取得できました。 どうでもいいですけど、ずいぶんシンプルなタイトルですね。

エントリーのタイトルも取得できて、スクレイピングにも慣れてきたところで、やっと本題のクローリングをしていきたいと思います。 ひとまずURLの取得は昨日の時点でわかっていますので、リストに格納します。

links =[]
for link in soup.find_all('a'):
    url = link.get('href')
    links.append(url)

リストの中を見てみましたら、新しいエントリーのURLは13番目以降からありましたので、スライドさせて表示させてみます。

links[12:20]
['/saho-iwatate/entrylist.html',
 '/saho-iwatate/archive-201807.html',
 '/saho-iwatate/theme-10100573339.html',
 '/saho-iwatate/amemberentrylist.html',
 '/saho-iwatate/entry-12392720547.html',
 '/saho-iwatate/entry-12392720547.html',
 '/saho-iwatate/entry-12392720547.html#cbox',
 '/saho-iwatate/theme-10100573339.html']

うまくできてそうですね。 それで、実際の各エントリーのURLはこんな感じになっています。

https://ameblo.jp/saho-iwatate/entry-○○○○○○.html

これをコード上で指定するには、

https://ameblo.jp/ + (list[i])

とやれば良さそうな気がします。14日目でやったこの形ですね。

for content in os.listdir('test'):
    with open('test/' + content, 'r') as read_file, 

dailytextmining.hatenablog.com

この時使ったコードをアメブロのURlの形に合わせて書き直してみます。

for urls in links[12:20]:
    print("https://ameblo.jp/" + urls)

実行結果。

https://ameblo.jp//saho-iwatate/entrylist.html
https://ameblo.jp//saho-iwatate/archive-201807.html
https://ameblo.jp//saho-iwatate/theme-10100573339.html
https://ameblo.jp//saho-iwatate/amemberentrylist.html
https://ameblo.jp//saho-iwatate/entry-12392720547.html
https://ameblo.jp//saho-iwatate/entry-12392720547.html
https://ameblo.jp//saho-iwatate/entry-12392720547.html#cbox
https://ameblo.jp//saho-iwatate/theme-10100573339.html

しっかりとアクセスできるURLを取得できました。

それで、これをさっきのコードに代入すれば良いので、こんな感じかと思います。テキストを出力すると、すごい量になりそうなので、まずはタイトルだけをprintしてみます。

for urls in links[12:20]:
    entry_url = "https://ameblo.jp/" + urls
    req = urllib.request.urlopen(entry_url)
    soup = BeautifulSoup(req.read(), "lxml")
    print("title.string:" + str(soup.title.string)) 

実行結果。

title.string:ブログ記事一覧|AKB48 岩立沙穂オフィシャルブログ「発声練習、はじめま~す♪」Powered by Ameba
title.string:2018年07月のブログ|AKB48 岩立沙穂オフィシャルブログ「発声練習、はじめま~す♪」Powered by Ameba
title.string:ブログ|AKB48 岩立沙穂オフィシャルブログ「発声練習、はじめま~す♪」Powered by Ameba
title.string:アメンバー記事一覧|AKB48 岩立沙穂オフィシャルブログ「発声練習、はじめま~す♪」Powered by Ameba
title.string:大事なこと | AKB48 岩立沙穂オフィシャルブログ「発声練習、はじめま~す♪」Powered by Ameba
title.string:大事なこと | AKB48 岩立沙穂オフィシャルブログ「発声練習、はじめま~す♪」Powered by Ameba
title.string:大事なこと | AKB48 岩立沙穂オフィシャルブログ「発声練習、はじめま~す♪」Powered by Ameba
title.string:ブログ|AKB48 岩立沙穂オフィシャルブログ「発声練習、はじめま~す♪」Powered by Ameba

どのページに行っているのかよくわかりませんが、うまく各ページを回れているみたいです。 とりあえず、今日はここまで。

今日の結果

今日のAKBメンバーによる呟きは50件でした。なかなか多いですね。どんなことが呟かれていたのでしょう? f:id:rimt:20180727023611p:plain

'楽しい': 6, '嬉しい': 5, '可愛い': 5, 'よい': 3, 'あやい': 2, 'かわいい': 2, 'うい': 1, 'ない': 1, 'くい': 1, '眠たい': 1, 'すっごい': 1, '優しい': 1, '心強い': 1, '無い': 1, '早い': 1, 'ダサい': 1, '美しい': 1, '良い': 1, 'おしい': 1, '面白い': 1, 'おかしい': 1, 'ちっちゃい': 1, 'いい': 1, 'かっこいい': 1, 'すごい': 1, '暑い': 1})
'ちゃん': 11, '時': 9, 'さん': 9, '夏': 8, '日': 7, '楽しい': 6, '今日': 6, '嬉しい': 5, '可愛い': 5, '皆さん': 5, '目': 5, 'ん': 5, 'うた': 4, 'まつり': 4, 'センチメンタルトレイン': 4, '学園': 4,
'する': 20, 'ちゃん': 11, '見る': 11, 'くださる': 11, '観る': 10, '時': 9, 'さん': 9, 'くる': 9, '夏': 8, 'なる': 8, '日': 7, 'てる': 7, '楽しい': 6, '今日': 6, 'れる': 6, '嬉しい': 5, '可愛い': 5, '皆さん': 5, '目': 5,

うーん、呟き件数が多い理由がよくわからないですね。そろそろ違う可視化をしたいです。。。。