1. 程式人生 > 其它 >第四篇: python操作資料庫

第四篇: python操作資料庫

資料入庫+爬蟲

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)