【Python】日本経済新聞社様のニュースタイトルとURLを自動取得するWebスクレイピングコードを作った

#公開理由
・Webスクレイピングを最近勉強中で、同じく勉強している人の役に立ちたいと思ってますので。
・自分の学習のアウトプットの為。アウトプットの練習。
・Webスクレイピングとか、Seleniumとか触り始めて1か月たたない程度の人間のアウトプットです。逆にこれから
　始める人も普通にこれくらいにはなれるよって指針にもお使いくださいませ。
・超詳細な解説を出来るほど理解出来ておりません。ざっくりした理解しか出来ていないので、読まれる方はそのあたりご理解頂ければ幸いです。
・robots.txtを参照し、問題なさそうだと判断し、実施しております。

#作成したコード

```newspaper.py
import requests
from bs4 import BeautifulSoup
import pandas as pd

#Webスクレイピングに必要なリスト作成
elements_title = []
elements_url = []

#Webスクレイピング処理
def get_nikkei_news():
    url = "https://www.nikkei.com/"
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html,"html.parser")

    #titleについての処理
    title_list = soup.select(".k-card__block-link")
    for title in title_list:
        elements_title.append(title.text)

    #urlについての処理
    url_list = soup.select(".k-card__block-link")
    for i in url_list:
        urls = i.get("href")
        if "http" not in urls:
            urls = "https://www.nikkei.com" + urls
            elements_url.append(urls)
        else:
            elements_url.append(urls)

#Webスクレイピング処理呼び出し
get_nikkei_news()

#pandas処理
df = pd.DataFrame({"news_title":elements_title,
                   "news_url":elements_url})
print(df)
df.to_csv("nikkei_test_select.csv", index=False, encoding="utf-8")
```

#出力結果（コンソールのみ）

```
              news_title                                           news_url
0      20年度成長率、マイナス4%台半ば　政府見通し  https://www.nikkei.com/article/DGXMZO62026930Z...
1      米豪2プラス2、中国の強権路線に「深刻な懸念」  https://www.nikkei.com/article/DGXMZO62026150Z...
2    危うい「習近平政治」全否定、米中衝突誘うソ連の呪縛  https://www.nikkei.com/article/DGXMZO61984420Y...
3   原燃の再処理工場、安全審査に合格　稼働は21年度以降  https://www.nikkei.com/article/DGXMZO62026760Z...
4     コロナで留学中断、突如の就活入り　帰国学生に試練  https://www.nikkei.com/article/DGXMZO61953440X...
..                         ...                                                ...
70     小型ロケット、空中発射めざす　中小など実証試験  https://www.nikkei.com/article/DGXMZO61958380X...
71      マルナカ、技能実習生を母国のイオンで優先採用  https://www.nikkei.com/article/DGXMZO62005790Y...
72    水際対策強化、国際線再開目指す　那覇空港ビル社長  https://www.nikkei.com/article/DGXMZO62017470Y...
73   神奈川銀行の近藤頭取、初の生え抜き　融資審査を改革  https://www.nikkei.com/article/DGXMZO61933170X...
74      とり天　大分のもてなしの味、食べ歩きも楽しみ  https://www.nikkei.com/article/DGXMZO56989060Z...
```

#概要説明
・日本経済新聞社様（https://www.nikkei.com/）
　のトップページに表示されているあらゆるニュースや広告のタイトルとそのURLを
　csv形式で吐き出す処理を行うWebスクレイピングコードになります。
　BeautifulSoupとrequestsを使ってWebスクレイピングを行うベーシック（だと思われる）なコードだと思っています。

・ニュースタイトルとurlを格納する空のリストを用意して、　
　そのリストに入れるためのデータを抽出するための処理をそれぞれ関数内で行っています。
　ニュースタイトルの抽出は、ただ取り出しに行くだけで良かったのですが、URLは「https://」（プロトコル部分）が最初からついているのもあれば
　ついていないものもあったので、条件分岐を行い、ついていないものについては「https://www.nikkei.com」
　を付け加えております。
　（もしかしたらURLの一部でおかしいものが出力されてしまうかもです。目視で確認した感じなさそうでしたが、、、あった際は修正ですね(-_-;)）

・print()で出力しさらに、csv形式で出力するようにしています。
　ただ、utf-8での出力なので、WindowsPC上で開くと文字化けがすごいです。自分はatomとかgoogledrive,Cloud9等で
　内容確認してますので、このコードコピペして出力確認する方は、参考までに宜しくお願い致します<m(__)m>
　
#コード解説（ざっくり）
Webスクレイピング処理を行う関数の以下の部分は、私はおまじないだと思って割り切ってコーディングしてます。
urlにWebスクレイピングをしたい対象のURLをコピペして、そのURLからHTMLファイルをごっそり持ってきて、
HTMLパースで構造を分析する、みたいな流れだと思ってます。

```parts.py
    url = "https://www.nikkei.com/"
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html,"html.parser")
```

以下のコードでは、タイトルを取り出しています。
そして、取り出したタイトルをリストに格納してる処理になります。

```parts.py
    title_list = soup.select(".k-card__block-link")
    for title in title_list:
        elements_title.append(title.text)
```

以下のコードで、urlを取り出しています。ただし、取り出すだけでは内容が不足する事が
あったため、if文で条件分岐を行い、不足していた場合はその不足分を補った上で
リストに格納している形になります。

```parts.py
    url_list = soup.select(".k-card__block-link")
    for i in url_list:
        urls = i.get("href")
        if "http" not in urls:
            urls = "https://www.nikkei.com" + urls
            elements_url.append(urls)
        else:
            elements_url.append(urls)
```

以下はpandasというモジュールを利用し、csv形式にして吐き出す処理を行っています。
pandasでは辞書型にして、キーに列の名称、ヴァリューにそれぞれの列の要素を設定してあげると
きれいにデータをcsv形式で出力出来ました。
便利ですね。pandas。

```parts.py
df = pd.DataFrame({"news_title":elements_title,
                   "news_url":elements_url})
print(df)
df.to_csv("nikkei_test.csv", index=False, encoding="utf-8")
```