エンジニア女子が触れているプログラミング言語の傾向をPythonを使って分析する - (エピソード2)
前回の振り返り - Pythonを使ってURLの一覧を取得する
前回、記事のURL一覧を取得し、"urllist.txt"というテキストファイルに書き出すところまでを書きました。
今回は取得したURL一覧から、記事のテキストを抽出するところまでを実施していきます。
各記事ページのテキストをPythonを使って抽出する
前回と同じく今回もrequests、lxml、beautifulsoup4という3つのライブラリを使用します。
今回の処理は前回作成したURL一覧が記載されている"urllist.txt"から一行ずつURLを読み取り、対象記事へアクセス、記事内のテキストのみを取得し、記事ごとにテキストファイルに書き込むというもの。
処理的には前回とそれほど変わらないです。
(ちなみに今回も5秒おきにアクセスするようにしているので、全記事取得するのに結構時間かかりました。この記事を書いている現時点で87記事分ありました)
fetchtext.py
import requests
from bs4 import BeautifulSoup
from time import sleep
def fetchtext(filename, url):
# macでのheaderを記載
header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
print("作成ファイル名: ", filename)
print("対象URL: ", url)
sleep(5)
r = requests.get(url, headers=header)
if(r.status_code != 200):
print("=== アクセスに失敗しました: status_codeが200以外を返しています ===")
return False
soup = BeautifulSoup(r.text, 'lxml')
item = soup.find("article", class_="arti-body")
print("取得テキスト: \n" + item.get_text())
with open(filename, mode='w') as f:
f.write(item.get_text())
if __name__ == "__main__":
print("=== 処理を開始します ===")
with open('urllist.txt') as f:
lines = f.readlines()
for idx, url in enumerate(lines):
fetchtext(str(idx + 1) + ".txt", url)
print("=== 処理が完了しました ===")
実行は下記コマンドで
python3 fetchtext.py
実行すると下記のようにコンソール上にログが表示されていきます。
=== 処理を開始します ===
作成ファイル名: 1.txt
対象URL: https://www.rbbtoday.com//article/2019/01/28/167294.html
取得テキスト:
今週のエンジニア女子は~
作成ファイル名: 2.txt
対象URL: https://www.rbbtoday.com//article/2019/01/24/167141.html
取得テキスト:
今週のエンジニア女子は~
~~~
=== 処理が完了しました ===
処理が完了すると、実行したディレクトリ内に1.txt,2.txtというように番号の振られたテキストファイルが大量に出現しているかと思います。
このテキストファイル内にはそれぞれ抽出された記事内のテキストが書き出されており、こちらのテキストが分析対象となります。
textsというフォルダを作成して、分析対象のファイルはまとめて移動させておきましょう。
(Pythonのコードでフォルダに移動させるところまでの処理を実装してみても良いですね)
取得したテキストに対して形態素解析を行い、単語を抽出する
今回の処理で、抽出した各テキストをそれぞれファイルという形で保存することに成功したので、次回はこれらのテキストに対して形態素解析を行い、単語のみを抽出していこうと思います。
形態素解析にはPure Python で書かれた,辞書内包の形態素解析器であるJanomeを使用していこうと思います。
それでは、また次回。