要实现频繁请求限制,可以使用Flask插件Flask-Limiter来实现。以下是对代码的修改:
1. 首先,安装Flask-Limiter插件:
```
pip install flask-limiter
```
2. 在代码中导入Flask-Limiter和限制器的配置:
```python
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
# 在app之前配置限制器
limiter = Limiter(app, key_func=get_remote_address)
```
3. 在`get_file_url`函数上添加限制器的装饰器,并设置限制规则:
```python
@app.route('/api/fs/get')
@limiter.limit("10/minute") # 设置每分钟最多允许10次请求
def get_file_url():
...
```
这样一来,每个IP地址每分钟最多只能发送10个请求。可以根据实际需要调整限制规则的参数。
注意:还可以根据需要设置其他限制规则,比如限制特定路径或特定用户的请求频率。详细文档可以参考Flask-Limiter的官方文档
Flask中jsonify和json.dumps用法以及区别(简单案例)
环境:python3.6, Flask1.0.3
flask提供了jsonify函数供用户处理返回的序列化json数据,
而python自带的json库中也有dumps方法可以序列化json对象.
其二者的区别,写个简单的案例实测一下便见分晓。
from flask import Flask
from flask import jsonify
import json
app=Flask(__name__)
app.config['JSON_AS_ASCII'] = False
# 随便定义个json字典
dic={"a":1,"b":2,"c":"你好"}
@app.route('/jsonify')
def jsonifys():
# Content-Type: application/json
return jsonify(dic)
@app.route('/jsondumps')
def jsondumps():
# Content-Type: text/html; charset=utf-8
return json.dumps(dic,ensure_ascii=False)
if __name__ == '__main__':
app.run(debug=True)
1.我们先访问 http://127.0.0.1:5000/jsonify 地址查看jsonify返回的json内容为一个JSON格式的字典
{
“a”:1,
“b”:2,
“c”:”你好”
}
检查页面属性看Response内容:其中content-Type:application/json
2.再访问另一个地址 http://127.0.0.1:5000/jsondumps 查看返回的json内容差不多
{“a”:1,”b”:2,”c”:”你好”}
检查页面属性看Response内容:text/html
使用jsonify时响应的Content-Type字段值为application/json,
而使用json.dumps时该字段值为text/html。
ps:
使用jsonify方法是需要添加一句 app.config[‘JSON_AS_ASCII’] = False
而json.dumps方法需要添加参数 ensure_ascii=False
这样做可以避免显示中文乱码。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142355.html原文链接:https://javaforall.cn
python-selenium定位方法
元素选择策略
在 WebDriver 中有 8 种不同的内置元素定位策略:
class name 定位class属性与搜索值匹配的元素(不允许使用复合类名)
css selector 定位 CSS 选择器匹配的元素
id 定位 id 属性与搜索值匹配的元素
name 定位 name 属性与搜索值匹配的元素
link text 定位link text可视文本与搜索值完全匹配的锚元素
partial link text 定位link text可视文本部分与搜索值部分匹配的锚点元素。如果匹配多个元素,则只选择第一个元素。
tag name 定位标签名称与搜索值匹配的元素
xpath 定位与 XPath 表达式匹配的元素
class name定位
1.查找元素:页面打开f12,点击左上角的箭头,再去点击对应需要定位的元素定位,找到该元素下的class属性,在ctrl+f查找,该属性是否唯一,唯一就可以定位,不唯一就换其他方法定位:(一时找不到class唯一的,就用下图代替说明问题)
定位代码:
# 导入需要的包
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome() # 实例化webdriver
driver.get("http://www.baidu.com/") # 打开网页
driver.find_element(By.CLASS, "login-item")
nam、id、link tex、tag name定位和class name类似
driver.find_element(By.NAME, "name定位元素")
driver.find_element(By.ID, "id定位元素")
driver.find_element(By.LINK_TEXT, "LINK_TEXT定位元素")
driver.find_element(By.PARTIAL_LINK_TEXT, "PARTIAL_LINK_TEXT定位元素")
driver.find_element(By.TAG_NAME, "TAG_NAME定位元素")
主要介绍xpath定位,这个可以应对测试中80%以上的定位
1.使用xpath方法结合id、name、class定位也可以
driver.find_element(By.XPATH, "//*[@class='login-default']").click()
driver.find_element(By.XPATH, "//*[@name='login-default']").click()
driver.find_element(By.XPATH, "//*[@id='login-default']").click()
2.xpath:其他属性定位:在实际工作过程中,往往会遇到一个元素id、name、class属性都没有,这时候也可以通过其它属性定位到
driver.find_element(By.XPATH, "//*[@type='password']")
3.xpath:标签定位,在实际工作中,还会遇到一种情况就是相同属性具有同一个名字,这时就需要通过标签筛选,定位更准一点
如果不想制定标签名称,可以用*号表示任意标签
如果想制定具体某个标签,就可以直接写标签名称
driver.find_element(By.XPATH, "//input[@type='password']").send_keys("gld123")
driver.find_element(By.XPATH, "//a[@class='login']").click()
4.xpath:相对路径/绝对路径定位,
如果一个元素,它的属性不是很明显,无法直接定位到,这时候我们可以先找它上一层元素(父元素)
找到父元素后,再找下个层级就能定位到了
要定位的是input这个标签,它的老爸的id=s_kw_wrap.
要是它老爸的属性也不是很明显,就找它爷爷id=form
于是就可以通过层级关系定位到
driver.find_element(By.XPATH, "//div[@class='login-default']/div/span/input").send_keys("17027517202")
5.xpath:索引,
如果一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。因为都是一个父亲生的,多胞胎兄弟。
虽然双胞胎兄弟很难识别,但是出生是有先后的,于是可以通过它在家里的排行老几定位到。
用xpath定位老大、老二和老三(这里索引是从1开始算起的,跟Python的索引不一样)
driver.find_element(By.XPATH, "//div[@class='login-default']/div[2]/span/input").send_keys("17027517202")
6.xpath:逻辑运算
- xpath还有一个比较强的功能,是可以多个属性逻辑运算的,可以支持与(and)、或(or)、非(not)
- 一般用的比较多的是and运算,同时满足两个属性
driver.find_element(By.XPATH, "//input[@type='password' and @class='login-default']").send_keys("gld123")
使用selenium
一、环境搭建
(1)安装selenium库:
如果安装不上就上国内源
pip install selenium -i http://pypi.douban.com/simple –trusted-host pypi.douban.com
(2)下载Chrome驱动:
chromedriver的下载地址http://chromedriver.storage.googleapis.com/index.html
需要注意的是这里有很多种版本,这里需要下载和你浏览器版本最接近的一个。注意是最接 近,打开浏览器,在地址栏输入chrome://version/便可以查看到谷歌当前的版本号
解压会得到一个chromedriver.exe(名字不同就必成这个)文件。如果没有最新版本可到以下地址查看
https://googlechromelabs.github.io/chrome-for-testing/
因为chrome会自动更新,所以要在服务或者计划任务管理(控制面板-系统和安全-windows工具-计划任务)里把自动更新禁用
(3)将Chromedriver加入到path:
1.桌面右击谷歌浏览器–>打开文件所在位置,将刚解压的.exe文件复制一份到此路径下
- 将刚刚解压的.exe文件复制一份,放入python根目录中
至于如何查看自己的python根目录,可在cmd下进python,再输入 where python可得目录 - 将.exe文件再复制并放到当前工程文件同文件夹下
可以测试下看是否可以,python编译器,编写如下代码,运行如果出现窗口,提示正受测试软件控制,说明可以了,(反应慢,第一次可能要1分多钟)
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
sleep(2)
driver.quit()
到此处可能已可以了,如果不行进行4和5步,
(4)将浏览器环境变量添加到path:
打开开始菜单->我的电脑(或计算机)->系统属性->高级系统设置->环境变量,编辑用户变量里的path, 在最后面添加;C:\Program Files (x86)\Google\Chrome\Application\ 或者在最前面添加C:\Program Files (x86)\Google\Chrome\Application\ 修改完之后点击确定按钮保存配置。
如果出错,则:
将chromedriver.exe文件放入python的scripts目录,并将该scripts目录添加到系统path变量中;
3、找到Google Chrome安装目录,一般在C:\Users\Administrator\AppData\Local\Google\Chrome\Application\Google Chrome.exe,将Google Chrome.exe复制一个出来,并重命名为chrome.exe,并将目录C:\Users\Administrator\AppData\Local\Google\Chrome\Application\添加到系统path变量中
注意你的路径不一定和他相同,这个就是右击谷歌浏览器图标的路径,复制下来就好了
下载评论多的抖音视频和相关的评论
抖音有些评论相当的精彩,所以这次用python加fiddler来下载评论多的视频和相应的评论
刚开始打算用fiddler来抓抖音手机APP的包,按如下配置:
1、fiddler只能抓http/https协议的包,默认只能抓http协议包
如果要抓https协议包,需要如下配置:
Tools-Options-HTTPS-依次勾选全部
2、Actions里面-Trust Root Certificate-确定 来trust信用证书
3、Connections,设置端口号,fiddler默认8888
如果是手机用数据线连电脑就要把里面的 允许远程电脑连接也点上
4、如果是模拟器里装抖音或者手机装抖音并通过WIFI连接网络来抓包就在模拟器或者手机里设置网络代理为装fiddler的电脑IP
5、在手机上打开装fiddler的电脑的IP:8888,下载证书安装
按网上这个步骤来会导致抖音上不了网,按分析有可能是抖音应用证书问题,用了SSL Pinning主要就是来防止中间人攻击的,安卓应用会在HTTPS建立时对服务端返回的证书作校验,如果不一致则无法建立连接,我们用到的抓包工具fiddler或burpsuite实际上就是在起一个中间人的作用。具体可以参考https://zhuanlan.zhihu.com/p/511136064,以后再按这个来试下,今天还是按抖音网页版来抓包分析吧,
此段代码放到fiddler中的script的response中
if (m_Hide304s && oSession.responseCode == 304) {
oSession["ui-hide"] = "true";
}
if (oSession.uriContains("https://aweme.snssdk.com/aweme/v1/general/search/single/")){
var strBody=oSession.GetResponseBodyAsString();
var sps = oSession.PathAndQuery.slice(-58,);
//FiddlerObject.alert(sps)
var timestamp=new Date().getTime();
var filename = "D:\抖音评论资料" + "/" + sps + timestamp + ".json";
var curDate = new Date();
var sw : System.IO.StreamWriter;
if (System.IO.File.Exists(filename)){
sw = System.IO.File.AppendText(filename);
sw.Write(strBody);
}
else{
sw = System.IO.File.CreateText(filename);
sw.Write(strBody);
}
sw.Close();
sw.Dispose();
替换掉上面的网址和保存地址,这样网页版刷抖音时会把评论的JSON文件下载下来,视频信息JSON也同理操作
下载后用python分析JSON数据,把评论数大于36000的视频下载,并把相应的评论,视频信息插入数据库,相关代码见pycharm代码库
后面将把视频和评论在网站上展示出来。
Emoji表情插入Mysql时表字符集要转改成 utf8mb4
问题描述:
插入Mysql时失败了,python代码报如下异常:
pymysql.err.InternalError: (1366, “Incorrect string value: ‘\\xF0\\x9D\\x90\\xBF;……
原因分析:
UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。
解决方案:
修改Mysql表的字符集和Pymysql连接库时的字符集。
1、修改Mysql表的字符集
说明:将已经建好的表字符集转改成 utf8mb4,排序规则改为 utf8mb4_bin
命令:alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; (将TABLE_NAME替换成你的表名)
注意:排序规则不是 utf8mb4_general_ci,而是utf8mb4_bin,不要想当然
2、修改数据库连接的字符集
conn = pymysql.connect(host=’localhost’, user=’root’, password=’root’, port=3306, db=’cncb’, charset=’utf8mb4′)
gevent部署python网站
上篇我们用flask部署了一个很简单的网站,但是在开发环境下,不稳定,我们可以用gevent再来部署一个
可以先在命令行pip install gevent装好,然后
from flask import Flask
from gevent import pywsgi
app = Flask(name)
@app.route(‘/’)
def hello_world():
return ‘hello world’
server = pywsgi.WSGIServer((‘0.0.0.0’,12345),app)
server.serve_forever()
if name == ‘main‘:
app.run()
运行后会发现什么信息都没显示,但是用IP:12345正常访问!不知道这算不算是用wsgi 服务启动了!
另外会发现读取 .flaskenv 的值是读取不了,代码如下:
import os
mysql_config = {
‘DIALECT’ : os.getenv(‘MYSQL_DIALECT’),
‘DRIVER’ : os.getenv(‘MYSQL_DRIVER’),
‘USERNAME’ : os.getenv(‘MYSQL_USERNAME’),
‘PASSWORD’ : os.getenv(‘MYSQL_PASSWORD’),
‘HOST’ : os.getenv(‘MYSQL_HOST’),
‘PORT’ : os.getenv(‘MYSQL_PORT’),
‘DATABASE’ : os.getenv(‘MYSQL_DATABASE’)
}
需要加上以下代码才能读取
from dotenv import load_dotenv
load_dotenv(dotenv_path=’.flaskenv’,override=True)
python用flask搭建一个简单网站
我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,大部分代码引用自官方文档。
首先我们来安装Flask。最简单的办法就是使用pip,当你装好了python后,直接在命令行下输入。
pip install flask
然后打开一个文件,输入下面的内容并保存为app.py,然后在命令行下换到文件所在目录,再(python app.py)运行该文件。然后浏览器访问IP:5000,我们应当可以看到浏览器上输出了hello world。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=5000)
路径变量
如果希望获取/article/1这样的路径参数,就需要使用路径变量。路径变量的语法是/path/<converter:varname>。在路径变量前还可以使用可选的转换器,有以下几种转换器。
| 转换器 | 作用 |
|---|---|
| string | 默认选项,接受除了斜杠之外的字符串 |
| int | 接受整数 |
| float | 接受浮点数 |
| path | 和string类似,不过可以接受带斜杠的字符串 |
| any | 匹配任何一种转换器 |
| uuid | 接受UUID字符串 |
下面是Flask官方的例子。
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % username
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
构造URL
通过构建URL的方式直接在代码中拼URL的原因有两点:
1.将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。
2. url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动的帮助我们搞定。
在Web程序中常常需要获取某个页面的URL,在Flask中需要使用url_for('方法名')来构造对应方法的URL。下面是Flask官方的例子。
>>> from flask import Flask, url_for
>>> app = Flask(__name__)
>>> @app.route('/')
... def index(): pass
...
>>> @app.route('/login')
... def login(): pass
...
>>> @app.route('/user/<username>')
... def profile(username): pass
...
>>> with app.test_request_context():
... print url_for('index')
... print url_for('login')
... print url_for('login', next='/')
... print url_for('profile', username='John Doe')
...
/
/login
/login?next=/
/user/John%20Doe
HTTP方法
如果需要处理具体的HTTP方法,在Flask中也很容易,使用route装饰器的methods参数设置即可。
get和post 请求区别:
get是将请求写在url里的。
而post是写在form表单中的。
在route的methods中,写好post方法,否则默认是get,一旦请求方式是post会报错。
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
静态文件
Web程序中常常需要处理静态文件,在Flask中需要使用url_for函数并指定static端点名和文件名。在下面的例子中,实际的文件应放在static/文件夹下。
url_for('static', filename='style.css')
模板生成
Flask默认使用Jinja2作为模板,Flask会自动配置Jinja 模板,所以我们不需要其他配置了。默认情况下,模板文件需要放在templates文件夹下。
使用 Jinja 模板,只需要在python文件中使用render_template函数并传入模板文件名和参数名即可。
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
相应的templates文件夹里的HTML模板文件如下。用两个大括号写变量,用大括号加百分号写语句,访问时输入IP:端口/hello/就可以访问
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
编程资源&&Python常用库
https://github.com/vipstone/faceai python的AI人脸识别等
https://blog.csdn.net/SGDBS233/article/details/119192444 JS库D3使用介绍
echarts.apache.org 百度图表 JS库echarts
https://www.jianshu.com/p/e81a1ee6dca3 用JS实现的3D效果库threejs介绍
superset python轻量级开源可视化BI工具
Python常用库
(1)python模块:包含并且有组织的代码片段为模块。表现形式为:写的代码保存为文件。这个文件就是一个模块。a.py 其中文件名a为模块名字。
(2)python包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。通俗一点:包是一个包含init.py 文件的目录,该目录下一定得有这个init.py文件和其它模块或子包。
(3)库的概念是具有相关功能模块的集合。这也是Python的一大特色之一,即具有强大的标准库、第三方库以及自定义模块。
GUI图形界面
wxPython是Python语言的一套优秀的GUI图形库。允许Python程序员很方便的创建完整的、功能键全的GUI用户界面。 wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的。
WEB框架
Django是一个开放源代码的Web应用框架,由Python写成。 是Python生态中最流行的开源Web应用框架,Django采用模型、模板和视图的编写模式,称为MTV模式。
Flask是轻量级Web应用框架,相比Django和Pyramid,它也被称为微框架。使用Flask开发Web应用十分方便,甚至几行代码即可建立一个小型网站。Flask核心十分简单,并不直接包含诸如数据库访问等的抽象访问层,而是通过扩展模块形式来支持。
科学计算及数据分析处理及可视化
NumPy 是使用 Python 进行科学计算所需的基础包。用来存储和处理大型矩阵,如矩阵运算、矢量处理、N维数据变换等。
Matplotlib 是一个 Python 的 2D绘图库
SciPy:算法和数据工具集
爬虫相关
requests对HTTP协议进行高度封装,支持非常丰富的链接访问功能。
scrapy很强大的爬虫框架,用于抓取网站并从其页面中提取结构化数据。可用于从数据挖掘到监控和自动化测试的各种用途。
pyspider是一个国人编写的强大的网络爬虫系统并带有强大的WebUI。
bs4-beautifulsoup4库是用于解析和处理HTML和XML。
Crawley是用来高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等。
Portia是可视化爬取网页内容。
webbrowser
【标准库】
操纵当前系统的默认浏览器,访问指定 URL 的页面。
代码示例——用默认浏览器打开 Google 主页
import webbrowser
webbrowser.open("http://www.google.com")
机器学习
NLTK是一个自然语言处理的第三方库,NLP领域中常用,可建立词袋模型(单词计数),支持词频分析(单词出现次数)、模式识别、关联分析、情感分析(词频分析+度量指标)、可视化(+matploylib做分析图)等
TensorFlow是谷歌的第二代机器学习系统
Keras 是一个高级神经网络 API,用 Python 编写,能够在 TensorFlow,CNTK 或 Theano 之上运行。它旨在实现快速实验,能够以最小的延迟把想法变成结果,这是进行研究的关键。”
Caffe是一个深度学习框架,主要用于计算机视觉,它对图像识别的分类具有很好的应用效果。
theano是深度学习库。
办公自动化
XlsxWriter-操作Excel工作表的文字,数字,公式,图表等
smtplib-发送电子邮件模块
selenium-一个调用浏览器的driver,通过这个库可以直接调用浏览器完成某些操作,比如输入验证码,常用来进行浏览器的自动化工作
pdfminer-一个可以从PDF文档中提取各类信息的第三方库
pywin32:与windows交互的
其它
pillow:是PIL的友好分支,更友好
Twisted:网络应用程序开发最重要的工具
Pygame:2D游戏开发
Pyglet:3D动画和游戏创作引擎
还有其它:
https://github.com/csy512889371/learnDoc/blob/master/wiki/python.wiki#111_-2
正则表达式疑点
.*和.*?区别
1. .*
. 表示匹配除换行符 \n 之外的任何单字符,*表示零次或多次。所以.*在一起就表示任意字符出现零次或多次。没有?表示贪婪模式。比如a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
又比如模式src=`.*`, 它将会匹配最长的以 src=` 开始,以`结束的最长的字符串。用它来搜索 <img src=“test.jpg` width=`60px` height=`80px`/> 时,将会返回 src=“test.jpg` width=`60px` height=`80px`
2. .*?
?跟在*或者+后边用时,表示懒惰模式。也称非贪婪模式。就是匹配尽可能少的字符。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
又比如模式 src=`.*?`,它将会匹配 src=` 开始,以 ` 结束的尽可能短的字符串。且开始和结束中间可以没有字符,因为*表示零到多个。用它来搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 时,将会返回 src=“。
3. .+?
同上,?跟在*或者+后边用时,表示懒惰模式。也称非贪婪模式。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。a.+?b匹配最短的,以a开始,以b结束的字符串,但a和b中间至少要有一个字符。如果把它应用于ababccaab的话,它会匹配abab(第一到第四个字符)和aab(第七到第九个字符)。注意此时匹配结果不是ab,ab和aab。因为a和b中间至少要有一个字符。
又比如模式 src=`.+?`,它将会匹配 src=` 开始,以 ` 结束的尽可能短的字符串。且开始和结束中间必须有字符,因为+表示1到多个。用它来搜索 <img src=“test.jpg` width=`60px` height=`80px`/> 时,将会返回 src=“test.jpg`。注意与.*?时的区别,此时不会匹配src=“,因为src=` 和 ` 之间至少有一个字符。