소설가가 되려는 작품을 아카이브

소개



소설가가 되는 작품 중에는 작품을 삭제해 버리는 투고자도 존재한다.
그래서 아카이브를 남겨두고 싶었지만,
Wayback Machine에서는 작품 페이지를 등록할 수 없다.


거기서 대체적으로 세로 쓰기 PDF를 사용하면 잘 되었으므로,
일간 랭킹을 취득해 아카이브를 등록해 가는 방법을 소개한다.

절차
1.N 코드 얻기
2.pdf 페이지의 URL 만들기
3. Wayback Machine에 등록

1. 일간 랭킹 취득



소등가가 되자 공식이 되자 소설 랭킹 API를 공개하고 있으므로, 이것을 사용했다.
세로 쓰기 PDF URL은https://pdfnovels.net/Nコード/main.pdf되어 있기 때문에, N 코드를 취득한다.
참고로 한 사이트는, 이쪽



이것을 개조하여

get_all_novel_info.py
import requests
import pandas as pd
import json
import time as tm
import datetime
import gzip
def get_all_novel_info():

    api_url="https://api.syosetu.com/rank/rankget/"    
    df = pd.DataFrame()
    day = str(datetime.datetime.now().strftime("%Y%m%d")+ "-d")
    payload = {'out': 'json','gzip':5, 'rtype':day }

    # なろうAPIにリクエスト
    cnt=0
    while cnt < 5:
        try:
            res = requests.get(api_url, params=payload, timeout=30).content
            break
        except:
            print("Connection Error")
            cnt = cnt + 1
            tm.sleep(120) #接続エラーの場合、120秒後に再リクエストする

    r =  gzip.decompress(res).decode("utf-8")   

    # pandasのデータフレームに追加する処理
    df_temp = pd.read_json(r)
    df = pd.concat([df, df_temp])
    return df



이제 일간 순위를 pandas의 데이터 프레임으로 얻을 수 있었다.
day = str(datetime.datetime.now().strftime("%Y%m%d")+ "-d")

또한이 부분은

랭킹 타입입니다. 누적된 순위를 얻을 수 있습니다.
순위 유형의 형식은 날짜-유형 형식입니다. 20130501-m과 같이 날짜와 종류 사이에 -(하이픈)을 끼웁니다.
날짜는 20130501과 같이 기원(4자리), 월(2자리), 일(2자리)로 입력합니다. 종류에는 일간의 경우는 d, 주간의 경우는 w, 월간의 경우는 m이, 분기의 경우는 q가 들어갑니다.

라는 것

2. Wayback Machine에 등록



다음 코드를 사용했습니다.


main.py

import requests
import pandas as pd
import json
import time as tm
import datetime
import gzip
from tqdm import tqdm
tqdm.pandas()
from selenium.webdriver.chrome.options import Options





#日間ランキング
def get_all_novel_info():

    api_url="https://api.syosetu.com/rank/rankget/"    
    df = pd.DataFrame()
    day = str(datetime.datetime.now().strftime("%Y%m%d")+ "-d")
    payload = {'out': 'json','gzip':5, 'rtype':day }

    # なろうAPIにリクエスト
    cnt=0
    while cnt < 5:
        try:
            res = requests.get(api_url, params=payload, timeout=30).content
            break
        except:
            print("Connection Error")
            cnt = cnt + 1
            tm.sleep(120) #接続エラーの場合、120秒後に再リクエストする

    r =  gzip.decompress(res).decode("utf-8")   

    # pandasのデータフレームに追加する処理
    df_temp = pd.read_json(r)
    df = pd.concat([df, df_temp])
    return df





from time import sleep
from selenium import webdriver



def url_registrater(url):
    driver.get('https://web.archive.org/save')

    submit_url_form = driver.find_element_by_xpath('//*[@id="web-save-url-input"]')
    submit_url_form.send_keys(url)

    save_button = driver.find_element_by_xpath('//*[@id="web-save-form"]/input[2]')
    save_button.click()

    #Wayback Machineは1分に15urlまで
    sleep(4.1)




def url_registrater_request(url):
    new_url = 'https://web.archive.org/save/' + url

    requests.get(new_url)

    #Wayback Machineは1分に15urlまで
    sleep(4.1)



#ヘッドレスモードで使用したいときはこちら
#options = Options()
#options.add_argument('--headless')
#webdriver.Chrome("path", chrome_options=options)
#chromedriver.exeのパスをかく
driver = webdriver.Chrome("path")
driver.implicitly_wait(1)

daily_list = get_all_novel_info()

urllist = ["https://pdfnovels.net/{}/main.pdf".format(ncode) for ncode in daily_list["ncode"]]


#1.ログインなし
for url in tqdm(urllist):
    url_registrater(url)



또한 이하의 사이트를 참고로 했다.



문제점




작품에 따라서는 pdf가 만들어지지 않고,
보통 pdf를 읽을 때는 조금 기다리면 pdf가 만들어지지만,
아카이브를 저장할 때 이것이 저장 될 수 있습니다.

해결책으로 한 번 미리 페이지를 표시하는 방법이 있지만,
이번에는 하지 않는다.

그 외 향후 생각하고 있는 것 등



이건 어때?

로그인하면 페이지의 URL을 단번에 보관할 수 있다면
qiita 라든지 url 붙여 넣고 그 페이지 아카이브를 가져 가면 좋다.



CSV 가속화

좋은 웹페이지 즐겨찾기