レンタル掲示板 teacup.のデータを救出する

2022/04/23に公開1

レンタル掲示板のteacup.が8月1日で終了

90年代からインターネットを始めた人なら見かけたことはあると思う掲示板。
様々なサービスの黎明期にあって、残っていた老舗がサービス終了になるようです。

お知らせはわかったけど、バックアップは?

【重要なお知らせ】teacup. byGMOのサービス終了につきまして※追記あり(2022/3/25)(3月01日 14時00分)
いつもteacup.をご利用いただき、誠にありがとうございます。
長年にわたりご愛顧いただきましたteacup.ですが、2022年8月1日(月)13:00をもちまして、サービスを終了させていただくこととなりました。

昔からある掲示板に書き込んだログと送信した写真を取得するツールや方法は、特に用意されていないようで、自力で行うようですね。

掲示版の記事を他のサイトに移行したい
誠に恐れ入りますが、掲示板記事のデータ移行する機能は、弊社でも検討をさせていただきましたが、ご提供は難しいとの判断にいたりました。

https://support.teacup.com/hc/ja/articles/4544682345497-掲示版の記事を他のサイトに移行したい

どうやってデータ取得する??

コレ困る人多いと思いますよ、なんせ古参のひとや、お年寄りのコミュニティだったりするから。そんな人らに「・・・あんまり騒ぐな!・・・わかったな・・・」という内容はさすがにキツイ。

案の定、実家からなんとかしてほしいと連絡がありました。

pythonとseleniumがあれば、、なんとかできるかな、、、

本題の救出用のpythonコードです

簡単な仕様

  • teacup.から文章と写真を取得する
  • python(3.10.1)とseleniumを使ったスクレイピング
  • Chromeドライバを使って自動操作する

入出力

  • 入力:取得する掲示板のURL ・・(直接コードに記述)
  • 出力:ローカルPCに写真とテキストを取得

実行環境

  • OS:Windows
  • 開発環境:VSCode

動作方法

  1. 以下のソースコードをパイソン形式で、任意のフォルダに保存して下さい
 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. ★1に取得したい掲示板のアドレスを入れてください
 driver.get('https://XXXXX.teacup.com/YYYYYY/bbs')   
  1. VScodeで保存した.pyを実行します。
  • 環境の設定は各自お願いします。
  1. Chromeが自動起動して、取得処理が始まります。
    フォルダ内に次々写真が取得されていたり、★2のログが取得できていたらOKです

  2. 終了すると、下記のようにimgフォルダ内に投稿画像と、myfile.txtのテキストができあがります。写真名は上書きしないようにUUIDを混ぜた名前にしています。

 tcGetFile/
  ├  img
  │  └ aaa.jpg, bbb.jpg・・・・他
  ├ myfile.txt
  └ tc_Scraping.py

結果の確認方法

取得したい掲示板に戻って 最初と最後が取得して合っているか
テキストを使って確認してください。

おわりに

実装経験のない中で、見よう見まねで記述しました。
お気づきの人がいましたら、このコードを発展させていって
効率よく誰かの役に立っていただけたら幸いです。

Discussion