LoginSignup
0
0

More than 1 year has passed since last update.

とりあえず子供のプリント教材を用意したいので、スクレイピングしてみた

Posted at

きっかけ

PDFファイルを大量ダウンロードしてこそ、スクレイピングナノではないのか?

生活の困りごと

共働きなので、小学校初めての夏休みは学童に行ってもらっていた。
おじいちゃんおばあちゃんはなにをしているかというと、働いています。
小学校入学して、夏休みの宿題プリント受け取って初めて知ったのですが
「読書感想文」も「夏休みの研究」も「貯金箱作り」も「ポスター作成」も自主性に任せるスタイルなんですね。
学校から出されたメインのドリル宿題は早々に終わってしまった。
しかし、学童から、自主学習の時間があるので、おうちから勉強課題を持ってきてほしいと言われる。

手順を考えた

  1. PDFが並んでいるページを探す
  2. PDFのDLする
  3. 指定のディレクトリに保存する

コードを書いたので、いかに貼る

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を印刷し続ける処理を作る必要がある。前者がおそらく実現可能度が高く感じる。(感覚)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0