fc2ブログ

日経電子版記事をスクレイピングする(1)

 日経新聞は購読し始めの頃は紙面でしたが、この6年ぐらいは電子版を利用しています。読む時間は会社の休み時間が主で、関心のあるテーマについてキーワードを登録をしておき、その記事が「Myニュース」に入ってくるので、それを短時間で読む感じです。タイトルだけ読み、興味がある記事をpdfに落とす毎日です。じっくり読み込めていないのでもったいない感じもします(反省・・)。
 日経電子版は有料会員ならば10年近く前の記事から読み返すことができるので、スクレイピングを使って、興味のある分野について効率良く読み込んでいこうと思いました。word2vecを使って分析するも良しです。スクレイピングは以前のブログで行ったやり方を参考に進めました。

 一部つまづいた所もありましたが、最終コードは以下の通りです。実行はUbuntu環境でFireFoxのWebdriverを使いました。つまづいた所は後で詳しくお話します。
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
import time

options = Options()
options.set_headless()
#Firefoxを操作
driver = webdriver.Firefox(options=options, executable_path=r"/home/drbobt/anaconda3/..../geckodriver")
username = "mail_address"
password = "password"

# Login Page
driver.get('https://r.nikkei.com/login')
time.sleep(2)
#driver.save_screenshot("ss1.png")

login_username = driver.find_element_by_id("LA7010Form01:LA7010Email")
login_username.clear()
login_username.send_keys(username)
login_password = driver.find_element_by_id("LA7010Form01:LA7010Password")
login_password.clear()
login_password.send_keys(password)
driver.find_element_by_class_name('btnM1').click() # Login button click
time.sleep(2)
#driver.save_screenshot("ss2.png")

# Search word (ex. IoT, 200 articles)
target_url='https://r.nikkei.com/search...(cut)...IoT&volume=200'
driver.get(target_url)
time.sleep(5)
html = driver.page_source

# BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
sel = soup.find_all("h3",attrs={"class":"nui-card__title"})

# CSV file output
out_number = []
out_url = []
out_title = []

for i in range(0, len(sel)):
out_number.append(str(i))
out_url.append(sel[i].a.get("href"))
out_title.append(sel[i].a.get("title"))

resdata = np.vstack([out_number, out_title, out_url])
df = pd.DataFrame(data=resdata).T
df.to_csv('result.csv', header=False, index=False)

driver.quit()
このプログラムを実行すると検索ワード「IoT」にヒットする直近の200件の記事のタイトルとURLがcsvファイルに保存されます。こんな感じです。SearchWord_IoT_190407.png記事の日付も入れておくべきでしたね・・。後日、要修正です。

つまづいた所は、ログインページの選択です。まず、プログラムの16行目で、日経トップページ(https://www.nikkei.com/)を指定すると、こんな感じで「広告ページ」が邪魔してしまい、seleniumで削除したかったのですが、うまく行きませんでした。NikkeiTopPage1_190407.png 次に、別の?トップページ(https://r.nikkei.com)をトライすると、広告は出なくなりました。ただ、ログインボタンを押して表示されるログインページのURLのcidの値が毎回変わることが分かりました。これもseleniumで使えません。NikkeiTopPage2_190407.png 最終的に落ち着いたのが、トップページを介さずに直接ログインページ(https://r.nikkei.com/login)を呼び出す方法です。Nikkei_Login_190407.png始めからそうしたら良かったですね・・。毎回、URLのcidの値は変わりますが、このページは呼び出せますので問題なしです。
 20〜26行目の「LA7010Form01:」や「btnM1」はログインページのメールアドレス、パスワード、ログインボタンのそれぞれの要素名を拾っています。31行目が検索ワードを指定して検索した際のページのURLです。直接指定します。実行すると無事に自分の閲覧環境で検索結果が表示できました。
 37行目以降はBeautifulsoupを用いて、必要な情報(検索ワードにヒットする記事のタイトルとURL)を吸い上げて、ファイルに書き出すコードです。約10年分の記事の整理も簡単にできそうです。
 今後は、記事を保存し、word2vecで処理してみようと思います。
スポンサーサイト



コメント

スクレイピング

詳しく説明ありがとう!貴重な経験になります。

スクレイピング

コード編集以外にWebスクレイピングツールも体験しています。Pigdata、ScrapeStormなどのスクレイピングツールも便利です!
非公開コメント

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: