【Python】ブログタイトル一覧をスクレイピング MySQLに格納

こんな人向け

・スクレイピングでデータ収集したい

・集めたデータをデータベースに残したい

・pythonを使ってみたい

環境

・MacBookPro

・macOS Monterey(12.2.1)

・terminal

・pyhotn (3.10.2)

—-import MySQLdb, requests, BeautifulSoup(from bs4)

・MySQL (8.0.28)

結果

pythonの結果

上の方は、スクレイピングで取得してMySQLデータ追加したタイトルを表示

下の方は、MySQLからデータを取得した結果

データがちゃんと追加されていますね!

僕の記事がしっかり抜き取られてますね。

MacBookPro python_library % python mysql_scraping.py
1 【Mac】Finder すべてのファイル(隠しファイル)の表示
2 【ConoHa Wing】ads.txtの設定と確認方法 google adsense必見
3 【Mac】文字変換のショートカット
4 給与明細の見方〜大学院卒1年目の手取り〜
5 副業を始めるために人生の羅針盤を設定
6 【座右の銘】刻石流水「受けた恩は石に刻め、かけた情は水に流せ」
7 旅行(神社巡り)が楽しくなる古事記のすすめ
8 【SANGO】で目次の付け方
9 【ConoHa Wing】ドメイン認証メールが届かない 解決!
titlesテーブルを全て表示
((1, '【Mac】Finder すべてのファイル(隠しファイル)の表示'), (2, '【ConoHa Wing】ads.txtの設定と確認方法 google adsense必見'), (3, '【Mac】文字変換のショートカット'), (4, '給与明細の見方〜大学院卒1年目の手取り〜'), (5, '副業を始めるために人生の羅針盤を設定'), (6, '【座右の銘】刻石流水「受けた恩は石に刻め、かけた情は水に流せ」'), (7, '旅行(神社巡り)が楽しくなる古事記のすすめ'), (8, '【SANGO】で目次の付け方'), (9, '【ConoHa Wing】ドメイン認証メールが届かない 解決!'))

MySQLの結果

一応MySQLの方でも確認

ちゃんと追加されていますね!

MacBookPro ~ % mysql -u root -p
Enter password: 

mysql> use blog
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from titles;
+----+-----------------------------------------------------------------------------------------------+
| id | title                                                                                         |
+----+-----------------------------------------------------------------------------------------------+
|  1 | 【Mac】Finder すべてのファイル(隠しファイル)の表示                                          |
|  2 | 【ConoHa Wing】ads.txtの設定と確認方法 google adsense必見                                     |
|  3 | 【Mac】文字変換のショートカット                                                               |
|  4 | 給与明細の見方〜大学院卒1年目の手取り〜                                                       |
|  5 | 副業を始めるために人生の羅針盤を設定                                                          |
|  6 | 【座右の銘】刻石流水「受けた恩は石に刻め、かけた情は水に流せ」                                |
|  7 | 旅行(神社巡り)が楽しくなる古事記のすすめ                                                    |
|  8 | 【SANGO】で目次の付け方                                                                       |
|  9 | 【ConoHa Wing】ドメイン認証メールが届かない 解決!                                            |
+----+-----------------------------------------------------------------------------------------------+
9 rows in set (0.00 sec)

ソースコード(Python)

ターミナルで実行したpythonのコードを紹介

今回使ったライブラリは3つ

・MySQLdb

・requests

・BeautifulSoup

import MySQLdb
import requests
from bs4 import BeautifulSoup

# Webページを取得して解析する
load_url = "https://beyondonestep.com"


#----------------
#データベース接続(MySQL)
#----------------
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")

cnct = MySQLdb.connect(
    host = "localhost",     #ローカルの場合
    user = "root",          #ユーザー名 初期値の場合root
    password = "******", #パスワード
    db = "blog",
    charset = "utf8"
    )
TABLE = "titles"
ROW = "(id,title)" #追加するデータの列を指定するため

cur = cnct.cursor()

count=1
# htmlのクラスcardtype__imgをサーチ
for element in soup.find_all(class_='cardtype__img'):
 html = element.decode()

 #余計な部分を整形
 title = html.split('alt="')[1].split('"')[0]
 print("{} {}".format(count,title))
 
 #データベースに追加
 cur.execute("INSERT INTO " + TABLE + " " + ROW + " VALUES (%s,%s);", (count,"{}".format(title)))
 #データベースに加えた変更を保存
 cnct.commit()   
 count+=1


#データの取得・表示
cur.execute("SELECT * FROM " + TABLE + ";")
results = cur.fetchall()
print("{}テーブルを全て表示".format(TABLE))
print(results)
print("\n")

#----------------
#データベース切断
#----------------
cur.close()
cnct.close()

困ったこと

pythonで追加したデータが、MySQLで確認すると追加されていなかった問題

原因

pythonでcommit()するのを忘れてました笑

commit()しないと、しっかり保存されないんですね。。。

まとめ

python初心者
python初心者

ブログの記事一覧をデータベースで管理できるようになった!

BeautifulSoupめっちゃ便利!

タイトル以外のデータもスクレイピングできるようにしよう!

プログラミングに関するアドバイス大大大募集!

プログラミング1年目なので、ご助言いただけると嬉しいです!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA