python爬虫复习自制(一些自己认为的重点)

1.3.1 客户端GET方式发送数据

GET方式发送使得数据附加在URL后面,在URL后面先接一个"?"号,数据采用:
"名称1=值1&名称2=值2&名称3=值3……“的方式,多个数据之间用”&"符号隔开,例如向服务器传递省份与城市的数据就可以这样写:

urllib.request.urlopen("http://127.0.0.1:5000?province=GD&city=SZ")

如果参数值包含汉字,那么我们必须使用urllib.parse.quote对参数值进行编码,例如:

province= urllib.parse.qoute("广东")
city= urllib.parse.qoute("深圳")
urllib.request.urlopen("http://127.0.0.1:5000?province="+province+"&city="+city)

client.py代码

import urllib.parse
import urllib.request
url="http://127.0.0.1:5000"
try:
    province= urllib.parse.quote("广东")
    city= urllib.parse.quote("深圳")
    data="province="+province+"&city="+city
    resp=urllib.request.urlopen("http://127.0.0.1:5000?"+data)
    htmldata = resp.read()  #这个网站打开后就如同打开文件一样,要使用read函数读取网站的内容,读出的二进制数据
    html = htmldata.decode()  #把二进制数据html转为字符串
    print(html)
except Exception as err:
    print(err)

服务器用Flask中的request对象的args来存储GET的参数,用get方法来获取参数,即用flask.request.args.get(参数)来获取参数的值,例如:

province=flask.request.args.get("province")
city=flask.request.args.get("city")

server.py代码

import flask
app=flask.Flask(__name__)

@app.route("/")
def index():
    try:
        province=flask.request.args.get("province")
        city = flask.request.args.get("city")
        return province+","+city
    except Exception as err:
        return str(err)

if __name__=="__main__":
    app.run()

1.4.1 客户端POST发送数据

POST方法访问网站时客户端向服务器发送表单数据,表单数据的组织方式与GET方法的参数列表十分相似,结构如下:
“名称1=值1&名称2=值2&名称3=值3……”
多个数据之间用"&"符号隔开,如果参数值包含汉字,那么我们必须使用urllib.parse.quote对参数值进行编码,例如:

province= urllib.parse.qoute("广东")
city= urllib.parse.qoute("深圳")
data="province="+province+"&city="+city
data=data.encode() #这里data=data.encode()是把data字符串按utf-8的编码转为二进制数据。
#POST方法与GET方法最大的不同是GET的参数放在地址栏的后面,
#而POST的数据放在urlopen函数的data参数中,而且这个参数值必须是二进制数据。
urllib.request.urlopen("http://127.0.0.1:5000",data=data)

client.py

import urllib.parse
import urllib.request
url="http://127.0.0.1:5000"
try:
    province= urllib.parse.quote("广东")
    city= urllib.parse.quote("深圳")
    data="province="+province+"&city="+city
    data=data.encode()
    html=urllib.request.urlopen(“http://127.0.0.1:5000”,data=data)   #data要接收的是二进制数据
    html = html.read()
    html = html.decode()
    print(html)
except Exception as err:
    print(err)

服务器用Flask中的request对象的form来存储GET的参数,用get方法来获取参数,即用flask.request.form.get(参数)来获取参数的值,例如:

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

server.py

import flask
app=flask.Flask(__name__)
 
@app.route("/",methods=["POST"])
def index():
    try:
        province=flask.request.form.get("province") if "province" in flask.request.form else ""
        city = flask.request.form.get("city") if "city" in flask.request.form else ""
        return province+","+city
    except Exception as err:
        return str(err)
 
if __name__=="__main__":
    app.run()
    
值得注意的是在服务器中要指定:
@app.route("/",methods=["POST"])
def index():
表明函数这个函数接受POST请求。默认时只接受GET请求,如果要接受POST请求就必须明确指明,如果写成:
@app.route("/",methods=["GET","POST"])
def index():
那么这个函数即可以接受GET请求也可以接受POST请求。

1.4.3 GET与POST的混合使用

client.py

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

server.py

import flask
app=flask.Flask(__name__)
 
@app.route("/",methods=["GET","POST"])
def index():
    try:
        province=flask.request.values.get("province") if "province" in flask.request.values else ""
        city = flask.request.values.get("city") if "city" in flask.request.values else ""
        note = flask.request.values.get("note") if "note" in flask.request.values else ""
        return province+","+city+"\n"+note
    except Exception as err:
        return str(err)
 
if __name__=="__main__":
    app.run()

1.5.1 Web下载文件服务器程序

server.py

import flask
import os #磁盘文件管理库

app=flask.Flask(__name__)


@app.route("/")
def index():
    if "fileName" not in flask.request.values:
        return "图像.jpg"
    else:
        data = b""
        try:
            fileName = flask.request.values.get("fileName")
            if fileName != "" and os.path.exists(fileName):
                fobj = open(fileName, "rb")
                data = fobj.read()
                fobj.close()
        except Exception as err:
            data = str(err).encode()
        return data

if __name__=="__main__":
    app.run()

1.5.2 Web下载文件客户端程序

client.py

import urllib.parse
import urllib.request
url="http://127.0.0.1:5000"
try:
    html=urllib.request.urlopen(url)
    html = html.read()
    fileName=html.decode()#服务器端返回服务器上可以下载的文件名称
    print("准备下载:"+fileName)
    resp=urllib.request.urlopen(url+"?fileName="+urllib.parse.quote(fileName))
    data = resp.read()
    fobj=open("download "+fileName,"wb")
    fobj.write(data)
    fobj.close()
    print("下载完毕:",len(data),"字节")
except Exception as err:
    print(err)

1.6 Web上传文件

server.py

import flask
import os #磁盘文件管理库

app=flask.Flask(__name__)


@app.route("/upload",methods=["POST"])
def uploadFile():
   msg=""
   try:
       if "fileName" in flask.request.values:
           fileName = flask.request.values.get('fileName')#获取文件名称
           data=flask.request.get_data()#获取数据
           fobj=open("upload "+fileName,"wb")
           fobj.write(data)
           fobj.close()
           msg="OK"
       else:
           msg="没有按要求上传文件"
   except Exception as err:
       print(err)
       msg=str(err)
   return msg

if __name__=="__main__":
   app.run()

data=flask.request.get_data()#获取数据
可以获取未经处理过的原始数据而不管内容类型,如果数据格式是json的,则取得的是json字符串,排序和请求参数一致

1.6.2 Web上传客户端程序

import urllib.request
import os #python 标准库,实现基本操作系统交互功能

url="http://127.0.0.1:5000/upload"
filePath=input("Enter the file:")
if os.path.exists(filePath):
    fobj=open(filePath,"rb")
    data=fobj.read()
    fobj.close()
    p=filePath.rfind('\\')
    #找到path的最后一个‘\’的位置
    fileName=filePath[p+1:]
    #从最后一个‘\’的位置之后的一个位置截取出要下载的文件名称
    print("准备上传:"+fileName)
    headers = {'content-type': 'application/octet-stream'}#字典,指明上传的文件类型
    purl=url+"?fileName="+urllib.parse.quote(fileName)
    req = urllib.request.Request(purl, data, headers)#合成一个Request对象req
    resp=urllib.request.urlopen(req)#传递request对象给服务器
    msg=resp.read().decode()#读取服务器的返回结果,是否成功的标签
    if msg=="OK":
        print("成功上传:",len(data),"字节")
    else:
        print(msg)
else:
    print("文件不存在!")

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值