技術雑記帳兼日記帳

AWS、Python、Terraformの使い方をコッソリ

python スクレイピング その2

はじめに

前回の続きでスクレイピングについて書いていく。

準備

これまた本通りだと芸がないので、はてなブログの「注目」のタイトルとURLを抽出してCSVに出力する処理を作成した。

  • entryTitle.py
import requests
from bs4 import BeautifulSoup
import csv

url = 'https://hatenablog.com/'

resp = requests.get(url)
soup = BeautifulSoup(resp.content, 'html.parser')
# <class 'bs4.element.Tag'>
serviceTopRecommendList = soup.find("div", attrs={"class": "serviceTop-recommend-list"})

# <class 'bs4.element.ResultSet'>
entryTitleList = serviceTopRecommendList.find_all("h3", attrs={"class": "entry-title"})

entryTitleCsvList = []

for i, entryTitle in enumerate(entryTitleList):
    # <class 'bs4.element.Tag'>
    entryTitleCsvList.append([i + 1, entryTitle.find("a").get_text(), entryTitle.find("a").get("href")])

with open("entryTitleCsvList.csv", "w") as file:
    writer = csv.writer(file, lineterminator='\n')
    writer.writerows(entryTitleCsvList)
  • 実行方法と結果
$ python entryTitle.py 
$ cat entryTitleCsvList.csv
1,ぼのこと女社会2【第92-1】,https://www.bonogura.com/entry/bonoko-onnasyakai2-92-1
2,「はてなブックマーク」からいくらなんでも人が減りすぎではないかという話,https://www.tyoshiki.com/entry/2021/05/05/224428
3,FLoCとはなにか,https://jovi0608.hatenablog.com/entry/2021/05/06/160046
4,子の泣いてる時間を観察したくてM5StickCで泣き声モニタを作った,https://blog.sushi.money/entry/2021/05/06/100840
5,制作開放席システムは人生を狂わせる。,http://161cm910kg.hatenablog.com/entry/2021/05/05/205408
6,その粉、まさにメイクアップフォーエバー。【ウルトラHDセッティングパウダー】,https://www.konataro.blog/entry/2021/05/06/190000
7,JAPAN JAM終了後にテレビ局のインタビューに答えたけど、印象操作する偏った報道をされた件について,https://www.ongakunojouhou.com/entry/2021/05/06/125604
8,弱者男性論者を見ていると、「社会適応という名の悪」に対してあまりにも潔癖すぎると強く感じてしまう,https://ta-nishi.hatenablog.com/entry/2021/05/05/155031
9,フロントエンドのパフォーマンスチューニングを俯瞰する,https://numb86-tech.hatenablog.com/entry/2021/05/05/224611

  • 簡単な解説

divタグでclassがserviceTop-recommend-listの要素を取り出す。
これが、注目のClassのよう。

serviceTopRecommendList = soup.find("div", attrs={"class": "serviceTop-recommend-list"})

取得したserviceTopRecommendListの中データから、h3タグで、classがentry-titleの要素を取得する。

entryTitleList = serviceTopRecommendList.find_all("h3", attrs={"class": "entry-title"})

最後にentryTitleListのenumerateで回して、indexと要素を設定する。
そのあと、リストにインデックス値とaタグの内容、aタグのhrefを取り出して設定する。
あとはそのままCSVに吐き出す。

for i, entryTitle in enumerate(entryTitleList):
    # <class 'bs4.element.ResultSet'>
    entryTitleCsvList.append([i + 1, entryTitle.find("a").get_text(), entryTitle.find("a").get("href")])

with open("entryTitleCsvList.csv", "w") as file:
    writer = csv.writer(file, lineterminator='\n')
    writer.writerows(entryTitleCsvList)

enumerate便利


まとめ

言葉遣いが難しい。要素なのか?データなのか?このあたりはもう少し勉強が必要かな。
あとは、<class 'bs4.element.ResultSet'><class 'bs4.element.Tag'>の関係がイマイチ読み解けなかったな。
メソッドに応じてどちらが取れるかを把握しとけば役に立ちそうだ。

それにしても、プロのHTMLだからすごくキレイに作られているな。ちょっと感動。