それは月明かりもなく、風雨が激しく、何も見えない暗い夜でした。何か起こりそうな予感がしました。
「事故」とパンデミックの影響で、私は一時的に「植物状態」になり、二次元の世界に旅立つ寸前でしたが、幸いにも「救出」されました。この数年間、私を探してくれたメッセージも受け取れていません。まだ私を気にかけてくれている方々に感謝します。ありがとうございます。
悪いのは私ではなく、この運命づけられた世界なのです。
この数年間、私を探してくれた人々や出来事についても、私は全く知りません。QQやWeChatのメッセージも、長期間受け取れていません
何年も更新されていなかった私のアイコンが再び点灯したのを見て、多くの友人がどうしたのかと尋ねてきました。会ったことのないネット上の友人たちに、いや、友人という方が親しい呼び方かもしれませんね、感謝しています。あなたがたが私のことを覚えていてくれたことに、私はとても感動しています。
探し続けてくれたこと、三年
世界中を探してくれた
感動して言葉になりません。以下が本文です。
ブログについて
ブログが初めて開設されたのは2016年6月9日です。もうすぐ8年になります。様々な困難の中でも、たくましく生き残ってきました。この間、たくさんの仲間と出会い、一緒に議論し、共に進歩し、共に成長してきました。だから、このブログをここで終わらせたくありません
ブログのデータは元々七牛雲に自動バックアップされていましたが、今になって知ったのですが、何らかの理由で19年10月頃にバックアップが停止していました。「インターネットには記憶がある」と言われますが、「頭は断たれても血は流れても、データは失ってはならない」という精神で、数日間、広大なインターネットを探し回り、ついにブログのウェブサイトアーカイブを見つけました。私のブログの過去のバージョンはこちらからご覧いただけます archive
(有名なウェブサイトアーカイブプロジェクトです)
そこで、記事とコメントのデータをスクレイピングするPythonスクリプトを作成しました。スクレイピングした後、すでに誰かがバックアップしてくれていることに気づきました(私のブログは以前3年間、誰かにスポンサーしてもらっていました)。
ブログの移転
ブログを博客園に移転したのは、やむを得ない選択でした。
ブログの元のドメイン(52ecy.cn, moeins.cn, moeins.com)が期限切れ後に他人に取得されてしまい、交渉しても取り戻すことができませんでした。やむを得ず、一時的に博客園にブログを移転することにしました(将来的に自分で構築するかどうかは検討中です)。また、現在では自分のシステムをいじる時間がそれほどなく、博客園に置く方がより手間がかからず楽かもしれません。しかし、コメントはそれほど便利ではなく、投稿するにはログインが必要です。もちろん、何か問題があればグループで私にメンション
してください。
実は、18年末にはすでにテーマを変更したいと考えていました -> 今度こそ本当に延期します
(私は本当に遅延癖があります、自分に感心します)。しかし、以前のemlogシステムには適切な既成テーマがなく、自分で移植するのが面倒だったので、ずっと延期していました。
以前のテーマは、見た目が良くなく、個性に欠け、ただ真面目なだけで、私の個性やスタイルに合わないと思っていたので、ずっと変えたいと思っていました。しかし、私の美的センスは素晴らしいのですが、私の美意識に合ったテーマを自分で一から書くとなると、少し難しいのです。
その後、博客園ユーザーの不忘编码
さんのブログを偶然見て、博客園でもこのように自分で美化できることを知りました。「私のブログも失われたり、アクセスできなくなったりするのは嫌だ」という思いから、一時的に博客園に移行することを決めました。
ずっとこのような二次元風のテーマに変えたかったのです。現在、このブログの美化スタイルは、桜荘のペットな彼女
のWordPressテーマSakuraをベースに、不忘编码さんが移植したものですが、バグや細部の問題が多く、さらに2日間かけて最適化しましたが、まだ多くのページが最適化されていません。後でゆっくりと進めていきます。(明日できることを、なぜ明日の自分に残しておかないのか?)
以前のemlogブログではHTMLのTinyMCEエディタ、しかも古いバージョンを使用していたため、生成される記事のHTMLコードは非常に混乱していました。そのため、博客園のmarkdown形式に移行した際に、多くのスタイル互換性の問題が発生しました。できる限り修正しましたが、すべての記事が正常に表示されることを保証することはできません。見つけたら、ゆっくりと修正していきます。
博客園は、自作ブログシステムのワンクリック移行機能をサポートしていないため、記事の公開時間やコメント情報を一緒に移行することはできませんでした。しかし、元の状態をそのまま残したいと思ったので、この記事にすべて書き込みました。プライベートコメントも非表示のままです。(自作ブログシステムの件は博客園チームともコミュニケーションを取りましたが、後期の開発で追加するとのことでした。彼らを困らせるつもりはありません。彼らも経営が苦しいようです。記事の公開にはCnblogのVScodeプラグインを使用しました。)
友情リンクも個別のページとして移行しましたが、多くのリンク先のウェブサイトがアクセスできなくなったり、すでにリンクを削除したりしていました。今は独立したドメインを持っていないので、友情リンクを申請するのも申し訳ない気持ちになります…。
以前のブログの画像はすべて新浪に保存されていましたが、いつか失われるのではないかと心配していました。そのため、普段は七牛雲と新浪の両方に保存していましたが、今ではすべて博客園に移行しました。
なぜブログを書くのか?
これらのことがそんなに重要なのかと思う人もいるかもしれません。時々、何かを言いたい、何かを書きたいと思うのですが、誰も話を聞いてくれず、書く場所もなく、ただそのような場所が必要なのです。ブログをやっているのは、トラフィックやお金のためではなく、自分の小さな世界を作り、自分の小さなコミュニティで気ままに過ごしたいだけなのです。おそらく、この情熱があるからこそ、私はゆっくりと続けることができたのでしょう。しかし、事態は思い通りにはいかず、事故が起こってしまいました。
以前のブログ仲間の多くは、姿を消したか、更新をやめてしまいました。本当に残念です。彼らと知り合う前にそうなってしまいました。(特に月宅というやつ)
@寒穹 というやつは私にこう言いました。「阿珏、ずいぶん経つのに、どうしてまだそんなに二次元なんだ?」 長年変わらないのは、私自身なのかもしれません。
まだ私を覚えていてくれて、私に良くしてくれる人がたくさんいることに、とても嬉しく、そして感謝しています。
こんなにたくさんの画像を投稿すべきではなかったかもしれません。失われたブログを偲んで、私の127(おそらくPCのストレージを指している)の中で永遠に生き続けます。
Pythonコード
移行に使用したPythonコードです。あまり役に立たないかもしれませんが、記録として、必要とする人の学習のために残しておきます。
コードを表示 ``` import os import re import time import requests from bs4 import BeautifulSoup from urllib.parse import urlparse, parse_qs # ファイルパスを指定 file_path = “C:\\Users\\Administrator\\Desktop\\blog\\content.txt” save_folder = “C:\\Users\\Administrator\\Desktop\\blog\\content\\” def save_to_file(data, file_name): try: file_path = os.path.join(save_folder, file_name + “.txt”) with open(file_path, ‘a’, encoding=‘utf-8’) as file: file.write(data) print(“データは正常にファイルに保存されました:”, file_path) except Exception as e: print(“ファイルの保存中にエラーが発生しました:”, e) def remove_html_tags(text): soup = BeautifulSoup(text, ‘html.parser’) return soup.get_text() def comment(html_content): comment_matches = re.findall(r’
[\s\S]*?itle=".*?">(.*?)[\s\S]*?’, html_content, re.DOTALL) article_comments = ’’ if comment_matches: i = 0 for comment_match in comment_matches: if ‘comment-children’ in comment_match[0]: i += 1 is_reply_comment = ‘>’ * i else: is_reply_comment = ‘>’ i = 1 # アバター サイズは40に制御 # gravatarアバターに対応 https://secure.gravatar.com/avatar/
if ‘gravatar.com’ in comment_match[1]: avatar_url = ‘s=\d+’, ‘\\1s=40’, str(comment_match[1]))) + ‘) ’ else: parsed_url = urlparse(comment_match[1]) query_params = parse_qs(parsed_url.query) dst_uin = query_params.get(‘dst_uin’, [‘1638211921’]) avatar_url = ‘+’&s=40’+’) ’ comment_content = comment_match[2].strip() nickname = comment_match[3].strip() comment_time = comment_match[4].strip() link_url = re.search(r'030.*?/(.*?)" .*? rel’, nickname) # コメントのmarkdown形式を構築 comment_content = is_reply_comment + comment_content.replace(’\n’, ‘>’) comment_content = comment_content.replace(’##このコメントはプライベートコメントです##’, ‘[#このコメントはプライベートコメントです#]’) # 絵文字画像を置換 soup = BeautifulSoup(comment_content, ‘html.parser’) for img in soup.find_all(‘img’): title_text = img.get(’title’, ‘’) img.replace_with(’[#’+title_text+’]’) comment_content = soup.get_text() # コメント投稿者のURLを保存 if link_url: nickname = ‘[’+remove_html_tags(nickname)+’]’ link_url = ‘(’ + link_url[1] + ‘) ’ else: link_url = ’’ nickname = remove_html_tags(nickname) + ’ ’ if i == 1: article_comments += ‘\n’ article_comments += is_reply_comment + avatar_url + nickname + link_url + comment_time + ‘\n’ + comment_content + ‘\n’ return article_comments else: return ’’ def process_article(url): print(“現在実行中===="+url) response = requests.get(url) if response.status_code == 200: html_content = response.text soup = BeautifulSoup(html_content, ‘html.parser’) article_title = soup.find(‘h1’, class_=‘article-title’) article_mate = soup.find(‘div’, class_=‘article-meta’) article_article = soup.find(‘article’, class_=‘article-content’) soup_content = BeautifulSoup(article_article.prettify(), ‘html.parser’) img_tags = soup_content.find_all(‘img’) pattern = r"https://web.*?_/” for img_tag in img_tags: if ‘data-original’ in img_tag.attrs: original_url = img_tag[‘data-original’] else: original_url = img_tag[‘src’] cleaned_url = re.sub(pattern, ‘’, original_url) new_url = ‘https://image.baidu.com/search/down?url='
+ cleaned_url img_tag[‘src’] = new_url del img_tag[‘data-original’] article_comment = soup.find(‘div’, class_=‘article_comment_list’) data = “###### `このメッセージが表示されている場合、現在の記事は元のemlogブログシステムから移行されたものです。記事の公開時期が古すぎるため、構成や内容が完全でない場合があります。ご了承ください。`\n\n” + ‘###’ + article_title.text.strip()+’\n\n’+article_mate.text.strip().replace(’\n’, ‘’).replace(’\r’, ‘’).replace(’\t’, ‘’)+’\n’ + soup_content.prettify().replace(’’, ‘’).replace(’’, ‘’) save_to_file(data + ‘\n网友评论:\n\n’, article_title.text.strip()) data = comment(html_content) if not data: return save_to_file(data, article_title.text.strip()) if article_comment: comment_links = re.findall(r’<a\s+href="(.*?)nts"’, str(article_comment)) if comment_links: print(‘ページネーションコメントデータがあります’) for link in comment_links: url = link +“nts” print(url) response = requests.get(url) if response.status_code == 200: html_content = response.text data = comment(html_content) if not data: return save_to_file(data, article_title.text.strip()) print(“ページネーションコメントデータを書き込んでいます”) else: print(“Failed to retrieve the webpage.”) def main(): with open(file_path, ‘r’, encoding=‘utf-8’) as file: for line in file: segments = line.strip().split("—-") if len(segments) > 0: url = segments[0] process_article(url) else: print(“行にURLが見つかりませんでした。”) print(‘次の記事を開始します’) time.sleep(4) if __name__ == “__main__”: main() ```