Pythonだけで作成できるように変更
インストール
pip install pdfminer.six pip install requests pip install beautifulsoup4
プログラム
import datetime import os import re import urllib.parse import requests from bs4 import BeautifulSoup from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LAParams, LTTextBoxHorizontal from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager from pdfminer.pdfpage import PDFPage # テキスト抽出 def get_text(url): # ファイル名作成 filename = os.path.basename(url) if not os.path.exists(filename): # ダウンロード r = requests.get(url) r.raise_for_status() # ファイル保存 with open(filename, "wb") as fw: fw.write(r.content) if os.path.exists(filename): # テキスト範囲 x_min, x_max = 420, 575 y_min, y_max = 400, 700 resourceManager = PDFResourceManager() device = PDFPageAggregator(resourceManager, laparams=LAParams()) tmp = [] with open(filename, "rb") as fp: interpreter = PDFPageInterpreter(resourceManager, device) for page in PDFPage.get_pages(fp, maxpages=1): interpreter.process_page(page) layout = device.get_result() for l in layout: if isinstance(l, LTTextBoxHorizontal): # 範囲のテキスト抽出 if x_min < l.x0 < l.x1 < x_max: if y_min < l.y0 < l.y1 < y_max: tmp.append(l.get_text().strip()) device.close() # テキスト結合 result = "\n".join(tmp) if tmp else "" print(result) return result else: print(f"{filename}が見つかりません") return "" # クエリーの除去 def remove_all_query(url): return urllib.parse.urlunparse(urllib.parse.urlparse(url)._replace(query=None)) # スクレイピング if __name__ == "__main__": url = "https://www.who.int/emergencies/diseases/novel-coronavirus-2019/situation-reports/" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko", } r = requests.get(url, headers=headers) r.raise_for_status() soup = BeautifulSoup(r.content, "html.parser") # レポートのタグ取得 href = soup.find(string=re.compile(r"^Situation report - \d{1,2}")).find_parent("a") # レポートのPDFのリンクからクエリーを除去 link = remove_all_query(urllib.parse.urljoin(url, href.get("href"))) # レポートの日付を取得 dt = datetime.datetime.strptime(href.find_parent("p").contents[-1], "%d %B %Y") text = get_text(link) if text: # 感染者数を取得 conf = [ int(i[0].replace(" ", "") if i[0] else 0) for i in re.findall("([0-9 ]+) (laboratory-)?confirmed", text) ] # 死亡者数を取得 deaths = [ int(i.replace(" ", "") if i else 0) for i in re.findall("([0-9 ]+) death", text) ] deaths.extend([0]) result = [ dt.strftime("%Y-%m-%d"), conf[0], deaths[0] + deaths[1], conf[1], deaths[0], ] print(result) else: print("テキストがありません")