紫色のつぶやき

どうせそんな悩みは1年後にはどうでもよくなってる

ネットサーフィンがはかどる!Webクリップのリンク一覧をランダムな順番で出力

何を消費するにも時間が不足している現代社会、Webクリップもその例外ではありません。
今回はWebクリップのリンク一覧htmlで吐き出し→Pythonで出力し順番をランダムにして並べ替えたいと思います。

きっかけ

本も録画番組もゲームも溜まっている私。Web記事も例外ではありません。はてブの「後で読む」タグにもWebクリップサービス、Pocketにも1000以上の記事が溜まっています。 積読ならぬ積記事です。

全てを読めないにしてもせめて読む努力はしたい。 そんな気持ちからPocketやはてブを開くと困ることが。

新しい記事が上に来る、過去にさかのぼるにはひたすらスクロールしなければならない

新しい記事しか見当たりません。。。
Pocketの方はソートをすることができますがOldest first かnewest firstしかありません。記事が1000もあるとPocketは下まで永遠にスクロール。はてブの方は次へボタンを押しまくることになります。

そんなことまでして昔の記事を読みには行かないでしょう。

そうなると以下のようなことを思うわけです。
自分が保存しておいた記事から適当にランダムな記事を選び出してくれないかなあ? しかもPocketとはてブの区別なく。

残念ながらそういったニッチなサービスはありません。しかし記事一覧をhtml形式で吐き出すことが、はてブでもPocketでもできるようです。
であればそのhtmlを解析→タイトルとURLを取得→ランダムに並び替えてcsvかなんかに張り付け→やりたいこと実現! の流れになりそう。

Pythonで書けそうであったのでやってみました。

まずはhtmlファイルの出力

Pocket

下記ページから行けます

Pocket: Log In

Pocketのエクスポート

はてブ

こちらは下記ページのデータ管理→エクスポート、から ブックマーク形式で問題ありません

ログイン - はてな

出力結果

こんな感じになりました。まさしく私の欲しかったものそのものです。
記事数は2400も行ってますか。。気になったものを読んでいこう。

CSVだとできないけどxlsx形式にしてhyperlink関数を使えばハイパーリンクになるよ。
これでクリックするだけで記事にも飛べて非常に便利!
一覧もずいぶんコンパクトになったので気になる記事をクリック!

積記事の出力結果

ソースコード

htmlファイルを出力したらローカルの適当な場所に入れてプログラムを実行します。

#-------
from bs4 import BeautifulSoup
import bs4
import requests
import csv
import random

def Pocket():

    #------------------------Pocket---------------------
    # ローカルファイルのhtmlから読み込む
    load_url = r"C:\Users\xxxx\xxxx\yyy.Pocket.html" #htmlファイルの場所

    #htmlを解析
    soup = bs4.BeautifulSoup(open(load_url, encoding="utf-8"), 'html.parser')

    links = soup.find_all('li') # 全てのタグ要素を取得,Pocketとはてなでタグが違うので分ける
    atags = soup.find_all('a') # 全てのタグ要素を取得

    li_list = [] # 配列を作成
    ataglist = [] # 配列を作成

    i=0
    for link in links:    # その中のliタグの文字列を表示
        sample_txt = link.text
        li_list.append(sample_txt)
        i+=1

    for atag in atags:    # その中のaタグのhrefを表示、リンクの部分
        atag_txt = atag.get('href')
        ataglist.append(atag_txt)

    #ランダム配列の作成
    my_list = list(range(0, i))
    my_list_shuffled = random.sample(my_list, len(my_list))

    #ランダム配列合成
    m=n=o=0
    rlist = [[0 for m in range(2)] for n in range(i)]

    #2つ毎の配列[タイトル,URL]に変更する
    for o in my_list_shuffled:
        t=my_list_shuffled[o]
        rlist[o][1]=ataglist[o]
        rlist[o][0]=li_list[o]

    #-------------------------はてブ--------------------
    # ローカルファイルのhtmlから読み込む
    load_urlHatena = r"C:\Users\xxxx\xxxx\zzz.bookmarks.html" #htmlファイルの場所
    soupHatena = bs4.BeautifulSoup(open(load_urlHatena, encoding="utf-8"), 'html.parser')

    linksHatena = soupHatena.find_all('a') # 全てのタグ要素を取得,Pocketとはてなでタグが違うので分ける
    atagsHatena = soupHatena.find_all('a') # 全てのタグ要素を取得

    li_listHatena = [] # 配列を作成
    ataglistHatena = [] # 配列を作成

    j=0
    for link in linksHatena:    # その中のliタグの文字列を表示
        sample_txtHatena = link.text
        li_listHatena.append(sample_txtHatena)
        j+=1

    for atag in atagsHatena:    # その中のaタグのhrefを表示、リンクの部分
        atag_txtHatena = atag.get('href')
        ataglistHatena.append(atag_txtHatena)


    #----------------ランダム配列の作成-----------------------------
    my_listHatena = list(range(0, j))
    my_list_shuffledHatena = random.sample(my_listHatena, len(my_listHatena))

    #ランダム配列合成
    m=n=o=0
    rlistHatena = [[0 for m in range(2)] for n in range(j)]

    #2つ毎の配列[タイトル,URL]に変更する
    for o in my_list_shuffledHatena:
        rlistHatena[o][1]=ataglistHatena[o]
        rlistHatena[o][0]=li_listHatena[o]

    #---------------------------------------------
    #ここからランダム化
    listMarge = [] # 配列を作成
    listMarge.extend(rlist)
    listMarge.extend(rlistHatena)

    print(len(listMarge))
    rlist_shuffled = random.sample(listMarge, len(listMarge))

    #utf_8_sigで書けばエンコードできる,csvは書き込みモード
    f = open("output.csv", mode="w", newline="", encoding='utf_8_sig')

    writer = csv.writer(f)
    for data in rlist_shuffled:
        writer.writerow(data)
    f.close()

Pocket() #メイン関数
#-------