レンタル掲示板 teacup.のデータを救出する
レンタル掲示板のteacup.が8月1日で終了
90年代からインターネットを始めた人なら見かけたことはあると思う掲示板。
様々なサービスの黎明期にあって、残っていた老舗がサービス終了になるようです。
お知らせはわかったけど、バックアップは?
【重要なお知らせ】teacup. byGMOのサービス終了につきまして※追記あり(2022/3/25)(3月01日 14時00分)
いつもteacup.をご利用いただき、誠にありがとうございます。
長年にわたりご愛顧いただきましたteacup.ですが、2022年8月1日(月)13:00をもちまして、サービスを終了させていただくこととなりました。
昔からある掲示板に書き込んだログと送信した写真を取得するツールや方法は、特に用意されていないようで、自力で行うようですね。
掲示版の記事を他のサイトに移行したい
誠に恐れ入りますが、掲示板記事のデータ移行する機能は、弊社でも検討をさせていただきましたが、ご提供は難しいとの判断にいたりました。
どうやってデータ取得する??
コレ困る人多いと思いますよ、なんせ古参のひとや、お年寄りのコミュニティだったりするから。そんな人らに「・・・あんまり騒ぐな!・・・わかったな・・・」という内容はさすがにキツイ。
案の定、実家からなんとかしてほしいと連絡がありました。
pythonとseleniumがあれば、、なんとかできるかな、、、
本題の救出用のpythonコードです
簡単な仕様
- teacup.から文章と写真を取得する
- python(3.10.1)とseleniumを使ったスクレイピング
- Chromeドライバを使って自動操作する
入出力
- 入力:取得する掲示板のURL ・・(直接コードに記述)
- 出力:ローカルPCに写真とテキストを取得
実行環境
- OS:Windows
- 開発環境:VSCode
動作方法
- 以下のソースコードをパイソン形式で、任意のフォルダに保存して下さい
tcGetFile/
└ tc_Scraping.py
↓ソースコード
from selenium import webdriver
import uuid
import requests
import os
# WebDriverのインスタンス作成
driver = webdriver.Chrome()
# URLを指定してブラウザを開く★1
driver.get('https://XXXXX.teacup.com/YYYYYY/bbs')
txt = driver.find_element_by_xpath('//*[@id="contents"]/center[2]/table/tbody/tr/td[2]/form[1]').text
maxPage = int(txt.replace('/', '').replace(' ', ''))
maxPage += 1
# フォルダ名
new_path = "img"
# フォルダがないとき、フォルダ名を作成
if not os.path.exists(new_path):
os.mkdir(new_path)
fileBufStr = ""
# 掲示板の表示ページ毎に実行
for i in range(1, maxPage):
pageNum = driver.find_element_by_xpath('//*[@id="contents"]/center[2]/table/tbody/tr/td[2]/form[1]/input[1]')
pageMov = driver.find_element_by_xpath('//*[@id="contents"]/center[2]/table/tbody/tr/td[2]/form[1]/input[2]')
# 掲示板の書き込み領域内の指定
for element in driver.find_elements_by_xpath('//*[@id="contents"]/table'):
# 要素のinnerTextを出力
fileBufStr += element.text
fileBufStr += "\n"
print(element.text) # 書き込みテキスト確認ログ ★2
# 画像を特定してローカルに保存
imgs = element.find_elements_by_tag_name('img')
for index, img in enumerate(imgs):
imgurl = img.get_attribute('src')
imgfile = imgurl.split('/')[-1].replace('M', '')
src = "/".join(imgurl.split('/')[:-1]) + "/" + imgfile
responce = requests.get(src)
with open("img/" + "{}".format( str(uuid.uuid4())[:6] + imgfile ), "wb") as f:
f.write(responce.content)
# 次のページに移動
pageNum.send_keys()
pageNum.send_keys( str( i+1 ) )
pageMov.click()
# 全ページのテキストを1枚テキストに保存
f = open('myfile.txt', 'w',encoding='utf-8', errors='ignore')
f.write(fileBufStr)
f.close()
# WebDriverを終了
driver.close()
driver.quit()
- ★1に取得したい掲示板のアドレスを入れてください
driver.get('https://XXXXX.teacup.com/YYYYYY/bbs')
- VScodeで保存した.pyを実行します。
- 環境の設定は各自お願いします。
-
Chromeが自動起動して、取得処理が始まります。
フォルダ内に次々写真が取得されていたり、★2のログが取得できていたらOKです -
終了すると、下記のようにimgフォルダ内に投稿画像と、myfile.txtのテキストができあがります。写真名は上書きしないようにUUIDを混ぜた名前にしています。
tcGetFile/
├ img
│ └ aaa.jpg, bbb.jpg・・・・他
├ myfile.txt
└ tc_Scraping.py
結果の確認方法
取得したい掲示板に戻って 最初と最後が取得して合っているか
テキストを使って確認してください。
おわりに
実装経験のない中で、見よう見まねで記述しました。
お気づきの人がいましたら、このコードを発展させていって
効率よく誰かの役に立っていただけたら幸いです。
Discussion