【python】SQLite3でスクレイピングした記事をデータべースに保存する。

前書き

最近、ブログを書かずに、pythonの勉強のみに専念していました。しかし、自分が思うよう学習を進めることができず、行き詰まりことが多く、集中が途切れていました。おそらく、プログラミングで自分がやりたいことを明確できていないからだと思います。分からないことをネットで調べていると脱線して、自分が何をやっているのかわからなくなってきます。ですが、ブログの編集記事に戻ると目的が明確になります。なので、これからはもっとブログを利用して、題名に「自分が解決したいこと」「やってみたいこと」「調べたこと」をどんどんアウトプットしていきたいと思います。

参考

SQLite データベースに対する DB-API 2.0 インタフェース
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

SQL

SQLite入門

やってみる

import sqlite3
conn = sqlite3.connect("test_sqlite.db")
cur = conn.cursor()
cur.execute('SQL文')

「test_sqlite.db」というsqliteのデータベースを作成する。execute()メソッドを呼び出し、SQLを実行する。

import sqlite3
conn = sqlite3.connect("test_sqlite12.db") 
cur = conn.cursor()

import time
import requests
headers = {"User-Agent":"任意の値"}
from bs4 import BeautifulSoup

url = "https://lifeinfo-navi.com/p=1987"
res = requests.get(url,headers = headers,timeout=3)
time.sleep(1)
soup = BeautifulSoup(res.content,"html.parser")
time.sleep(1)
#print(soup.title.string)

hennsuu = "aaaaa"

cur.execute('CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT)')
conn.commit()

cur.execute('INSERT INTO persons(name) VALUES(soup_str)')
conn.commit()

cur.execute('SELECT * FROM persons')
print(cur.fetchall())

conn.close()

INSERT文に変数「hennsuu」を挿入しましたが、「no such column」というエラーが発生する。

以下のように、SQL文を変数「sql」に格納し、挿入する変数の値をひとまず「?」としておく。
そして、cur.execute()の引数に変数「sql」とデータベースに挿入したい変数を渡す。

import sqlite3
conn = sqlite3.connect("test_sqlite15.db")
cur = conn.cursor()

import time
import requests
headers = {"User-Agent":"任意の値"}
from bs4 import BeautifulSoup

url = "https://lifeinfo-navi.com/p=1987"
res = requests.get(url,headers = headers,timeout=3)
time.sleep(1)
soup = BeautifulSoup(res.content,"html.parser")
time.sleep(1)
#print(soup.title.string)

hennsuu = "aaaaa"

cur.execute('CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT)')
conn.commit()

sql = 'INSERT INTO persons(name) VALUES(?)'
cur.execute(sql,(hennsuu,))
conn.commit()

次に、実際にスクレイピングして取得した内容が変数「soup」に格納しているので、データベースに入れる変数「hennsuu」を「soup」に変更して、実行すると、「sqlite3.InterfaceError: Error binding parameter 0 – probably unsupported type.」というエラーが発生しました。

変数「hennsuu」を「soup.title.string」とすると、エラーなく実行できます。「soup.title」ではエラーが発生するので、タグが原因でないかと考え、「hennsuu」にタグ付きの文字列を格納して、実行しても、エラーが発生しませんでした。

おそらく、「soup」の方はタグ情報を有する、反対に「hennsuu」はタグの形をしているが、ただの文字列として、認識されていると考える。

やはり、print(type(変数))で調べると、変数「soup」は「bs4.BeautifulSoup」という形式でした。これをstr()関数で文字列に変換しました。

そうすると、スクレイピングにより取得した情報をデータベースに格納することに成功しました。


完成コード

import sqlite3
conn = sqlite3.connect("test_sqlite52.db")
cur = conn.cursor()

import time
import requests
headers = {"User-Agent":"aaaaaa"}
from bs4 import BeautifulSoup

url = "https://lifeinfo-navi.com/p=1987"
res = requests.get(url,headers = headers,timeout=3)
time.sleep(1)
soup = BeautifulSoup(res.content,"html.parser")
soup_str = str(soup)
time.sleep(1)
print(type(soup))
print(type(soup_str))

hennsuu = "【紹介】効率を重視したアフィリエイト術の例とpythonライブラリの公式ドキュメント一覧。lifeinfoLIFE INFOMATION"
print(type(hennsuu))

cur.execute('CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(1000000000))')
conn.commit()

sql = 'INSERT INTO persons(name) VALUES(?)'
cur.execute(sql,(soup_str,))
conn.commit()

cur.execute('SELECT * FROM persons')
print(cur.fetchall())

conn.close()