きっかけ
PDFファイルを大量ダウンロードしてこそ、スクレイピングナノではないのか?
生活の困りごと
共働きなので、小学校初めての夏休みは学童に行ってもらっていた。
おじいちゃんおばあちゃんはなにをしているかというと、働いています。
小学校入学して、夏休みの宿題プリント受け取って初めて知ったのですが
「読書感想文」も「夏休みの研究」も「貯金箱作り」も「ポスター作成」も自主性に任せるスタイルなんですね。
学校から出されたメインのドリル宿題は早々に終わってしまった。
しかし、学童から、自主学習の時間があるので、おうちから勉強課題を持ってきてほしいと言われる。
手順を考えた
- PDFが並んでいるページを探す
- PDFのDLする
- 指定のディレクトリに保存する
コードを書いたので、いかに貼る
2秒のお休みを含めつつ、こんな感じ。
from bs4 import BeautifulSoup
import urllib.request as req
import urllib
import os
import time
from urllib.parse import urljoin
pageName = "kasa-kurabe"
url = "https://print-kids.net/print/sansuu/" + pageName + "/"
res = req.urlopen(url)
soup = BeautifulSoup(res, "html.parser")
result = soup.select("a[href]")
#print(result)
link_list =[]
for link in result:
href = link.get("href")
link_list.append(href)
pdf_list = [temp for temp in link_list if temp.endswith('pdf')]
#print(pdf_list)
#print(link_list)
abs_dbpdf_list = []
for relative in pdf_list:
temp_url = urljoin(url, relative)
abs_dbpdf_list.append(temp_url)
#print(abs_dbpdf_list)
filename_list = []
for target in abs_dbpdf_list:
temp_list = target.split("/")
filename_list.append(temp_list[len(temp_list)-1])
#print(filename_list)
os.mkdir('./'+ pageName)
target_dir = "./" + pageName
savepath_list = []
for filename in filename_list:
savepath_list.append(os.path.join(target_dir, filename))
#print(savepath_list)
for (pdflink, savepath) in zip(abs_dbpdf_list, savepath_list):
urllib.request.urlretrieve(pdflink, savepath)
time.sleep(2)
実行した結果
欲しい物が手に入った。
次の課題が見えた
PDFダウンロードするたびに、同意ボタン押下求められるサイトもあるので、やはり、ブラウザ操作も学習する必要性があると感じた。
また、手に入れたプリント課題は1ファイル1ページになっている。このままだと、印刷ボタンを延々と押すはめになる。絶対に嫌だ。
対策の方針
PDFファイルを統合するもしくは、指定したフォルダをPDFを印刷し続ける処理を作る必要がある。前者がおそらく実現可能度が高く感じる。(感覚)