![見出し画像](https://assets.st-note.com/production/uploads/images/21105176/rectangle_large_type_2_e19d79c96999b8a82d7560ff997c35d7.png?width=800)
【Python】note記事のスクレイピングとバックアップ:🐍Pythonで機械学習やろうよ!【第4回】
Pythonでバカが出たぞ!
それ私です。
この😈地獄をあなたに無料でスキルシェア♬
お世話になっております。
合同会社ムジンケイカクプロ 代表ムジンです。
前回、
今回は、私の素人プログラムを見ていただこうと思います。
作成の動機
自分の記事タイトルをユーザーライクに作り変えたい。
適当にタイトルを決めてきたけど、ユーザーに伝わりやすいタイトルにしよう。
どうしたいか
既存の記事タイトルの一覧を作りたい。
その他のスクレイピングに応用するため、スクレイピングプログラムで作りたい。
最小限の構成でそれを行いたい。
何ができるようになるの?
スクレイピングの基礎がわかる。
noteのAPIの動きがわかる。
記事のバックアップが取れるようになる。
口述式簡易設計書1
noteのダッシュボードのURLから、記事を一覧化して取得する。
間違い
マイページの「もっと見る」をクリックしてみたら、どうも記事一覧が返ってくるURLがある。
FirefoxでF12キーかなんか押しまして、開発ツールをじーっと見ていると、そのURLがポコンと出てくる。
ダッシュボードからでなく、そのURLの法則を見ようと思った。
口述式簡易設計書2
https://note.com/api/v2/creators/mkp_consulting/contents?kind=note&page=1&disabled_pinned=false
このURLのpage=1を記事数分増やしながら、情報を取得できそうだ。
URLをリストにしてしまって、ループしながら内容を取得。
PandasのDataFrameにして結合。
最後にそれをCSV化。
やってみるとJSON形式に見えるので、JSONをPythonで処理しよう。
意味のないこと
post_num = 200
TotalCountというような、公開記事全文の数があるみたいなので、それでループすればいいが、これでできてしまったので、まぁいいか状態。
多分、既にこの手のnote記事を公開している人はたくさんいるだろうなの点も意味がない。
私の記事は、現時点では他と違いがない記事だろう。
動作とプログラムコード
このファイルとnote_backupというフォルダが同じ階層にあれば動くはず。
note_list_backup.csvというCSVが最終的に出てくる。
!!!要注意!!!
sleep(5)
こいつでデータを取得するタイミングを遅らせています。
これをしないと、note側に多大な負荷をかけることになってしまいます。
ここをマイページの固有URLにする
プログラム内のここを、自分のURLに入れ替える。
mkp_consulting
弊社だとこれですね。
実際のコード
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Mar 15 00:57:33 2020
@author: mkp
"""
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import csv
from datetime import datetime
from time import sleep
import os, time
import json
import requests
import math
#######自分の記事は何記事#######
post_num = 200
post_math = math.ceil(post_num/6)
urllist = []
df_concat = pd.DataFrame(index=[])
for i in range(1,post_math):
url = 'https://note.com/api/v2/creators/ここをマイページの固有URLにする/contents?kind=note&page=' + str(i) + '&disabled_pinned=false'
urllist.append(url)
def DF_MAKE(urllist):
html = ""
options = webdriver.ChromeOptions()
options.add_argument('disable-infobars')
options.add_argument('--no-sandbox')
options.add_argument('--headless')
options.add_argument('--window-size=1024,768')
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"
options.add_argument(user_agent)
driver = webdriver.Chrome(options=options);
driver.implicitly_wait(30)
driver.set_page_load_timeout(30)
j = 0
while j < 9:
try:
driver.get(urllist)
print("The page was loaded")
except TimeoutException:
j = j + 1
print("Timeout, Retrying... (%(j)s/%(max)s)" % {'j': j, 'max': 9})
time.sleep(10)
continue
else:
break
print("-----------------------------------------------------------------")
html = driver.page_source
Tag = driver.find_element_by_tag_name('pre').get_attribute('innerText')
json_dict = json.loads(Tag)
df = pd.DataFrame(json_dict["data"]["contents"])
if df.empty:
return
return df
for i in range(len(urllist)):
sleep(5)
print(i,len(urllist),urllist[i])
df = DF_MAKE(urllist[i])
if df.empty:
break
else:
df_concat = pd.concat([df_concat,df])
df_concat.to_csv('note_backup/note_list_backup.csv')
print('end')
Colaboratoryへの移植
いつもお読みいただき、ありがとうございます。 書くだけでなく読みたいので、コメント欄で記事名入れてもらうと見に行きます。