見出し画像

今度はトピックスだけでなくリンク先まで取得するぞ

どうも、じぇいかわさきです。

みなさん、ホームページに記載されているトピックスから、実際の記事があるURLが取得できたら良いと思いませんか?


しかも、毎日定時に実行して、その内容がファイルで保管されたら、シマッタ!見落としたって事が無くなりますよね。


今回は、前回のトッピクス取得に加えて、トピックスのURLをタイムスタンプでファイルする事を自分で考えてみましたので紹介します。


これをいつも決められた時間、そうホームページがアップデートされる時間に実行できたら、ホームページを見に行かなくても記録として残せますね。

素晴らしいと思いませんか。



トッピクスとリンク先を同時に保管する

画像1

見忘れ防止に役立ちますね





トピックスのリンクを抽出するには

さて、今まで勉強してきたことでは、所定のところに記載された記事のトピックスを抽出するまでを勉強した。


更に参考書に沿って学んでいくと、トピックスに関連したURLのリンクを抽出する方法が記述されていた。


トピックスを探すには、HTML文章の中のaタグget関数を使って探し、見つけたaタグを表示することでトピックスを表示していた。


今回もそこまでは一緒の動作なのですが、更にaタグ内にあるhrefという記述を見つければ、それがトピックスに関連したURLであるということが分かる。


従って、まずはaタグを探して、見つかったらその後に続くhrefという文字を探すというながれになりますね。


これを具体的なコードで書いていくと

for element in soup.find_all("a"):
   print(element.text)
   url = element.get("href")
   print(url)
   

となります。


for element in soup.find_all("a"): の部分で、aタグの箇所を全て見つけて、その部分に記載されているリンクURLをurl = element.get("href")で抽出します。

このコードを実行させると、

トピックス
トピックスのリンクURL

という順番で表示されます。


後は、抽出したトピックスとURLをファイルに書き込むだけです。

実行すると以下のような結果になります。

リンク1
https://www.ymori.com/books/python2nen/test1.html
リンク2
./test3.html
>>>

しかし、よく見るとリンク1は絶対URLで表示されていますが、リンクには相対URLで表示されています。


実際にブラウザでホームページをアクセスする場合には、絶対URLでないとアクセスできませんので、相対URLでは意味がないため絶対URLに変更する必要があります。


相対URLを絶対URLをに変更する場合にはurllibというライブラリーを使用するようです。今回初めて使うライブラリーですね。


従って、最初にimport urllibでライブラリーを読み込み、コードも以下のように変更します。

for element in soup.find_all("a"):
   print(element.text)
   url = element.get("href")
   link_url = urllib.parse.urljoin(load_url, url)
   print(link_url)


すると結果は以下のようになり、相対URLが絶対URLに変換できたことになります。

リンク1
https://www.ymori.com/books/python2nen/test1.html
リンク2
https://www.ymori.com/books/python2nen/test3.html
>>>





実践でYahooのニュース・トピック検出に応用してみる


前回実際にYahooニュースのIT分野のトピックスを抽出しました。コードはこうでしたね。

import requests
from bs4 import BeautifulSoup
load_url = "https://news.yahoo.co.jp/categories/it"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")
topic = soup.find(class_="sc-jWxkHr cbUegA topics")
for element in topic.find_all("a"):
   print(element.text)


このコードをカスタマイズして、実際のYahooからトピックスとリンクURLを抽出し、それをタイムスタンプを付加したファイル名で保存できるようにします。


まずモジュールの変更点としては、相対URLを絶対URLに変換するurllibと、タイムスタンプを扱うdatetimeの2つのモジュールをインポートします。

import urllib
import datetime


次に、ファイルに書き込む設定をしなければなりません。簡単にlinklistとしてもよいのですが、何時ファイルしたかわかりませんので、タイムスタンプを付加するようにします。


まず、実際のタイムスタンプを取得して、日付データを文字列データに変換します。
※そのまま使用すると、文字列と日付でデータ属性が違うためにエラーとなってしまいます。


dt_now = datetime.datetime.now() #現在のタイムスタンプを取得します
dstr = dt_now.strftime('%Y%m%d') #取得した日付を文字列に変換します
filename = "linklist"+dstr+".txt" #linklist日付のファイル名にします


そして、ファイルを書き込みモードで開き、先のトピックスとリンクURLを取得して書き込むコードを作ります。


最終的に今回自分でネットで調べながら作ったコードが以下になります。

import requests
from bs4 import BeautifulSoup
import urllib
import datetime
load_url = "https://news.yahoo.co.jp/categories/it"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")
#ファイルを書き込みモードで開く
dt_now = datetime.datetime.now()
dstr = dt_now.strftime('%Y%m%d')
filename = "linklist"+dstr+".txt"
with open(filename, "w") as f:
   topic = soup.find(class_="sc-jWxkHr cbUegA topics")
   for element in topic.find_all("a"):
       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")


実際にこのコードを実行してみますと、linklist20210117.txtという名前のファイルが作成されました。

できたファイルを開いてみると、ちゃんと目的通りのトピックスとリンクURLが一緒になったものが保存されておりました。


抽出ファイル


もし、1日数回実施する場合には、タイムスタンプに時間までを付加すれば同一の日でも、違った内容で保存できますね。





実践することで理解度は更に深まる


今回、参考書に出ているサンプルを元に、自分でコードをカスタマイズし、YahooニュースのIT部門のトピックスにURL付きで保存するコードを作ってみました。


書くと簡単に見えますが、実は属性の事を知らずに何回も同じエラーで苦しんだりもしました。


実際に自分でコードを書いてみることで、エラーを発生させ解決することで、理解度はより深まることも体験できました。


今の世の中、ネットで検索すればほぼ問題は解決しますので、学習する人は是非自分でコードをカスタマイズして見ることを勧めます。


大したこと無いコードでも、自分で考えたコードが動くことは感動モノですね。


この感動を忘れずに、更に勧めていきたいと思います。


じぇいかわさきです。生産技術者として35年、今まで培った経験とスキルを元に、ものづくりに関わる世の出来事に対して思ったことをホンネで書いてます。ノウハウやアイデアもありますよ。 また写真も全力で撮っています、気に入った写真があればサポートや感想をぜひお寄せください。