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数据库并不适合大型数据使用,一般用来存储一些小批量信息,如爬取某些电影的磁力
#链接进行保存。分别存储电影名称,演员,链接,时长等信息。以及记录链接分享日期。
.使用该代码需要先安装pypyodbc库。在dos窗口输入以下指令
pip install pypyodbc
2.在微软官网下载相应驱动分为32和64位版本。
下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=54920
3.相关参数详细说明:
3-1. mybt.accdb为数据库文件所在地址,后缀为accdb。
sql_path=r"mybt.accdb"
这是文件截图
3.2. 表名对于下图中的表1。
table_name="表名"
3.2详图
3.3 INSERT代表插入内容,表面对应上面所说的表名,第一个小括号内1,2,分别指上图中的表格里的1,2(你自己命名的,它对应了相应的数据类型)。demo1,demo2表示改指令把demo1,demo2分别对应1,2的位置插入。执行结果见下图。
易错:当使用列表元素填充时,外面一定要加“''”,否则执行会报错(不会显示报错,因为不加引号符合Python语法)。
sql=f"INSERT INTO 表名 (1,2) VALUES ('demo1','demo2');"
sql=f"INSERT INTO 表名 (1,2) VALUES ('{a[0]}','{a[1]}');"
这是执行完指令后的结果
ython开发web服务的优势是开发效率高,可能只需要java五分之一的代码量。
Python搭建web服务有许多框架,本文介绍Django和bottle两个框架。
首先,安装该框架
安装成功,版本是1.11.28. 框架的文件安装在\python27\Scripts目录下(搜索电脑中Python安装目录下的Scripts就对了)。
先进入\python27\Scripts目录,建立项目jinanwx(名称随便起)
同一个目录下可以看到新建立工程的目录
进入python27\Scripts\jinanwx\jinanwx。新建我们自己的模块
jgotest01.py里面写简单的代码如下
模块功能就是返回个json格式结果。
然后需要改urls.py模块
目录文件如下
就这么简单,新建一个文件再修改一个文件,就成了。
回到上一级目录启动服务
启动成功,浏览器访问试试
开发功能不是特别复杂的web服务,可以考虑使用bottle框架,它比Django轻量。bottle例子在Linux下演示。
使用bottle框架首先安装。一个指令搞定。
# pip install bottle
进入Python命令行import bottle,没报错就是成功了。
我的web服务就一个文件bottleweb.py,代码如下,一些解释在代码的注释里
#coding=utf-8
from bottle import (run, route, get, post, put, delete, request, hook, response, static_file, app)
import json
import MySQLdb #本例子需要操作数据库,否则可以不写这行,这个数据库包pip估计安装不会成功,我是用yum install MySQL-python成功的
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import bottle
app = bottle.default_app()#处理静态资源需要定义,没有静态资源可以不写这行
#搭建vue脚手架前后台联调时要下面两个@hook内容,否则会报跨域访问资源的错误
@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>')#静态资源在web服务下的地址,没放前端的静态资源这几个route和app.route可以不写
def stat(path):
return static_file(path, root='./dist/')
@app.route('/test2020/dist/static/js/<path>')
def js(path): #这几个目录我写成这样是因为vue打包完后目录结构就是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')#返回某个表中的日期,看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接收处理,其实返回各种类型都可以
@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所在目录执行
#python bottleweb.py
web服务就启动了。浏览器访问http://127.0.0.1:2020/test2020/helloworld看效果。
如果安装了MySQL数据库可以测试test2020/date的url是否能返回结果
数据库只要有下面的数据就可以
前端页面是这个样子的,给用户选择某个日期。
前端是用vue+vux来开发的,开发完打包打出的东西上传到代码中提到的dist静态资源目录下。
如果觉得上面的代码有点复杂,可以把所有route, app.route的东西删除,把/test2020/date语句块也删除,把@hook删除,MySQL的东西删除,前端的东西也完全不考虑,就是最简单的bottle web服务,相当于hello world。
建议尽量懂上面的代码,涉及了静态资源,数据库,是web服务必须的内容。
分享一个遇到的pip的问题,我Python版本很低2.6.6。本来通过安装yum的epel,已经成功安装了好用的pip。但是每次我用pip命令,最下方都会提示升级
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
我执行了pip install --upgrade pip升级,然后pip指令就不能用了。而且升级了之后,在想安装回低版本的pip就没有对应的安装包了。yum只能找到20.0.2版本的(老版本会被覆盖难道?)。
http://bootstrap.pypa.io/2.6/get-pip.py
下载了get-pip.py也无法安装成功。最后在上面的地址下载到了2.6版本的安装文件,才成功安装可以使用的pip。
相比java,python开发web代码量少,需要安装的库少,如果能满足功能和性能要求,python可能是更好的选择。
这篇教程中,我们会用 Python 的 PyQt 框架编写一个简单的 web 浏览器。关于 PyQt ,你可能已经有所耳闻了,它是 Qt 框架下的一系列 Python 组件,而 Qt(发音类似“cute”)是用来开发 GUI 的 C++ 框架。严格来讲, Qt 也可用于开发不带图形界面的程序,但是开发用户界面应该是 Qt 框架最为广泛的应用了。Qt 的主要优势是可以开发跨平台的图形界面程序,基于 Qt 的应用能够借助于各平台的原生性在不同类的设备上运行,而无须修改任何代码库。
想要学习Python。关注小编头条号,私信【学习资料】,即可免费领取一整套系统的板Python学习教程!
Qt 附带了 webkit 的接口,你可以直接使用 PyQt 来开发一个基于 webkit 的浏览器。
我们本次教程所开发的浏览器可以完成如下功能:
加载用户输入的url
显示在渲染页面过程中发起的所有请求
允许用户在页面中执行自定义的 JavaScript 脚本
牛刀小试
让我们从最简单的 PyQt 的 Webkit 用例开始吧:输入 url,打开窗口并在窗口中加载页面。
这个例子十分短小,连 import 语句和空行在内也只有 13 行代码。
当你通过命令行将 url 传给脚本时,程序会加载 url 并且在窗口中显示加载完成的页面。
现在,看似你已经有一个“命令行浏览器”啦!至少比 python 的 requests 模块强多了,甚至比 Lynx 还略高一筹,因为我们的浏览器还可以加载 JavaScript 脚本呢。但是目前为止还没有跟 Lynx 拉开差距,因为在启用浏览器的时候只能通过命令行传入 url。那么,必然需要通过某种方式把需要加载的 url 传入浏览器。没错,就是地址栏!
添加地址栏
其实地址栏的实现非常简单,我们只需要在窗口顶端加一个输入框就够了。用户在文本框中输入 url 之后,浏览器就会加载这个地址。下面,我们将用到 QLineEdit 控件来实现输入框。鉴于我们的浏览器现在有地址栏和浏览器显示框两部分,因此还要给我们的应用增加一个网格布局。
到这里,我们已经有一个浏览器的雏形啦!看上去和当年的 Google Chrome 还有几分相像呢,毕竟两者采用了相同的渲染引擎。现在,你可以在输入框中输入 url ,程序便会将地址传入浏览器,接着渲染出所有的 HTML 页面和 JavaScript 脚本并展示出来。
添加开发工具
一个浏览器最有趣也最重要的部分是什么?当然是各种各样的开发工具了!一个没有开发者控制台的浏览器怎么能算是浏览器呢?所以,我们的 Python 浏览器当然也要有一些开发者工具才行。
现在,我们就来添加一些类似于 Chrome 的开发者工具中 “Network” 标签的功能吧!这个功能就是简单地追踪浏览器引擎在加载页面的时候所执行的所有请求。在浏览器主页面的下方,我们将通过一个表来显示这些请求。简单起见,我们只会记录登录的 url、返回的状态码和响应的内容类型。
首先我们要通过 QTableWidget 组件创建一个表格,表头包括需要存储的字段名称,表格可以根据每次新插入的记录来自动调整大小。
想要追踪所有请求的话,我们还需要对 PyQt 的内部构件有更深入的了解。了解到,Qt 提供了一个 NetworkAccessManager类作为 API 接口,通过调用它可以监控应用加载页面时所执行的请求。我们需要自己编写一个继承自 NetworkAccessManager 的子类,添加必要的事件监听器,然后使用我们自己编写的 manager 来通知 webkit 视图执行相应的请求。
首先我们需要以 NetworkAccessManager 为基类创建我们自己的网络访问管理器。
在这里需要提醒大家的是, Qt 的某些实现并不像想象中那么简单明了,比如说从响应中获取状态码就十分繁琐。首先,你得把请求对象的类属性作为参数传入 response 的方法 .attribute() 中,.attribute() 方法的返回值是 QVariant 类型而非 int 类型。接着,需要调用内置函数 .toInt() 将其转换成一个包含两个元素的元组,最终得到响应的状态码。
现在,我们终于有了一个记录请求的表和一个监控网络的 manager,接下来只要把他们聚拢起来就可以了。
现在,运行浏览器程序,在地址栏键入 url,就可以看到在主页面下方的记录表中记录下的所有请求。
如果你有兴趣的话,还可以为浏览器添加很多新的功能:
通过content-type添加筛选功能
添加记录表的排序功能
添加计时器
高亮显示出错的请求(比如说把错误信息置为红色)
显示出更为具体的请求内容,比如说完整的头信息、响应内容、请求方法等。
增加一个重复发送请求并加载出来的选项。比如说用户可以点击在记录表中的请求来重试请求。
其实还有太多的功能可以继续完善和改进,你可以一一尝试一下,这会是一个非常有趣而且收获良多的学习过程。但是如果想把这些功能都说完,估计都能写一本书了。所以限于篇幅,本文就不一一介绍了,感兴趣的朋友可以参考其他书籍和网上教程。
增加解析自定义 JavaScript 脚本的功能
我们终于迎来最后一个功能了!就是解析在页面中包含的 JavaScript 脚本。
基于我们之前已经打下的基础,要完成这个功能非常简单。我们只需要在添加一个 QLineEdit 组件,把它和页面联系起来,然后调用 evaulateJavaScript 方法就可以了。
下面是这个功能的示例。看,我们的开发者工具已经整装待发了!
现在唯一缺少的就是在页面中不能执行 Python 脚本。你可以开发自己的浏览器,提供对 JavaScript 和 Python 的支持,这样其他开发者就可以针对你的浏览器开发应用了。
后退、前进和其他页面操作
我们在前面已经使用了 QWebPage 对象来开发浏览器,当然作为一个合格的浏览器,我们也需要为终端用户提供一些重要功能。Qt 的网页对象支持很多不同操作,我们可以把它们全都添加到浏览器中。
现在我们可以先尝试着添加“后退”、“前进”和“刷新”这几个操作。你可以在界面上添加这些操作按钮,简单起见,这里只加一个文本框来执行这些动作。
和之前一样,我们要创建一个 ActionInputBox 的实例,把参数传入页面对象并把输入框对象添加到页面中。
Graphical User Interface,图形用户界面,又称图形用户接口,是指采用图形方式显示的计算机操作用户界面。
WebKit是一个开源的浏览器引擎,与之相对应的引擎有 Gecko(Mozilla Firefox 等使用)和 Trident(也称 MSHTML ,IE 使用)。
是不是很简单!
*请认真填写需求信息,我们会在24小时内与您取得联系。