当前位置:   article > 正文

【爬虫】1.4 POST 方法向网站发送数据_网页爬虫 post数据

网页爬虫 post数据

1. 客户端 POST 发送数据


采用 POST 方法访问网站时,客户端向服务器发送表单数据,表单数据的组织方式与 GET 方法的参数列表十分相似,结构如下:

"名称1=值1&名称2=值2……"

多个数据之间用 “&” 符号隔开,如果参数包含汉字,那么必须使用 urllib.parse.quote 对参数进行编码。例如:

  1. province=urllib.parse.quote("广东")
  2. city=urllib.parse.quote("深圳")
  3. data="province="+province+"&city="+city
  4. data=data.encode() # string按UTF-8编码-->二进制数据
  5. html=urllib.request.urlopen("http://127.0.0.1:50000", data=data)

POST方法与GET方法最大的不同

  • 安全性问题:GET 的 参数显示在地址栏的后面,Post 不会,

  • POST 的数据放在urlopen 函数的 data 参数中,

  • 而且这个参数必须是二进制数据;

  • 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到,Post 方式,数据放置在html header 内提交;

  • Get方式提交的数据最多只能有1024字节,Post 则没有限制。

编写客户端client.py程序如下:

  1. importurllib.parse
  2. importurllib.request
  3. url="http://127.0.0.1:5000"
  4. try:
  5. province=urllib.parse.quote("广东")
  6. city=urllib.parse.quote("深圳")
  7. data="province="+province+"&city="+city
  8. data=data.encode() # string按UTF-8编码-->二进制数据
  9. html=urllib.request.urlopen("http://127.0.0.1:50000", data=data)
  10. html=html.read()
  11. html=html.decode() # 二进制数据——>string
  12. print(html)
  13. exceptExceptionaserr:
  14. print(err)

2. 服务器获取 POST 的数据


服务器用 Flask 中的 request 对象form 来存储 GET 的参数,用 get 方法来获取参数,即用flask.request.form.get(参数) 来获取参数的值。例如:如下…语句可以获取 GET 传递的参数 province 与 city 的值。

  1. province=flask.request.form.get("province")
  2. city=flask.request.form.get("city")

编写服务器程序server.py 如下:

  1. importflask
  2. app=flask.Flask(__name__)
  3. @app.route("/", methods=["POST"]) # 表明这个函数接收POST请求。
  4. # @app.route("/", methods=["GET", "POST"]) 这个函数既可以接收GET请求,也可以接收POST请求。
  5. # 默认时只接收GET请求,要接收POST请求就必须明确指明
  6. def index():
  7. try:
  8. province=flask.request.form.get("province") if"province"inflask.request.formelse""
  9. city=flask.request.form.get("city") if"city"inflask.request.formelse""
  10. returnprovince+","+city
  11. exceptExceptionaserr:
  12. returnstr(err)
  13. if__name__=="__main__":
  14. app.run()

先运行 server.py 建立Web 网站,再运行 client.py,可以看到client.py结果如下:


3. GET 与 POST 的混合使用


实际上,在应用中客户端同时使用GET 与 FOST 向服务器发送数据,一般 GET 的数据放在地址栏的后面,参数简单,数据量少,而POST 的数据是表单数据,数据量大

例如,客户端向服务器发送一个城市的简介,服务器接收后返回收到的信息。

解决如下:

我们把省份province与城市city的名称放在URL地址栏后面采用 GET 方式发送给服务器,

然后把城市的简介POST 方法发送给服务器。

客户端程序client.py如下:

  1. importurllib.parse
  2. importurllib.request
  3. url="http://127.0.0.1:5000"
  4. note="深圳依山傍海,气候宜人,实在是适合人类居住的绝佳地。" \
  5. "这里四季如春,干净整洁,比邻香港,拥有着丰富的自然景观和人文气息。" \
  6. "匆匆过客注意到的也许只有它的时尚繁华,忙碌的暂居者也可能对它有着不识城市真面目之感。" \
  7. "只有世代在此生活的老深圳人,才明白它从贫穷走向富饶经历了怎样的艰辛。 "
  8. try:
  9. province=urllib.parse.quote("广东")
  10. city=urllib.parse.quote("深圳")
  11. note="note="+urllib.parse.quote(note)
  12. param="province="+province+"&city="+city
  13. html=urllib.request.urlopen("http://127.0.0.1:5000?"+param, data=note.encode())
  14. html=html.read().decode()
  15. print(html)
  16. exceptExceptionaserr:
  17. print(err)

服务器程序server.py如下:

  1. import flask
  2. app=flask.Flask(__name__)
  3. @app.route("/", methods=["GET", "POST"])
  4. def index():
  5. try:
  6. province=flask.request.args.get("province") if"province"inflask.request.argselse""
  7. city=flask.request.args.get("city") if"city"inflask.request.argselse""
  8. note=flask.request.form.get("note") if"note"inflask.request.formelse""
  9. returnprovince+","+city+"\n"+note
  10. exceptExceptionaserr:
  11. returnstr(err)
  12. if__name__=="__main__":
  13. app.run()

先运行服务器程序建立Web网站,再运行客户端程序,可以看到服务器返回的结果如下:


服务器接收 GET 的参数采用 flask.request.args.get(参数),与接收 POST 参数的方法 flask.request.form.get(参数) 是不同的,实际上可以把它们统一成 flask.request.values.get(参数)。采取这个方法,可以获 GET 的参数,也可以获取 POST 的参数,即:

服务器server.py程序改进如下:

  1. import flask
  2. app=flask.Flask(__name__)
  3. @app.route("/", methods=["GET", "POST"])
  4. def index():
  5. try:
  6. province=flask.request.values.get("province") if"province"inflask.request.valueselse""
  7. city=flask.request.values.get("city") if"city"inflask.request.valueselse""
  8. note=flask.request.values.get("note") if"note"inflask.request.valueselse""
  9. returnprovince+","+city+"\n"+note
  10. exceptExceptionaserr:
  11. returnstr(err)
  12. if__name__=="__main__":
  13. app.run()

下一篇文章:1.5 Web下载文件

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/850017
推荐阅读
相关标签
  

闽ICP备14008679号