精华内容
下载资源
问答
  • 2、分析:ithcat发送文件使用urllib3,而urllib3确实存在中文编码问题 3、解决:找到 D:\Python36\Lib\site-packages\urllib3 下的fields.py 备份为fields.py.bak ,然后修改第46行为(如下图): 修改前 ...

    1、问题:项目中在使用itchat发送文件时发现包含中文字符的文件会无法正常发送

    2、分析:ithcat发送文件使用urllib3,而urllib3确实存在中文编码问题

    3、解决:找到 D:\Python36\Lib\site-packages\urllib3 下的fields.py 备份为fields.py.bak ,然后修改第46行为(如下图):

    修改前

     value = '%s*=%s' % (name, value)

    修改后

    value = '%s="%s"' % (name, value.encode('utf-8').decode('utf8'))

     

    注:运行环境:python3.6    。有问题沟通或需要本人提供 fields.py 这个文件的话,可以加我微信 my186soft 

     

    转载于:https://www.cnblogs.com/lostvip/p/9635480.html

    展开全文
  • 前言上一篇内容,已经学会了使用简单的语句对网页进行抓取。...上一篇我们说过 urllib有几个默认的参数,出了几个默认的参数外 出了url 这次我需要用到一个dataurllib.request.urlopen(url, data=None, [t...

    前言

    上一篇内容,已经学会了使用简单的语句对网页进行抓取。接下来,详细看下urlopen的两个重要参数url和data,学习如何发送数据data。我们想做一个百度翻译就需要向百度翻译的服务器发送我们想要翻译的内容。

    上一篇我们说过 urllib有几个默认的参数,出了几个默认的参数外 出了url 这次我需要用到一个data

    urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

    urlopen的url参数

    url不仅可以是一个字符串,例如:http://www.baidu.com。url也可以是一个Request对象.

    urlopen()返回的对象,除了read()方法外,还有geturl()方法、info()方法、getcode()方法。、

    geturl():返回的是一个url的字符串;

    info():返回的是一些meta标记的元信息,包括一些服务器的信息;

    getcode():返回的是HTTP的状态码,如果返回200表示请求成功。

    urlopen的data参数

    我们可以使用data向服务器发送数据,我们这篇要制作的百度翻译就通过data向百度翻译的服务器发送数据,然后或去百度翻译服务器返回的结果。最终将显示出来。

    data参数有自己的格式,它是一个基于application/x-www.form-urlencoded的格式,具体格式我们不用了解, 因为我们可以使用urllib.parse.urlencode()函数将字符串自动转换成上面所说的格式。

    制作百度翻译

    首先使用 Chrome 浏览器打开 百度翻译,这里,我们选择 Chrome 浏览器自带的开发者工具对网站进行抓包分析

    b4d0d81b5656037176cba62c7ba57d37.png

    1. 抓包分析

    打开 Network 选项卡进行监控,并选择 XHR 作为 Filter 进行过滤

    然后,我们在输入框中输入待翻译的文字进行测试,可以看到如下图红色框中的内容

    我们主要分析 sug 但是下面有好多sug我们要查看哪一个呢,之所以有这么多sug是因为百度翻译默认开启的是实施翻译,也就是你输入一个字你在打拼音的是时候每按下一个字母他就会翻译一次,直到这个后我们就可以知道,最后一个sug就是我们完整的文字。

    a3ca2c9da0efbad397fd48b626cf8b53.png

    我们可以验证一下 点击最下面的那个sug,我们可以看到下图红色框框的内容就是我们请求的URL。

    f5a66a148c9dc1f353d7e690f864dfcd.png

    滚到最下面我们可以看到我们输入的翻译内容 “你好”,这个For Data就是发送到百度翻译服务器的内容,然后服务器会返回对应的翻译给带浏览器,最后显示在浏览器上给我们看。

    dffe98f02c97ffee9b97287747820bd8.png

    我们还可看到一个 request Headers 中有一个:

    user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36

    这个user-agent的意思是告诉服务器我使用谷歌浏览器访问的,有些网站会有反爬虫,如果发现你是爬虫访问的就会阻止你,我们只要加上这个user-agent就可以让服务器以为我们是用户通过浏览器访问的

    fd1c9704edfd717576361941b815c02d.png

    记住上面三个数据,下面我们就要用到。

    直接上完整代码

    import urllib.request

    import urllib.parse

    import json

    # 请求的网址

    Request_URL = "https://fanyi.baidu.com/sug"

    while True:

    text = input("翻译内容")

    #表单数据(需要翻译的内容)

    Form_Data = {

    "kw": text

    }

    #创建一个User-Agent

    head = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"}

    #使用urlencode方法转换标准格式

    data = urllib.parse.urlencode(Form_Data).encode('utf-8')

    # 构造请求对象

    req = urllib.request.Request(Request_URL,data,head)

    # 发送请求,获得响应

    req = urllib.request.urlopen(req)

    # 获取服务器响应数据

    req_data = req.read().decode("utf-8")

    #使用json解析数据

    html = json.loads(req_data)

    #找到想要的结果

    results = html['data'][0]['v']

    #打印结果

    print(results)

    最终效果

    aa7e05dd9bd807b2c73b6c1dface6640.gif

    如果还想要具体一点的结果可以使用 正则或者 split()方法 这里就不详细说明了。

    结语

    如果还想增加一点难度,可以试一试有道翻译 方法类似,有兴趣的话可以自己尝试一下。

    展开全文
  • urllib 的基础

    2019-02-27 20:31:07
    import urllib.parse # 用于解码中文 url ='http://127.0.0.1:5000/' # 首先要访问的网址 getdata = 'province=广东' # 用get方式发送数据内容,必须用key=value的形式 getdata1 = 'city=深圳' postdata = '...
    import urllib.request
    import urllib.parse										# 用于解码中文
    
    url ='http://127.0.0.1:5000'							# 首先要访问的网址
    
    
    
    
    try:
    	# 读取网页内容
    	html = urllib.request.urlopen(url)					# 打开网址
    	html = html.read().decode()						# 读取并解码网页内容	
    	print(html)		
    	
    	# 用get和post方式发送请求
    	data,data1 = '广东','深圳'
    	data = urllib.parse.quote(data)							# 如果有中文,必须先parse.quote,将中文转成UTF8
    	data1 = urllib.parse.quote(data1)
    
    	getdata = 'province='+data					# 用get方式发送数据内容,必须用key=value的形式,
    	getdata1 = 'city='+data1
    	postdata = getdata + getdata1				# 用post方式发送数据内容
    	postdata = postdata.encode()				# 需要把post的数据转换成二进制
    	
    	response = urllib.request.urlopen(url+'?'+getdata+'&'+getdata1) # 用GET方式向网站发送请求,多个用‘&’连接,网址后面要接问号
    	response = urllib.request.urlopen(url,data=postdata)	# 用POST方式向网站发送请求
    	response = response.read().decode()
    	print(response)
    	
    	# 下载文件
    	urllib.request.urlretrieve(url+'?filename='+urllib.parse.quote(fileName),'download'+fileName)	# 下载文件
    	
    	
    	# 下面是上传文件
    	uploadurl = 'http://127.0.0.1:5000/upload'				# 要上传文件的网址
    	headers = {'content-type':'application/octet-stream'}	# 上传文件,需要设置表头,并告诉服务端这是二进制数据流
    	fileName = 'c:\\abc.jpg'								# 文件路径文件名
    	f = open(fileName,'rb')									# 以二进制的方式打开要上传的文件
    	data = f.read()
    	f.close()
    	p = fileName.rfind('\\')								# 找出文件名在路径所在位置
    	fileName = fileName[p+1:]
    	purl = url + '?fileName=' + urllib.parse.quote(fileName)
    	req = urllib.request.Request(purl,data,headers)			# 将网址和上传数据和表头打包
    	msg = urllib.request.urlopen(req)
    	msg = msg.read().decode()
    	
    except Exception as err:
    	print(err)
    
    展开全文
  • 1.结合Request()和urlopen()传Headers;2.get请求需手动拼接并使用quote()对中文处理;3.post请求直接转发即可

    问题描述

    访问一个接口,需要跳转到另一个接口。

    请求方式有GET和POST,且需要带上Headers。




    效果

    在这里插入图片描述
    参数正确传回




    解决方案

    urllib.request.urlopen()可以传数据但无法直接传Headers,因此需要结合urllib.request.Request()

    get请求的转发比较麻烦,需要拼接url,并且使用urllib.parse.quote()对中文做特殊处理。

    post请求直接转发即可。




    代码

    index.html
    get和post请求传相同的参数,且带中文

    <!DOCTYPE html>
    <head>
        <title>Python带Headers转发GET、POST请求</title>
        <meta charset="utf-8">
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    </head>
    
    <body>
    <button id="get" type="button">GET请求</button>
    <br><br>
    <button id="post" type="button">POST请求</button>
    </body>
    <script>
        $("#get").click(function () {
            //get请求
            console.log("get请求");
            var data = {
                "name": "XerCis",
                "subject": "语文",
                "grade": 80
            };
            var headers = {
                'Ts': new Date().getTime()
            };
            $.ajax({
                type: "GET",
                url: "/test",
                data: data,
                headers: headers,
                dataType: "json",
                contentType: "application/json",
                success: function (response) {
                    console.log(response)
                }
            });
        });
    
        $("#post").click(function () {
            //post请求
            console.log("post请求");
            var data = {
                "name": "XerCis",
                "subject": "语文",
                "grade": 80
            };
            var headers = {
                'Ts': new Date().getTime()
            };
            $.ajax({
                type: "POST",
                url: "/test",
                data: JSON.stringify(data),
                headers: headers,
                dataType: "json",
                contentType: "application/json",
                success: function (response) {
                    console.log(response)
                }
            });
        });
    </script>
    </html>
    

    app1.py
    用于转发请求

    # -*- coding: utf-8 -*-
    # @Author  : XerCis
    # @Function: 请求转发,相当于中转
    import string
    from urllib.parse import quote, urljoin
    from urllib.request import Request, urlopen
    import tornado.web
    import tornado.ioloop
    from tornado.options import define, options
    
    define("port", default=1111, help="运行端口", type=int)
    
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.render("index.html")
    
    
    class TestHandler(tornado.web.RequestHandler):
        def get(self):
            '''转发get请求需拼接url'''
            data = self.request.arguments
            get_params = None  # 手动拼接url
            for key in data.keys():
                if not get_params:
                    get_params = '?' + key + '=' + data[key][0].decode()
                else:
                    get_params += '&' + key + '=' + data[key][0].decode()
            url = "http://localhost:2222/test"
            url = urljoin(url, get_params)
            url = quote(url, safe=string.printable)  # 不加这句参数传中文会出错
            headers = self.request.headers
            request = Request(url, headers=headers)  # 不带data时默认method为GET
            response = urlopen(request)
            response = response.read()
            self.write(response)
    
        def post(self):
            url = "http://localhost:2222/test"
            data = self.request.body
            headers = self.request.headers
            request = Request(url, data, headers)  # 带data时默认method为POST
            response = urlopen(request)
            response = response.read()
            self.write(response)
    
    
    if __name__ == "__main__":
        app = tornado.web.Application(
            [
                (r"/", MainHandler),
                (r"/test", TestHandler),
            ],
        )
        app.listen(options.port)
        print("http://localhost:{}/".format(options.port))
        tornado.ioloop.IOLoop.current().start()
    

    app2.py
    真正处理请求的接口

    # -*- coding: utf-8 -*-
    # @Author  : XerCis
    # @Function: 处理请求
    import tornado.web
    import tornado.ioloop
    from tornado.options import define, options
    
    define("port", default=2222, help="运行端口", type=int)
    
    
    class TestHandler(tornado.web.RequestHandler):
        def get(self):
            name = self.get_argument('name')
            subject = self.get_argument('subject')
            grade = self.get_argument('grade')
            ts = self.request.headers['Ts']
            response = {
                'name': name,
                'subject': subject,
                'grade': grade,
                'ts': ts
            }
            self.write(response)
    
        def post(self):
            self.write(self.request.body)
    
    
    if __name__ == "__main__":
        app = tornado.web.Application(
            [
                (r"/test", TestHandler),
            ],
        )
        app.listen(options.port)
        print("【已启动】http://localhost:{}/".format(options.port))
        tornado.ioloop.IOLoop.current().start()
    




    参考文献

    1. python 字典字符串转字典——urllib.request.Request发送get,post请求
    2. python3 urlopen打开包含中文的url
    3. urllib.request — Extensible library for opening URLs
    展开全文
  • 有时需要将HTTP请求头的值设为中文,但如果直接设成中文,会抛出异常,例如,下面的代码为Chinese请求头设置了中文。from urllib import request url = &...
  • 笔者在此利用urllib向百度翻译发送翻译请求并获取翻译结果,演示一下该库的简单用法,小脚本封装后可以在命令行下运行,非常适用于linux...代码实现urllib发送请求的方法#!/usr/bin/env python3from urllib import r...
  • 模拟浏览器发送请求的库,Python自带 urllib模块 调用的方法 说明 urllib.request urlopen(url) 请求url,并返回请求url所有的内容 urlretrieve(url,path) 请求url,并将url反馈的内容保存到path路径下 ...
  • python2内置库urllib2的主要知识点

    万次阅读 2017-10-13 23:35:05
    urllib一般与之搭配着用,主要用于进行url解码和编码,通俗讲也就是将浏览器地址栏里面出现的中文转换为url编码再发送出去,以便服务器能识别。 导入包 import urllib import urllib2 第一步...
  • import urllib.request #1.获取一个get请求 ...#防止有中文出现乱码,使用decode解码 print(response.read().decode('utf-8')) #2.获取一个post请求,此方法可以在访问网址的时候给它发送一个表单,可以在里.
  • 因为在使用浏览器访问服务器的时候,浏览器会自动帮我们进行编码,所以我们在模仿浏览器发送请求的时候,如果url包含中文,python底层采用ascii码,不能处理中文,所以我们需要手动进行编码和解码。 使用parse模块...
  • from urllib.request import urlopen # 发送请求,获取服务器给的响应 url = "https://www.qiushibaike.com/" response = urlopen(url) # 读取结果,无法正常显示中文 html = response.read() # 进行解码操作,...
  • 二、自于一个利用向服务器发送post类型的request时,中文如何发送给服务器的需求。   二话不说,先贴上源码,由于涉及urlliburllib2的库,该源码要在python2 下运行,具体如下:   #!/usr/bin/env python #...
  • msg.encode(‘utf-8’)是解决中文乱码问题。 quote():假如URL的 name 或者 value 值中有『&』、『%』或者『=』等符号,就会有问题。所以URL中的参数字符串也需要把『&=』等符号进行编码,quote()就是对参数字符串中...
  • 前言 博主最近在用python3比较强大的Django开发web的时候,发现一些url的编码问题,在浏览器提交请求api时,如果url中包含汉子,就会被自动编码掉。呈现的结果是 ==&...from urllib.parse import quote...
  • 在我们爬取有道翻译的结果前,我们需要将我们所要翻译的中文传到有道翻译的服务端,如何传送呢?这就需要用到 urlopen的data参数 . urlopen的data参数 我们可以使用data参数,向服务器发送数据。根据HTTP规范,...
  • /usr/bin/env python# -*- coding: utf-8 -*-import urllib2import urllibimport cookielibimport jsonimport httplibimport reimport requestss=requests.session()#response = s.post(url, params=datas, **kwa...
  • 一、简单发送请求的方法:requests模块的使用 1.为什么要重点学习&amp;amp;amp;quot;request&amp;amp;amp;...模块,而不是urllib: ...requests的底层实现就是urllib requests在python2 和python3中通用,...中文文...
  • 前言博主最近在用python3比较强大的Django开发web的时候,发现一些url的编码问题,在浏览器提交请求api时,如果url中包含汉子,就会被自动编码掉。呈现的结果是 ==>...编码from urllib.parse import quotetext ...
  • 有喜欢图像处理,机器学习或者人工智能的人可以加...登入以后重定向python模拟发送POST信息来获取页面python模拟发送GET信息来获取页面由于可以直接在url里面添加信息,所以就不多说了.相关libs:cookielib, urllib, u...
  • 向企业微信发送图片

    千次阅读 2019-11-28 16:39:54
    #!/usr/bin/python #coding=utf8 import requests, json import urllib3 ...备注:上传时图片的名字最好序列化为数字或英文,中文图片的名字不支持图片上传 """ class WechatImage(object): ...
  • Python实现企业微信发送图片

    千次阅读 2019-05-16 15:48:26
    # -*-coding:utf-8 -*- __author__ = 'yangxin_ryan' import requests, json import urllib3 ...备注:上传时图片的名字最好序列化为数字或英文,中文图片的名字不支持图片上传 """ class Wechat...
  • 本文实例讲述了python实现给微信公众号发送消息的方法。分享给大家供大家参考,具体如下: 现在通过发微信公众号信息来做消息通知和告警已经很... #为了避免发送中文消息报错,使用utf8方式编码 reload(sys) sys.s
  • 模仿get方式搜索内容 """ 爬虫的本质就是用机器模拟人类向服务器发送请求,然后得到...,设计到中文,英文参数 """ from urllib.request import urlopen from urllib.request import Request from urllib.parse im
  • python 发送http请求填坑

    千次阅读 2017-06-06 20:23:19
    先说问题:最近开始使用python的urllib2和urllib来请求webservice获取数据,但是服务器是java的服务器,发现python传入的参数(中文)在服务器端显示的是乱码,在网上搜索了一整天,终于整出来了,特此填坑。...
  •  1.requests的底层实现就是urllib 2.requests在python2 和python3中通用,方法完全一样 3.requests简单易用 4.requests能够自动帮助我们解压(gzip压缩等的)网页内容 requests的作用 发送网络请求,获取响应...
  • 一起跟随小编过来看看吧...silent56_th3652020-06-30Python这篇文章主要介绍了python通过get,post方式发送http请求和接收http响应的方法,涉及Python使用urllib模块与urllib2模块实现get与post发送数据的相关技巧,需....
  • 虽然Python内置的urllib模块,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。更好的方案是使用 requests。它是一个Python第三方库,处理URL资源特别方便。查看其中文官网:...
  • 调用含中文参数Http接口

    千次阅读 2017-03-30 15:00:27
    发送http请求,参数含有中文时,需要对参数值处理 url = "http://xxxx:8080/itemclass.php?text=" def request(spu_name): res = None try: requrl = url + urllib.quote(spu_name) req = urllib2....
  • 虽然Python内置的urllib模块,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。更好的方案是使用requests。它是一个Python第三方库,处理URL资源特别方便。查看其中文官网:...
  • 搜索热词python中使用requests模块http请求时,发现中文参数不会自动的URL编码,并且没有找到类似urllib (python3)模块中urllib.parse.quote("中文")手动URL编码的方法.研究了半天发现requests模块对中文参数有3种不同...

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

urllib发送中文