プロクラシスト

今日の寄り道 明日の近道

リライトのために、ブログの記事タイトルとURLを自動でぶっこ抜いてcsv化する


スポンサーリンク

こんにちは、ほけきよです。

記事のリライトとか、最適化をしようとしたんですよ。 けど、どこをいつ最適化したとか、リライトしたとかわからなくなっちゃうんですよね。

じゃあ記事をエクセルで管理しちゃえば後々楽やん!天才。

と思って、一個一個温かみを持ってタイトルコピペとか繰り返してたんですが、 3回くらいで飽きました。 ムリ。

こんなんぶっこ抜くコード書いたほうが楽やん! という結論に至りましたので、書きました。

そして、意外に需要がありそうだったので、やっつけコードですが、紹介します。

なお、pythonで書いたのでpython環境があれば簡単に使えると思います。 注意点をいくつか書いているので用法用量をお守りの上、お使いください。

環境を作る

すでにpython環境を持っているという方は、bs4urllibだけ入れればOKです。*1 python環境をwindowsにいれる方法は、私の過去記事に書いています。anacondaを入れておくと大抵のことができるのではかどります(容量が2GBほど必要ということには注意しておいてください)

コード

下記コードをコピペしてarticles_to_csv.pyなどで保存してください。

どこでもいいのですがあんまりわからない!って人はデスクトップに一旦保存しておきましょう。

コードをみる
from bs4 import BeautifulSoup
import urllib
from urllib import request
import csv
from argparse import ArgumentParser


def articles_to_csv(url, output):
    is_articles = True
    page = 1
    with open (output, "w") as f:
        writer = csv.writer(f, lineterminator='\n') # 改行コード(\n)を指定しておく
        while is_articles:
            try:
                html = request.urlopen("{}/archive?page={}".format(url, page))
            except urllib.error.HTTPError as e: 
                # HTTPレスポンスのステータスコードが404, 403, 401などの例外処理
                print(e.reason)
                break
            except urllib.error.URLError as e: 
                # アクセスしようとしたurlが無効なときの例外処理
                print(e.reason)
                break
            soup = BeautifulSoup(html, "html.parser")
            articles = soup.find_all("a",class_="entry-title-link")
            for article in articles:
                try:
                    writer.writerow([article.text, article.get("href")])
                except UnicodeEncodeError as e:
                    # ふざけた文字が入ってる場合はエラー吐くことも
                    print(e.reason)
                    print("この記事のタイトルに良くない文字が入ってます :",article.get("href"))
            if len(articles) == 0:
                # articleがなくなったら終了
                is_articles = False
            page += 1
    

if __name__ == '__main__':
    parser = ArgumentParser()
    parser.add_argument("-u", "--url", type=str, required=True,help="input your url")
    parser.add_argument("-o", "--output", type=str, default="articles.csv", help="output csv name")
    args = parser.parse_args()
    articles_to_csv(args.url, args.output)

使い方

ターミナル or コマンドプロンプトを開き*2、さっきのarticles_to_csv.pyが保存されている場所まで移動します。 デスクトップに保存している方は下記コマンドで実行されるはずです。

cd Desktop
python articles_to_csv.py --url http://www.procrasist.com --output my_articles.csv

一行目はデスクトップに移動しています。二行目の解説をちらっとしておくと

  • --url 以後には自分のサイトのURLを入力してください。URLの最後の/はつけないでください。
  • --output 以後には保存したいファイル名を入力してください。入力しなくても良くて、その場合はarticles.csvという名前で保存されます。

これで、デスクトップにmy_articles.csvというcsvファイルが保存されたはずです。こんな感じ。

注意点

  • ファイル名に環境依存の文字が入っている場合は、csvに出力されません(例: ٩( ᐛ )و←こいつ / Pokémonのé など。)
  • csvに出力されない代わりに、この記事のタイトルに良くない文字が入っていますという適当なエラーメッセージをコンソール上に吐くようにしています。
  • csvと書いてますが、.xslxに拡張子を変えるとexcel専用になりますし、.csvのままでもexcelで開けます。
  • python等に詳しい人はgistにコードを挙げておいたので、そこから取ってきて適当に使ってください gist

  • TODO : 一回きりの利用を想定しているので、現行作業ファイルに新記事タイトルとURLの上書きなどの機能はない(いずれつけたい)

おわりに

これで一瞬でぶっこ抜くことができるようになりました。 リライトが捗るはず!!

使いたいっていう人で、なにかわからない所があればtwitter等で聞いてください。

リライト作業しよう、あ、その前にご飯食べてyoutubeみてカラオケいっt。。。

*1:2系の人はurllib.requestをすべてurllib2に置き換えればいいはずです。面倒だったのでやっていません!いずれやるかも

*2:windowsユーザーへ。簡単な開き方は、windowsボタン+“cmdと入力”+Enterです

PROCRASIST