見出し画像

【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への移植



いつもお読みいただき、ありがとうございます。 書くだけでなく読みたいので、コメント欄で記事名入れてもらうと見に行きます。