import pypyodbc
sql_path=r"mybt.accdb"
conn=pypyodbc.connect(u'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + sql_path)
cursor=conn.cursor()
table_name="表名"
sql=f"INSERT INTO 表名 (1,2) VALUES ('demo1','demo2');"
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
#Access數(shù)據(jù)庫(kù)并不適合大型數(shù)據(jù)使用,一般用來(lái)存儲(chǔ)一些小批量信息,如爬取某些電影的磁力
#鏈接進(jìn)行保存。分別存儲(chǔ)電影名稱(chēng),演員,鏈接,時(shí)長(zhǎng)等信息。以及記錄鏈接分享日期。
.使用該代碼需要先安裝pypyodbc庫(kù)。在dos窗口輸入以下指令
pip install pypyodbc
2.在微軟官網(wǎng)下載相應(yīng)驅(qū)動(dòng)分為32和64位版本。
下載地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=54920
3.相關(guān)參數(shù)詳細(xì)說(shuō)明:
3-1. mybt.accdb為數(shù)據(jù)庫(kù)文件所在地址,后綴為accdb。
sql_path=r"mybt.accdb"
這是文件截圖
3.2. 表名對(duì)于下圖中的表1。
table_name="表名"
3.2詳圖
3.3 INSERT代表插入內(nèi)容,表面對(duì)應(yīng)上面所說(shuō)的表名,第一個(gè)小括號(hào)內(nèi)1,2,分別指上圖中的表格里的1,2(你自己命名的,它對(duì)應(yīng)了相應(yīng)的數(shù)據(jù)類(lèi)型)。demo1,demo2表示改指令把demo1,demo2分別對(duì)應(yīng)1,2的位置插入。執(zhí)行結(jié)果見(jiàn)下圖。
易錯(cuò):當(dāng)使用列表元素填充時(shí),外面一定要加“''”,否則執(zhí)行會(huì)報(bào)錯(cuò)(不會(huì)顯示報(bào)錯(cuò),因?yàn)椴患右?hào)符合Python語(yǔ)法)。
sql=f"INSERT INTO 表名 (1,2) VALUES ('demo1','demo2');"
sql=f"INSERT INTO 表名 (1,2) VALUES ('{a[0]}','{a[1]}');"
這是執(zhí)行完指令后的結(jié)果
ython開(kāi)發(fā)web服務(wù)的優(yōu)勢(shì)是開(kāi)發(fā)效率高,可能只需要java五分之一的代碼量。
Python搭建web服務(wù)有許多框架,本文介紹Django和bottle兩個(gè)框架。
首先,安裝該框架
安裝成功,版本是1.11.28. 框架的文件安裝在\python27\Scripts目錄下(搜索電腦中Python安裝目錄下的Scripts就對(duì)了)。
先進(jìn)入\python27\Scripts目錄,建立項(xiàng)目jinanwx(名稱(chēng)隨便起)
同一個(gè)目錄下可以看到新建立工程的目錄
進(jìn)入python27\Scripts\jinanwx\jinanwx。新建我們自己的模塊
jgotest01.py里面寫(xiě)簡(jiǎn)單的代碼如下
模塊功能就是返回個(gè)json格式結(jié)果。
然后需要改urls.py模塊
目錄文件如下
就這么簡(jiǎn)單,新建一個(gè)文件再修改一個(gè)文件,就成了。
回到上一級(jí)目錄啟動(dòng)服務(wù)
啟動(dòng)成功,瀏覽器訪問(wèn)試試
開(kāi)發(fā)功能不是特別復(fù)雜的web服務(wù),可以考慮使用bottle框架,它比Django輕量。bottle例子在Linux下演示。
使用bottle框架首先安裝。一個(gè)指令搞定。
# pip install bottle
進(jìn)入Python命令行import bottle,沒(méi)報(bào)錯(cuò)就是成功了。
我的web服務(wù)就一個(gè)文件bottleweb.py,代碼如下,一些解釋在代碼的注釋里
#coding=utf-8
from bottle import (run, route, get, post, put, delete, request, hook, response, static_file, app)
import json
import MySQLdb #本例子需要操作數(shù)據(jù)庫(kù),否則可以不寫(xiě)這行,這個(gè)數(shù)據(jù)庫(kù)包pip估計(jì)安裝不會(huì)成功,我是用yum install MySQL-python成功的
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import bottle
app = bottle.default_app()#處理靜態(tài)資源需要定義,沒(méi)有靜態(tài)資源可以不寫(xiě)這行
#搭建vue腳手架前后臺(tái)聯(lián)調(diào)時(shí)要下面兩個(gè)@hook內(nèi)容,否則會(huì)報(bào)跨域訪問(wèn)資源的錯(cuò)誤
@hook('before_request')
def validate():
REQUEST_METHOD = request.environ.get('REQUEST_METHOD')
HTTP_ACCESS_CONTROL_REQUEST_METHOD = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_METHOD')
if REQUEST_METHOD == 'OPTIONS' and HTTP_ACCESS_CONTROL_REQUEST_METHOD:
request.environ['REQUEST_METHOD'] = HTTP_ACCESS_CONTROL_REQUEST_METHOD
@hook('after_request')
def enable_cors():
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE,OPTIONS'
response.headers['Access-Control-Allow-Headers'] = '*'
@route('/test2020/dist/<path>')#靜態(tài)資源在web服務(wù)下的地址,沒(méi)放前端的靜態(tài)資源這幾個(gè)route和app.route可以不寫(xiě)
def stat(path):
return static_file(path, root='./dist/')
@app.route('/test2020/dist/static/js/<path>')
def js(path): #這幾個(gè)目錄我寫(xiě)成這樣是因?yàn)関ue打包完后目錄結(jié)構(gòu)就是dist 里面static等等
return static_file(path, root='./dist/static/js/')
@app.route('/test2020/dist/static/css/<path>')
def css(path):
return static_file(path, root='./dist/static/css/')
@get('/test2020/date')#返回某個(gè)表中的日期,看sql你就明白了
def helloins():
db = MySQLdb.connect("127.0.0.1", "yourusername", "yourpassword", "yourDBname", charset='utf8' )
cursor = db.cursor()
sql = "select DISTINCT date from testtable"
print sql
cursor.execute(sql)
data = cursor.fetchall()
jsondata={}
results=[]
for row in data:
result = {}
result['DATE'] = row[0]
results.append(result)
jsondata['code']=0
jsondata['datas']=results
return jsondata #返回json格式為了方便前端vue接收處理,其實(shí)返回各種類(lèi)型都可以
@get('/test2020/helloworld')
def helloworld():
return 'hello world!'
if __name__ == '__main__':
run(host='0.0.0.0', port=2020, debug=True, reloader=True)
bottleweb.py所在目錄執(zhí)行
#python bottleweb.py
web服務(wù)就啟動(dòng)了。瀏覽器訪問(wèn)http://127.0.0.1:2020/test2020/helloworld看效果。
如果安裝了MySQL數(shù)據(jù)庫(kù)可以測(cè)試test2020/date的url是否能返回結(jié)果
數(shù)據(jù)庫(kù)只要有下面的數(shù)據(jù)就可以
前端頁(yè)面是這個(gè)樣子的,給用戶選擇某個(gè)日期。
前端是用vue+vux來(lái)開(kāi)發(fā)的,開(kāi)發(fā)完打包打出的東西上傳到代碼中提到的dist靜態(tài)資源目錄下。
如果覺(jué)得上面的代碼有點(diǎn)復(fù)雜,可以把所有route, app.route的東西刪除,把/test2020/date語(yǔ)句塊也刪除,把@hook刪除,MySQL的東西刪除,前端的東西也完全不考慮,就是最簡(jiǎn)單的bottle web服務(wù),相當(dāng)于hello world。
建議盡量懂上面的代碼,涉及了靜態(tài)資源,數(shù)據(jù)庫(kù),是web服務(wù)必須的內(nèi)容。
分享一個(gè)遇到的pip的問(wèn)題,我Python版本很低2.6.6。本來(lái)通過(guò)安裝yum的epel,已經(jīng)成功安裝了好用的pip。但是每次我用pip命令,最下方都會(huì)提示升級(jí)
You are using pip version 9.0.3, however version 20.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command
我執(zhí)行了pip install --upgrade pip升級(jí),然后pip指令就不能用了。而且升級(jí)了之后,在想安裝回低版本的pip就沒(méi)有對(duì)應(yīng)的安裝包了。yum只能找到20.0.2版本的(老版本會(huì)被覆蓋難道?)。
http://bootstrap.pypa.io/2.6/get-pip.py
下載了get-pip.py也無(wú)法安裝成功。最后在上面的地址下載到了2.6版本的安裝文件,才成功安裝可以使用的pip。
相比java,python開(kāi)發(fā)web代碼量少,需要安裝的庫(kù)少,如果能滿足功能和性能要求,python可能是更好的選擇。
這篇教程中,我們會(huì)用 Python 的 PyQt 框架編寫(xiě)一個(gè)簡(jiǎn)單的 web 瀏覽器。關(guān)于 PyQt ,你可能已經(jīng)有所耳聞了,它是 Qt 框架下的一系列 Python 組件,而 Qt(發(fā)音類(lèi)似“cute”)是用來(lái)開(kāi)發(fā) GUI 的 C++ 框架。嚴(yán)格來(lái)講, Qt 也可用于開(kāi)發(fā)不帶圖形界面的程序,但是開(kāi)發(fā)用戶界面應(yīng)該是 Qt 框架最為廣泛的應(yīng)用了。Qt 的主要優(yōu)勢(shì)是可以開(kāi)發(fā)跨平臺(tái)的圖形界面程序,基于 Qt 的應(yīng)用能夠借助于各平臺(tái)的原生性在不同類(lèi)的設(shè)備上運(yùn)行,而無(wú)須修改任何代碼庫(kù)。
想要學(xué)習(xí)Python。關(guān)注小編頭條號(hào),私信【學(xué)習(xí)資料】,即可免費(fèi)領(lǐng)取一整套系統(tǒng)的板Python學(xué)習(xí)教程!
Qt 附帶了 webkit 的接口,你可以直接使用 PyQt 來(lái)開(kāi)發(fā)一個(gè)基于 webkit 的瀏覽器。
我們本次教程所開(kāi)發(fā)的瀏覽器可以完成如下功能:
加載用戶輸入的url
顯示在渲染頁(yè)面過(guò)程中發(fā)起的所有請(qǐng)求
允許用戶在頁(yè)面中執(zhí)行自定義的 JavaScript 腳本
牛刀小試
讓我們從最簡(jiǎn)單的 PyQt 的 Webkit 用例開(kāi)始吧:輸入 url,打開(kāi)窗口并在窗口中加載頁(yè)面。
這個(gè)例子十分短小,連 import 語(yǔ)句和空行在內(nèi)也只有 13 行代碼。
當(dāng)你通過(guò)命令行將 url 傳給腳本時(shí),程序會(huì)加載 url 并且在窗口中顯示加載完成的頁(yè)面。
現(xiàn)在,看似你已經(jīng)有一個(gè)“命令行瀏覽器”啦!至少比 python 的 requests 模塊強(qiáng)多了,甚至比 Lynx 還略高一籌,因?yàn)槲覀兊臑g覽器還可以加載 JavaScript 腳本呢。但是目前為止還沒(méi)有跟 Lynx 拉開(kāi)差距,因?yàn)樵趩⒂脼g覽器的時(shí)候只能通過(guò)命令行傳入 url。那么,必然需要通過(guò)某種方式把需要加載的 url 傳入瀏覽器。沒(méi)錯(cuò),就是地址欄!
添加地址欄
其實(shí)地址欄的實(shí)現(xiàn)非常簡(jiǎn)單,我們只需要在窗口頂端加一個(gè)輸入框就夠了。用戶在文本框中輸入 url 之后,瀏覽器就會(huì)加載這個(gè)地址。下面,我們將用到 QLineEdit 控件來(lái)實(shí)現(xiàn)輸入框。鑒于我們的瀏覽器現(xiàn)在有地址欄和瀏覽器顯示框兩部分,因此還要給我們的應(yīng)用增加一個(gè)網(wǎng)格布局。
到這里,我們已經(jīng)有一個(gè)瀏覽器的雛形啦!看上去和當(dāng)年的 Google Chrome 還有幾分相像呢,畢竟兩者采用了相同的渲染引擎。現(xiàn)在,你可以在輸入框中輸入 url ,程序便會(huì)將地址傳入瀏覽器,接著渲染出所有的 HTML 頁(yè)面和 JavaScript 腳本并展示出來(lái)。
添加開(kāi)發(fā)工具
一個(gè)瀏覽器最有趣也最重要的部分是什么?當(dāng)然是各種各樣的開(kāi)發(fā)工具了!一個(gè)沒(méi)有開(kāi)發(fā)者控制臺(tái)的瀏覽器怎么能算是瀏覽器呢?所以,我們的 Python 瀏覽器當(dāng)然也要有一些開(kāi)發(fā)者工具才行。
現(xiàn)在,我們就來(lái)添加一些類(lèi)似于 Chrome 的開(kāi)發(fā)者工具中 “Network” 標(biāo)簽的功能吧!這個(gè)功能就是簡(jiǎn)單地追蹤瀏覽器引擎在加載頁(yè)面的時(shí)候所執(zhí)行的所有請(qǐng)求。在瀏覽器主頁(yè)面的下方,我們將通過(guò)一個(gè)表來(lái)顯示這些請(qǐng)求。簡(jiǎn)單起見(jiàn),我們只會(huì)記錄登錄的 url、返回的狀態(tài)碼和響應(yīng)的內(nèi)容類(lèi)型。
首先我們要通過(guò) QTableWidget 組件創(chuàng)建一個(gè)表格,表頭包括需要存儲(chǔ)的字段名稱(chēng),表格可以根據(jù)每次新插入的記錄來(lái)自動(dòng)調(diào)整大小。
想要追蹤所有請(qǐng)求的話,我們還需要對(duì) PyQt 的內(nèi)部構(gòu)件有更深入的了解。了解到,Qt 提供了一個(gè) NetworkAccessManager類(lèi)作為 API 接口,通過(guò)調(diào)用它可以監(jiān)控應(yīng)用加載頁(yè)面時(shí)所執(zhí)行的請(qǐng)求。我們需要自己編寫(xiě)一個(gè)繼承自 NetworkAccessManager 的子類(lèi),添加必要的事件監(jiān)聽(tīng)器,然后使用我們自己編寫(xiě)的 manager 來(lái)通知 webkit 視圖執(zhí)行相應(yīng)的請(qǐng)求。
首先我們需要以 NetworkAccessManager 為基類(lèi)創(chuàng)建我們自己的網(wǎng)絡(luò)訪問(wèn)管理器。
在這里需要提醒大家的是, Qt 的某些實(shí)現(xiàn)并不像想象中那么簡(jiǎn)單明了,比如說(shuō)從響應(yīng)中獲取狀態(tài)碼就十分繁瑣。首先,你得把請(qǐng)求對(duì)象的類(lèi)屬性作為參數(shù)傳入 response 的方法 .attribute() 中,.attribute() 方法的返回值是 QVariant 類(lèi)型而非 int 類(lèi)型。接著,需要調(diào)用內(nèi)置函數(shù) .toInt() 將其轉(zhuǎn)換成一個(gè)包含兩個(gè)元素的元組,最終得到響應(yīng)的狀態(tài)碼。
現(xiàn)在,我們終于有了一個(gè)記錄請(qǐng)求的表和一個(gè)監(jiān)控網(wǎng)絡(luò)的 manager,接下來(lái)只要把他們聚攏起來(lái)就可以了。
現(xiàn)在,運(yùn)行瀏覽器程序,在地址欄鍵入 url,就可以看到在主頁(yè)面下方的記錄表中記錄下的所有請(qǐng)求。
如果你有興趣的話,還可以為瀏覽器添加很多新的功能:
通過(guò)content-type添加篩選功能
添加記錄表的排序功能
添加計(jì)時(shí)器
高亮顯示出錯(cuò)的請(qǐng)求(比如說(shuō)把錯(cuò)誤信息置為紅色)
顯示出更為具體的請(qǐng)求內(nèi)容,比如說(shuō)完整的頭信息、響應(yīng)內(nèi)容、請(qǐng)求方法等。
增加一個(gè)重復(fù)發(fā)送請(qǐng)求并加載出來(lái)的選項(xiàng)。比如說(shuō)用戶可以點(diǎn)擊在記錄表中的請(qǐng)求來(lái)重試請(qǐng)求。
其實(shí)還有太多的功能可以繼續(xù)完善和改進(jìn),你可以一一嘗試一下,這會(huì)是一個(gè)非常有趣而且收獲良多的學(xué)習(xí)過(guò)程。但是如果想把這些功能都說(shuō)完,估計(jì)都能寫(xiě)一本書(shū)了。所以限于篇幅,本文就不一一介紹了,感興趣的朋友可以參考其他書(shū)籍和網(wǎng)上教程。
增加解析自定義 JavaScript 腳本的功能
我們終于迎來(lái)最后一個(gè)功能了!就是解析在頁(yè)面中包含的 JavaScript 腳本。
基于我們之前已經(jīng)打下的基礎(chǔ),要完成這個(gè)功能非常簡(jiǎn)單。我們只需要在添加一個(gè) QLineEdit 組件,把它和頁(yè)面聯(lián)系起來(lái),然后調(diào)用 evaulateJavaScript 方法就可以了。
下面是這個(gè)功能的示例。看,我們的開(kāi)發(fā)者工具已經(jīng)整裝待發(fā)了!
現(xiàn)在唯一缺少的就是在頁(yè)面中不能執(zhí)行 Python 腳本。你可以開(kāi)發(fā)自己的瀏覽器,提供對(duì) JavaScript 和 Python 的支持,這樣其他開(kāi)發(fā)者就可以針對(duì)你的瀏覽器開(kāi)發(fā)應(yīng)用了。
后退、前進(jìn)和其他頁(yè)面操作
我們?cè)谇懊嬉呀?jīng)使用了 QWebPage 對(duì)象來(lái)開(kāi)發(fā)瀏覽器,當(dāng)然作為一個(gè)合格的瀏覽器,我們也需要為終端用戶提供一些重要功能。Qt 的網(wǎng)頁(yè)對(duì)象支持很多不同操作,我們可以把它們?nèi)继砑拥綖g覽器中。
現(xiàn)在我們可以先嘗試著添加“后退”、“前進(jìn)”和“刷新”這幾個(gè)操作。你可以在界面上添加這些操作按鈕,簡(jiǎn)單起見(jiàn),這里只加一個(gè)文本框來(lái)執(zhí)行這些動(dòng)作。
和之前一樣,我們要?jiǎng)?chuàng)建一個(gè) ActionInputBox 的實(shí)例,把參數(shù)傳入頁(yè)面對(duì)象并把輸入框?qū)ο筇砑拥巾?yè)面中。
Graphical User Interface,圖形用戶界面,又稱(chēng)圖形用戶接口,是指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面。
WebKit是一個(gè)開(kāi)源的瀏覽器引擎,與之相對(duì)應(yīng)的引擎有 Gecko(Mozilla Firefox 等使用)和 Trident(也稱(chēng) MSHTML ,IE 使用)。
是不是很簡(jiǎn)單!
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。