第四篇: python操作資料庫
阿新 • • 發佈:2022-05-19
資料入庫+爬蟲
import requests
from bs4 import BeautifulSoup
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='pachong',
charset='utf8',
autocommit=True
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
ret = requests.get('https://www.autohome.com.cn/news/2/#liststart')
print(ret.status_code)
soup = BeautifulSoup(ret.text, 'html.parser')
li_list = soup.find_all(name='li')
for li in li_list:
h3 = li.find(name='h3')
if not h3:
continue
title = h3.text
desc = str(li.find(name='p').text)
img = 'https:' + li.find(name='img')['src']
url = 'https:' + li.find(name='a')['href']
print(f'''
新聞標題:{title}
新聞摘要:{desc}
新聞連結:{url}
新聞圖片:{img}
''')
sql = 'insert into cat_family(title,content,url,img) values(%s,%s,%s,%s)'
cursor.execute(sql, (title, desc, url, img))
cursor.close()
conn.close()
一、python操作資料庫
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '123',
database = 'jeff',
charset = 'utf8',
autocommit = True # 自動提交
)
cursor = conn.cursor(pymysql.cursors.DictCursor) # 產生遊標物件,將查詢出來的結果製作成字典的形式返回
sql = 'select * from teacher'
cursor.execute(sql) # 執行傳入的sql語句
# print(cursor.fetchone()) # 只獲取一條資料
# print(cursor.fetchone()) # 只獲取一條資料
# print(cursor.fetchone()) # 只獲取一條資料
# print(cursor.fetchone()) # 只獲取一條資料
# cursor.scroll(2,'absolute') # 絕對定位,控制游標移動 absolute相對於其實位置 往後移動幾位
# cursor.scroll(1,'relative') # 相對定位,relative相對於當前位置 往後移動幾位
print(cursor.fetchall()) # 獲取所有的資料 返回的結果是一個列表
cursor.close()
conn.close()
二、資料注入問題
正常演示
import pymysql
conn = pymysql.connect(
user = 'root',
passwd = '123',
db = 'jeff',
host = '127.0.0.1',
port = 3306,
charset = 'utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 獲取使用者輸入的使用者名稱和密碼 然後取資料庫中校驗
username = input('username>>>:').strip()
password = input('password>>>:').strip()
sql = "select * from userinfo where username='%s' and password= '%s'"%(username,password)
print(sql)
cursor.execute(sql)
res = cursor.fetchall()
if res:
print(res)
else:
print('使用者名稱或密碼錯誤!')
正常操作:
復原sql:正常
注入演示
利用mysql中的'--'註釋符號,注入
不輸入密碼也能獲取資料:
復原sql:密碼驗證同樣被註釋了
同樣,不輸入使用者名稱和密碼注入:
復原sql語句:後面的內容被註釋了
三、解決方法
利用特殊符號和註釋語法 巧妙的繞過真正的sql校驗
關鍵性的資料 不要自己手動去拼接 而是交由execute幫你去做拼接
execute:可以自動過濾"--"類似這種的特殊符號,還能自動識別“%s”,幫你自動拼接
cursor.execute(sql, (username, password))
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '123',
database = 'jeff',
charset = 'utf8',
autocommit = True # 這個引數配置完成後 增刪改操作都不需要在手動加conn.commit了
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
username = input('輸入使用者名稱>>>:')
password = input('輸入密碼>>>:')
sql = 'select * from user where name = %s and password = %s'
res = cursor.execute(sql, (username, password)) # 能夠幫你自動過濾特殊符號 避免sql注入的問題
if res :
print(cursor.fetchall())
else:
print('使用者名稱或密碼錯誤')
過濾成功,sql注入失敗:
四、python對資料庫的增刪改查
# 手動提交
conn.commit() # 確認當前操作 真正的同步到資料庫
import pymysql
conn = pymysql.connect(
user = 'root',
passwd = '123',
db = 'jeff',
host = '127.0.0.1',
port = 3306,
charset = 'utf8',
autocommit = True # 自動提交確認
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 生成遊標物件
增
# 增
sql = "insert into userinfo(username,password)values('tank',789)"
res = cursor.execute(sql) # 被影響的行數
print(res)
改
# 改
sql = "update userinfo set name='jeff_gyy' where id = 1"
res = cursor.execute(sql) # 被影響的行數
print(res)
刪
# 刪
sql = "delete from userinfo where id= 1"
res = cursor.execute(sql) # 被影響的行數
print(res)