소설가가 되려는 작품을 아카이브
14343 단어 WaybackMachine아카이브파이썬셀레늄소설가가 되자.
소개
소설가가 되는 작품 중에는 작품을 삭제해 버리는 투고자도 존재한다.
그래서 아카이브를 남겨두고 싶었지만,
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.pyimport 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 가속화
Reference
이 문제에 관하여(소설가가 되려는 작품을 아카이브), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yuki_2020/items/a1e353f7276e2992949c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
소등가가 되자 공식이 되자 소설 랭킹 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 가속화
Reference
이 문제에 관하여(소설가가 되려는 작품을 아카이브), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yuki_2020/items/a1e353f7276e2992949c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 가속화
Reference
이 문제에 관하여(소설가가 되려는 작품을 아카이브), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yuki_2020/items/a1e353f7276e2992949c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(소설가가 되려는 작품을 아카이브), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yuki_2020/items/a1e353f7276e2992949c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)