プログラミング素人のはてなブログ

技術屋の末端。プログラミングも電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、python3、ラズパイ始めました。

pythonではてなブログの全記事をダウンロードする

はてなブログでは記事のエクスポートという機能もありますが、すべての記事が一つのhtmlとして出力されます。
また、写真ははてなフォトライフのリンクがhtmlに埋め込まれた状態です。
help.hatenablog.com

そこで、はてなブログの記事をひとつずつダウンロードし、写真も個別に取得ダウンロードするものを作りました。
目的は、モバイル環境などでブログ記事を作成するともとの写真がどこで作成されたものかどこへ行ったのかわからなくなるので、これを集約するためです。もちろんバックアップの目的も達成されます。

自分のブログ記事の一覧は以前の記事で紹介しています。
s51517765.hatenadiary.jp

このようなurlからすべての記事にたどり着けます。

rootUrl = 'http://s51517765.hatenadiary.jp/archive?page='
url = rootUrl + str(n) #nはページ数

新しいLinkが出てこなくなるまで取得します。

def main(url):
    html = requests.get(url)
    soup = BeautifulSoup(html.text, 'lxml')  ##lxmlを指定するほうがよい

    alink = soup.select('a')
    newLinkCheck = False;

    for i in range(len(alink)):
        if alink[i].get("class") != None:
            if 'entry-title-link' in alink[i].get('class'):
                if alink[i].get("href") not in list:
                    print('【プログラミング素人のはてなブログ】' + alink[i].getText() + ' ' + alink[i].get('href'))
                    get_contents(alink[i].get('href'))  # コンテンツ取得
                    newLinkCheck = True;
                    time.sleep(0.3)
                    list.append(alink[i].get("href"))

    return newLinkCheck

取得した記事のurlに対して、記事の中身だけを取得します。
記事の本編は'entry-content'で探します。
写真はsoup.find_all("img")でさがして、requests.get(img['src'])でダウンロードします。

def get_contents(url):
    html = requests.get(url)
    soup = BeautifulSoup(html.text, 'lxml')  ##lxmlを指定するほうがよい
    contents_div = soup.select('div')
    for i in range(len(contents_div)):
        if contents_div[i].get("class") != None:
            if 'entry-content' in contents_div[i].get('class'):
                page = contents_div[i]  # Full HTML
                folderName = url.replace("https://s51517765.hatenadiary.jp/entry/", "")
                folderName = folderName.replace("/", "")  # 日付でフォルダ名にする
                os.chdir(root)  # ルートディレクトリに移動
                if not os.path.exists(folderName):
                    os.mkdir(folderName)  # フォルダーを作る
                os.chdir(folderName)  # 存在しないフォルダに移動しようとするとErrorになる
                file = open(folderName + '.html', 'w', encoding='utf')  # 書き込みモードでオープンs
                file.write(str(page))
                file.close()
                try: #写真のダウンロード
                    imgs = soup.find_all("img")
                    i = 0
                    for img in imgs:
                        if 'fotolife' in img['src']:
                            r = requests.get(img['src'])
                            with open(str(i) + '.jpeg', 'wb') as file:
                                file.write(r.content)
                            i += 1  # 画像に連番をつける
                except:
                    pass

f:id:s51517765:20190127183802j:plain
取得した記事がフォルダごとに
f:id:s51517765:20190127183833j:plain
記事本文をhtmlで写真をjpegとして

github.com