Python + スクレイピングでニュース記事を取得。情報収集を加速させよう!
11/152021
カテゴリー:プログラミング
Python+スクレイピングでニュース記事を取得してみた
Python(パイソン)+スクレイピングを使って、
Web上のニュース記事のリンクを取得してみました。
情報収集に便利です。
今回は、そのWebスクレイピングのやり方を
簡単に紹介しようと思います。
(Pythonの概要と始め方Python×Excelで面倒な業務を効率化。まずはコピペから始めよう!をご覧ください)
スクレイピングとは
ネット上にはテキスト、画像など
様々なデータがあります。
これらのデータはプログラムを使うと
自動で集めることができます(「クローリング」と呼ばれます)。
そのかき集めたデータは
そのままの状態だと使えないことが多いです。
そこで、データを解析して必要なデータを取り出す
ことが必要になります。
その作業のことを、「スクレイピング」と言います。
スクレイピングの始め方
ライブラリ「requests」のインストール
まず、WebサーバーにWebページの情報を取得するリクエストを送る必要があります。
このときに使うのが、Pythonのライブラリのひとつであるrequestsです。
ライブラリのインストールは
Windowsであればコマンドプロンプトで「pip install requests」、
macOSであればターミナルで「pip3 install requests」
を打ち込めば実行ができます。
ライブラリ「Beautiful Soup」のインストール
requestsでWebページの取得ができるようになりましたが、
このままだとHTMLで作られたタグなので、ゴチャゴチャしています。
そこで、必要な要素だけを取り出すことのできる
「Beautiful Soup」というライブラリもインストールします。
Windowsであればコマンドプロンプトで「pip install beautifulsoup4」、
macOSであればターミナルで「pip3 install beautifulsoup4」
で実行ができます。
プログラムを書く
事前準備ができたので、
プログラムを書きます。
プログラムを書くエディタは色々ありますが、
わたしは「Visual Studio Code」を利用しています。
Pythonを利用する場合には拡張機能が必要です(冒頭の記事で解説しています)。
今回、以下のコードを書きました。
(今回は朝日新聞のHPからデータを取得しています)
#ライブラリのインポート
import requests
from bs4 import BeautifulSoup
import urllib
#サイトから情報取得
load_url = "https://www.asahi.com/"
html = requests.get(load_url)
html.encoding = html.apparent_encoding
#HTMLを解析する
soup = BeautifulSoup(html.text,'html.parser')
#ファイルを書き込みモードで開く
filename = "asahilinklist.txt"
f = open(filename, mode="w")
#URLの情報を取得する
topic = soup.find_all("a")
for element in topic:
print(element.text)
url = element.get("href")
link_url = urllib.parse.urljoin(load_url, url)
#インターネットから取得したデータを書き込む
f.write(element.text+"\n")
f.write(link_url+"\n")
f.write("\n")
#最後にファイルを閉じる
f.close()
上から簡単に説明します。
#ライブラリのインポート
import requests
from bs4 import BeautifulSoup
import urllib
ライブラリは最初にインポートする必要があるので、
インポートしています。
なお、一番最後の「urllib」というライブラリは、
リンクを相対参照ではなく絶対参照で取得するライブラリです。
#サイトから情報取得
load_url = "https://www.asahi.com/"
html = requests.get(load_url)
html.encoding = html.apparent_encoding
1行目は、サイトのURL(今回は朝日新聞のトップページ)を指定しています。
2行目は、requestsライブラリを使ってURLの情報を取得しています。
3行目は、取得したデータを文字化けさせないための処理です。
#HTMLを解析する
soup = BeautifulSoup(html.text,'html.parser')
BeautifulSoupライブラリを使って、取得したHTMLを分析できるために解析を行っています。
#ファイルを書き込みモードで開く
filename = "asahilinklist.txt"
f = open(filename, mode="w")
ファイル名を指定して、テキストファイルを書き込みモードで開いています。
#URLの情報を取得する
topic = soup.find_all("a")
for element in topic:
print(element.text)
url = element.get("href")
link_url = urllib.parse.urljoin(load_url, url)
#インターネットから取得したデータを書き込む
f.write(element.text+"\n")
f.write(link_url+"\n")
f.write("\n")
#最後にファイルを閉じる
f.close()
topic = soup.find_all(“a”)
では、
解析したHTMLデータの中から「aタグ(リンク)」をすべて抜き出しています。
for element in topic:
print(element.text)
url = element.get(“href”)
link_url = urllib.parse.urljoin(load_url, url)
の箇所は、
一旦抜き出したリンクのテキストを出力し、
urllibライブラリを使って
リンクを絶対URLで書き出しています。
f.write(element.text+”\n”)
f.write(link_url+”\n”)
f.write(“\n”)
の三行は、
先ほど開いたテキストファイルに
リンクのテキストとURLを改行して書き出しています。
f.close()
はテキストファイルを閉じています。
実行後は、リンクテキストとURLが一覧になったテキストファイルができています。
慣れてきたら、classやIDなどで限定して必要な情報に絞ったほうが良いですね。
動画にしてみましたが、実行速度が早いです。
スクレイピングの注意点
スクレイピングはWebサイトに負担をかけるため、
必要最低限の情報を取得するにとどめたほうが良いでしょう。
また、スクレイピング自体を禁止しているサイトもあるので、
規約を確認する必要があります。
Pythonのスクレイピングを利用してみて
Pythonはこれまで
WebAPIを利用する、
Excelを操作する、
といったことを試しました。
Excelなどのオフィス系の操作に加えて、
Web系の自動化に強いことを再度認識しました。
政府系のオープンデータの活用など、
さらなる機能を試してみたいと思います。
参考書
スクレイピングの参考書がほとんどなくて困ったのですが、
↓こちらが分かりやすくてよかったです。
私みたいな文系の人間には文字や数字がだーーっと
書かれた専門書は苦手なので(^_^;)
イラストたっぷりで理解しやすかったです。
まとめ
Python + スクレイピングでニュース記事を取得する方法を解説しました。
PythonはRPAなどのノーコード・ローコードに比べたら
ハードルが高いですが、
他のプログラミング言語に比べたら
ライブラリも豊富で、とっつきやすいほうだと思います。
効率的に情報収集したい方の参考になれば幸いです。