はてなブログでは記事のエクスポートという機能もありますが、すべての記事が一つの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