以下の記事の続きです。
今回は、経済産業省のプレスリリースから、過去のアーカイブをまとめて取得して、csvファイルに保存します。
まずは、前回のコードをアーカイブのページのURLを対象にして実行し、問題なく動作することを確認します。
CSVへの保存
まずは1ページのみクロールし、結果をcsvに保存してみます。
プレスリリースの日付、タイトル、リンクをcsvとして保存します。
モジュールのインポート
csvファイルを扱うので、csvというモジュールもインポートします。
>>> import csv >>> from selenium import webdriver
csvファイルの作成
列の名前が、それぞれ、日付, タイトル, リンクというcsvファイルを作成します。日本語を扱うため、文字コードをutf8で指定します。
>>> with open('results_meti_press.csv', 'w', encoding='utf8') as f:
... f.write('日付, タイトル, リンク\n')
...
14
フォルダに列名のみのcsvファイルが作成されました。
情報の取得
次に、前回と同じようにページをクロールして必要な情報を取得します。
>>> driver = webdriver.Chrome()
DevTools listening on ws://127.0.0.1:57775/devtools/browser/717d17cc-e6dc-48c5-9a32-eaa73290c1f9
>>> driver.get('https://www.meti.go.jp/press/archive_201905.html')
>>>
>>> dates = driver.find_elements_by_xpath('//div[@class="left txt_box"]/p')
>>> texts = driver.find_elements_by_xpath('//div[@class="left txt_box"]/a')
取得した情報のcsvへの保存
取得した情報を、ループを回してcsvファイルに保存します。前回はprintで出力していたものをcsvファイルに置き換えます。
>>> num_page_dates = len(dates)
>>> with open('results_meti_press.csv', 'a', encoding='utf8') as f:
... for i in range(num_page_dates):
... f.write(dates[i].text + ',' + texts[i].text + ',' + texts[i].get_attribute('href')+ '\n')
...
108
# 省略
117
>>>
csvファイルが取得できました。
ブラウザをクローズしておきます。
>>> driver.close()
アーカイブをまとめてクロール
次にアーカイブをまとめてクロールする方法を考えます。
アーカイブのurlを眺めると、archive_201903.htmlいうように、archive_ + 年 + 月 + .htmlという構成になっていることが分かるので、これらをループで生成します。
モジュールのインポート
年月日を扱うためのモジュールをインポートします。
>>> import datetime
年月日の計算を楽にするモジュールをインポートします。
dateutil – powerful extensions to datetime
>>> from dateutil.relativedelta import relativedelta
年と月の算出
今日の日付を出力します。
>>> today = datetime.date.today() >>> today datetime.date(2019, 5, 24)
今日の一か月前の日付を出力します。
>>> today + relativedelta(months=-1) datetime.date(2019, 4, 24)
今日の一か月前の年と月を出力します。
>>> year = (today + relativedelta(months=-1)).strftime('%Y')
>>> year
'2019'
>>> month = (today + relativedelta(months=-1)).strftime('%m')
>>> month
'04'
URLの生成
先月のアーカイブのURLを出力します。
>>> url = 'https://www.meti.go.jp/press/archive_{}{}.html'.format(str(year), str(month))
>>> url
'https://www.meti.go.jp/press/archive_201904.html'
先月のアーカイブのurlを取得できたので、今度はループで過去10か月分のアーカイブのurlを取得して、リストにします。
>>> url_list = []
>>> for i in range(10):
... month = (today + relativedelta(months=-i)).strftime('%m')
... year = (today + relativedelta(months=-i)).strftime('%Y')
... url = 'https://www.meti.go.jp/press/archive_{}{}.html'.format(str(year), str(month))
... url_list.append(url)
...
>>> url_list
['https://www.meti.go.jp/press/archive_201905.html', 'https://www.meti.go.jp/press/archive_201904.html', 'https://www.meti.go.jp/press/archive_201903.html', 'https://www.meti.go.jp/press/archive_201902.html', 'https://www.meti.go.jp/press/archive_201901.html', 'https://www.meti.go.jp/press/archive_201812.html', 'https://www.meti.go.jp/press/archive_201811.html', 'https://www.meti.go.jp/press/archive_201810.html', 'https://www.meti.go.jp/press/archive_201809.html', 'https://www.meti.go.jp/press/archive_201808.html']
アーカイブのurlのリストが生成できたので、このリストをループで回せば、アーカイブのページを巡回できます。
アーカイブ巡回コードの作成
csvとして保存するコードと、urlを生成するコードを、一つのコードにまとめます。
import csv
import datetime
from dateutil.relativedelta import relativedelta
from selenium import webdriver
# アーカイブを取得する月数
MONTHS = 10
today = datetime.date.today()
# アーカイブのurlを生成、リストに保存
url_list = []
for i in range(MONTHS):
month = (today + relativedelta(months=-i)).strftime('%m')
year = (today + relativedelta(months=-i)).strftime('%Y')
url = 'https://www.meti.go.jp/press/archive_{}{}.html'.format(str(year), str(month))
url_list.append(url)
# csvファイルの生成
with open('results_meti_press.csv', 'w', encoding='utf8') as f:
f.write('日付, タイトル, リンク\n')
driver = webdriver.Chrome()
# アーカイブのクロールとcsvへの情報の保存
for url in url_list:
driver.get(url)
dates = driver.find_elements_by_xpath('//div[@class="left txt_box"]/p')
texts = driver.find_elements_by_xpath('//div[@class="left txt_box"]/a')
num_page_dates = len(dates)
with open('results_meti_press.csv', 'a', encoding='utf8') as f:
for i in range(num_page_dates):
f.write(dates[i].text + ',' + texts[i].text + ',' + texts[i].get_attribute('href')+ '\n')
driver.close()
実行すると無事にcsvファイルが取得できました。