カテゴリ:プログラミング > Python

Google colaboratory_Python_Yahooニュース


Google Colaboratory というサービスを利用して、PythonでYahoo!ニュースTOPの主要記事のタイトルをスクレイピングし、それをCSVファイルにダウンロードするまでの流れを、メモがてらまとめていきたいと思います。

Google Colaboratoryは、最初に環境を構築する事なく、WEBブラウザ上からすぐにpythonを実行できるようにするためのツールです。



なお今回の作業は、以下の記事を参考にしながら行いました。

Pythonによるスクレイピング①入門編 ブログの記事をCSVにエクスポートする / DAINOTE





まずはGoogle Colaboratoryをダウンロード


GoogleColaboratory_Python_ダウンロード

Google ColaboratoryはGoogle Driveからダウンロードできます。 「新規」の中の「その他」にある


GoogleColaboratory_Python_ダウンロード


「アプリを追加」をクリックして、


GoogleColaboratory_Python_ダウンロード

検索窓に「Colaboratory」と入力し、右側の青い「接続」をクリックすると利用できるようになります。



Google_Colaboratory_helloworld



Yahoo!ニュースTOPの主要タイトルをスクレイピングしてCSVファイルにダウンロードする



以下、実際のコードです。 コードの内容は、大きく8つに分けられるようになっています。 


# ①「requests」と「BeautifulSoup」と「pandas」と「files」と、4つのライブラリーをインポートする
import requests
from bs4 import BeautifulSoup
import pandas as pd
from google.colab import files 

# ② URLの取得
html_doc = requests.get('https://news.yahoo.co.jp').text

# ③ 取得したデータを切り貼りできるように整形する
yahoo = BeautifulSoup(html_doc, 'html.parser') 

# ④ 取得するデータの内容を指定する
titles =  yahoo.select(".topics_list li")


# ⑤ CSVの列名を指定するために「columns」を用意して、列名を指定。(dfはデータフレームの略。)
columns = ["name", "url"]
df = pd.DataFrame(columns=columns)

# ⑥ 記事のタイトルとURLを取得して「name」と「url」に格納。
for title in titles:
 name = title.a.getText()
 url = title.a.get("href")

# ⑦ 取得した記事タイトルとURLをデータフレームに追加。
 se = pd.Series([name, url], columns)
 print(se)
 df = df.append(se, columns)

# ⑧ result.csvという名前でCSVに出力、encodingを指定、そして最後にダウンロード。
filename = "result.csv"
df.to_csv(filename, encoding = 'utf-8-sig') 
files.download(filename)



①〜④はデータの取得先の内容を指定する記述で、⑤以降は、指定したデータを実際にCSVファイルに出力してダウンロードする方法についての記述です。



Yahoo!ニュースTOP_Python_スクレイピング


こちらがスクレイピングする実際のYahoo!ニュースのTOPですが、



Yahoo!ニュースTOP_Python_スクレイピング_CSV


しっかり実際のサイトと同じものが、CSVファイルにダウンロードできている事が確認できました。



Pythonのクラスとインスタンスについて

最近になって、Pythonというプログラミング言語を学びはじめました。データスクレイピングで色々遊んでみたいというのが理由です。

progateというサービスを使ってちょっとずつ進めていますが、今回習得する際に大事なポイントになるっぽい「クラスとインスタンス」の箇所をやったので、メモがてら残しておきます。


「クラス」っていう概念について


設計図 → クラス
もの → インスタンス



「もの」を生成するために、まずは設計図を用意する必要がある。 クラスを用意すれば、同じ種類のものを複数作成することが出来る。


インスタンスを生成するには


インスタンスを生成する際の流れは以下の通り。



  • クラスを用意する。
  • クラスからインスタンスを生成する。
  • インスタンスに情報を追加する(名前・日付け・値段・性別などなど)




1. クラスを用意する。


class ItemList:
   # 処理



※クラス名は大文字。
※最後に「:(コロン)」



2. クラスからインスタンスを生成する。



class ItemList:
   pass


item_list1 = ItemList()




※ ItemList ( ) → クラス名 ( ) とすると、クラスを用いて新しくインスタンスを生成できる。
※ 変数名= クラス名で、生成したインスタンスを変数に代入することが出来る。



3. インスタンスに情報を追加する(名前・日付け・値段・性別などなど)



class ItemList:
   pass


item_list1 = ItemList()
item_list1.name = 'ハンバーガー'




※ item_list1に「name」が「ハンバーガー」という情報を追加している。
※ 「neme」は「インスタンス変数」という。




クラスとメソッドについて


クラスの中では関数を定義する事が可能で、クラスの中で定義した関数の事を「メソッド」という。メソッドを定義する方法は以下の通り。



class ItemList:
   def hello(self):
    print ('おはようございます')

item_list1=ItemList() item_list1.hello()




※ メソッドを定義する場合、必ず第一引数にSelfを追加する必要があることに注意
※ item_list1.hello()のように、クラスの中で定義して、インスタンスに対して呼び出すメソッドのことを「インスタンスメソッド」という。


selfの正体


第一引数に指定した「self」には、メソッドを呼び出したインスタンスが代入される。



class ItemList:
   def info(self):
    print ('self.name')


item_list1=ItemList()
item_list1.name = 'ハンバーガー'
item_list1.info()




よってこのようなコードを書くと、「self」に「item_list1」が代入されて、print ('self.name') で「ハンバーガー」が出力される。




特殊なインスタンスメソッド(__init__)


__init__メソッドを使用すると、インスタンスが生成された時点で、自動的にメソッドが呼び出される。

つまり、基本的にインスタンスを生成すると、毎回変数に値を代入する必要があるが、__init__メソッドを使用すればその必要がなくなり、インスタンスを生成すると同時に値を代入することが出来るようになる。



例えば、__init__メソッドを使用すれば、



class MenuItem:
def __init__(self):
self.name = "ハンバーガーセット"
self.price = 800


def info(self):
return self.name + ': ¥' + str(self.price)


menu_item1 = MenuItem()
print(menu_item1.info())



とするだけで、「ハンバーガーセット:¥800」と出力される。



__init__メソッドに引数を渡すことも可能




class MenuItem:
def __init__(self,name):
self.name = name


menu_item1 = MenuItem(ハンバーガー)
print(menu_item1.name)






↑このページのトップヘ