Python で Mechanize と BeautifulSoup を使用して SNS をスクレイピングする。

シェアする

俺が普段使っているSNSの一つに ファンタジーアースSNS というのがあって、これは同名のゲーム(要約すると50人1チームで戦争するゲームです)と連動して戦争の成績が見れたり各国毎の統計が見れたりとなかなか便利な仕組みになってます。

ただ、各戦争毎に表示される個人成績や召還数といった値は各戦争結果ページでしか得られず、ゲーム内で参照できる戦績表示では今まで行った全ての戦争に対して行われる為、直近10件の戦争が見たいなどという場合には手で計算するとかしないといけなくて大変不便です。

というわけで SNS をスクレイピングして各値を拾って表示するスクリプトを組みました。全戦争読み込んだり平均値出したりとかは全然作りこんでないのでその辺は勝手に改良すると良いです。もっともこのSNSは大変重いのでスクリプトを実行する場合はアクセスの間隔あけるとかしてサーバに負荷が掛からない様に御願いします。

必要な物。
1)


2)
3)

Python は適当に用意してください。他のバージョンでも大丈夫だと思います。
Mechanize と BeautifulSoup は easy_install を使うのが楽で良いです。
Mechanize は WEB Browsing をするためのライブラリです。元は Perl モジュールの WWW:Mechanize です。Perlは知りません。
BeautifulSoup は HTML を解析するのに使います。

以下 Ubuntu での easy_install を使用した各ライブラリのインストール。

$ sudo easy_install mechanize
$ sudo easy_install BeautifulSoup

以下のサンプルでは今月の個人戦績を最大50戦分一覧で表示します。

import re
import mechanize
import BeautifulSoup
urltop = 'https://fesns.com/'
urllogin = 'https://fesns.com/?m=pc&a=page_o_login'
username = 'username'
password = 'password'
charactor_no = 1

br = mechanize.Browser()
br.open(urllogin)
br.select_form(name='login')
br['username'] = username
br['password'] = password
br.submit()
br.select_form(nr=charactor_no)
br.submit()
br.open('http://fesns.com/?m=fe&a=page_h_war_record_list')

bs = BeautifulSoup.BeautifulSoup(br.response().read())
for i in bs.findAll('tr'):
	a = i.findAll('a')
	if len(a) == 0:
		continue
	td = i.findAll('td')
	war_record_link = a[0].attrs[0][1]
	# continent, place, offense, defense, winner, datetime, permalink
	# print td[0].text, td[1].text, td[2].text, td[3].text, td[4].text, td[5].text, war_record_link
	seq = re.search(r'target_seq=([0-9]*)', war_record_link).group(1)
	# war record
	br.open(urltop + war_record_link.replace('&', '&').replace('./',''))
	bs = BeautifulSoup.BeautifulSoup(br.response().read())
	td = bs.findAll('div', {'class' : 'item'})[2].findAll('td')
	kill          = td[1].text
	dead          = td[3].text
	crystal       = td[5].text
	dam_player    = td[7].text
	dam_construct = td[9].text
	contribution  = td[11].text
	print 'kill:%s dead:%s crystal:%s dam_player:%s dam_construct:%s contribution:%s' % (kill, dead, crystal, dam_player, dam_construct, contribution)

出力結果例(ちなみに全部弓スカフル前線の成績です。)

kill:1 dead:1 crystal:13 dam_player:17207 dam_construct:986 contribution:16
kill:6 dead:2 crystal:18 dam_player:12343 dam_construct:236 contribution:60
kill:1 dead:0 crystal:47 dam_player:12841 dam_construct:349 contribution:50
kill:4 dead:0 crystal:6 dam_player:25924 dam_construct:1353 contribution:35
kill:2 dead:2 crystal:11 dam_player:18106 dam_construct:817 contribution:17
kill:2 dead:0 crystal:5 dam_player:26027 dam_construct:340 contribution:26
kill:1 dead:1 crystal:10 dam_player:22260 dam_construct:237 contribution:24
kill:0 dead:2 crystal:13 dam_player:27397 dam_construct:679 contribution:13
kill:0 dead:2 crystal:7 dam_player:23639 dam_construct:1035 contribution:20
kill:1 dead:0 crystal:6 dam_player:26389 dam_construct:599 contribution:23
kill:4 dead:0 crystal:9 dam_player:20337 dam_construct:1274 contribution:34
kill:2 dead:2 crystal:29 dam_player:16724 dam_construct:960 contribution:35
kill:0 dead:1 crystal:4 dam_player:20660 dam_construct:531 contribution:4

こんな感じで、BeautifulSoup と Mechanize を使用すると簡単にデータを引っ張ったりログインが必要な SNS とかでも楽にアクセスできます。超便利。

Sponsored Link

シェアする

フォローする