« パトリック・バーン氏連載: 第五章 扇動と混乱 (1/6-1/20) (翻訳記事) | トップページ | ウェブ魚拓「コロナワクチンは生物兵器」ナカムラクリニック »

2021年5月 5日 (水)

Noteの記事をPythonでバックアップしといた。

Noteは今の所自分に直接は検閲された感じもないし、割と言論の自由があるんじゃないかと思ってはいるんだけど、「ユーザーをブロックする」という機能があって、Noteのヘルプページによると:

ブロックすると、以下の状態になります。

  • 相手はあなたの記事にスキできなくなります
  • 相手はあなたの記事にコメントできなくなります

だそうだ。

でもamisima7さんの場合

「スキ禁、コメ禁、のほかに、UP禁

私は誰かに通報されTELとか、運営に睨まれてる可能性があるらしいです(^_^;)」

という事で、ブロックでは説明できない現象もある模様。

cakesという同じくNoteがやっているサイトでは炎上した記事の削除対応しないNoteに対して叩くような記事もあり、まあちょっと圧力を感じる。

Noteには頑張って欲しいが、いつツイッターの様に検閲し始めるか分かったもんじゃないので対策は必要。

という事で先ずはいつアカウントが凍結したり記事が削除されても良いようにバックアップを取った。

 

サクサクっとPythonでBeautifulsoup4とrequestsで記事一覧ページから全URLのリストを取得して逐次htmlを保存という非常に基本的なアプローチで十分だった。

 

誰得だけどコードを置いておきます。Python3で適当に例によってpython -m venv venvで環境をつくってactivate後にpip install requests Beautifulsoup4でなんとかなるでしょう。from_notesとnotesというフォルダを作ってそこに下のスクリプトを保存して、あとはNoteに行って、自分の記事の一覧ページを一番下までスクロールして全部の記事がでるまで読み込む。これをfrom_notesというフォルダの中へ保存で準備完了。 

 

import os
import sys
from time import sleep
import random
import pickle
import requests
from bs4 import BeautifulSoup
def sleep_progress(t):
  for t_ in range(t):
    sys.stdout.write(f'\r{t_} s / {t}')
    sys.stdout.flush()
    sleep(1)
sys.stdout.write('\r')
# 記事のページを一番下までスクロールして全部の記事がでるまで読み込む
# これをfrom_notesというフォルダ作ってそこへ保存。
# notesというフォルダに記録するのでそっちも作っておく
# 
# note_bk
#   from_notes/
#   notes/
#   venv/
#   notebk.py
fp = './from_notes/note ――つくる、つながる、とどける。.html'
with open(fp, 'r') as f:
  soup = BeautifulSoup(f, 'html.parser')
# 全ての記事のURLを見つける
links = soup.find_all('a', class_='o-articleList__headingLink')
total = len(links)
# ブラウザのフリするため
headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
    }

# 一度保存したページのurlを覚えておく。
if os.path.exists('done.pickle'): with open('done.pickle', 'rb') as f: saved = pickle.load(f) else: saved = set() for n, link in enumerate(links): href = link.attrs.get('href') if href in saved: print (f'{n+1:02}/{total}: 保存済み {href}') continue if href is None: # shitagaki print (f'{n+1:02}/{total}: 下書き') else: t = random.randint(10,60) print (f'{n+1:02}/{total}: {href}, 保存後は{t}秒待つ。') r = requests.get(href, headers=headers) s = BeautifulSoup(r.text, 'html.parser') title, _, type_ = s.title.text.split('|') title = title if len(title)<20 else title[:20] # ファイル名長過ぎる時用 with open(f'./notes/{title}.html', 'w', encoding='utf8') as fp: fp.write(s.prettify()) saved.add(href) sleep_progress(t) # 良い子なのでアグレッシブにダウンロードしない配慮 # 保存したページのURLをピックルしておく。 # 後日のバックアップで無駄なダウンロードしない配慮。 with open('done.pickle', 'wb') as f: pickle.dump(saved, f)

« パトリック・バーン氏連載: 第五章 扇動と混乱 (1/6-1/20) (翻訳記事) | トップページ | ウェブ魚拓「コロナワクチンは生物兵器」ナカムラクリニック »

Python」カテゴリの記事

MAGA」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« パトリック・バーン氏連載: 第五章 扇動と混乱 (1/6-1/20) (翻訳記事) | トップページ | ウェブ魚拓「コロナワクチンは生物兵器」ナカムラクリニック »

しろののツイッタータイムライン(凍結中)

オススメたち

2021年7月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

はてブ

無料ブログはココログ