精华内容
下载资源
问答
  • 主要介绍了python爬虫 urllib模块发起post请求过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Python3 urllib Post请求

    万次阅读 2019-06-28 11:57:35
    Python3 urllib Post请求 自己练手的一个小项目,使用Python3中自带的网络库urllib,发送post请求,请求参数为json字符串。 url = 'http://xxxx.com' params = { a:'1', b:'2' } params = json.dumps(params) ...

    Python3 urllib Post请求

    自己练手的一个小项目,使用Python3中自带的网络库urllib,发送post请求,请求参数为json字符串。

    url = 'http://xxxx.com'
    params = {
        a:'1',
        b:'2'
    }
    
    params = json.dumps(params)
    headers = {'Accept-Charset': 'utf-8', 'Content-Type': 'application/json'}
    
    req = urllib.request.Request(url=path, data=params, headers=headers, method='POST')
    response = urllib.request.urlopen(req).read()
    

    上面写法报错

    POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str
    

    因为urllib的Request参数不能传递字符串。

    查询资料后修改为:

    url = 'http://xxxx.com'
    params = {
        a:'1',
        b:'2'
    }
    
    params = json.dumps(params)
    headers = {'Accept-Charset': 'utf-8', 'Content-Type': 'application/json'}
    //添加encode编码
    params = urllib.parse.quote_plus(es_params).encode(encoding='utf-8')
    
    req = urllib.request.Request(url=path, data=params, headers=headers, method='POST')
    response = urllib.request.urlopen(req).read()
    

    上面写法服务端报错500,参数传递的有问题。

    查询资料后修改为:

    url = 'http://xxxx.com'
    params = {
        a:'1',
        b:'2'
    }
    
    params = json.dumps(params)
    headers = {'Accept-Charset': 'utf-8', 'Content-Type': 'application/json'}
    //用bytes函数转换为字节
    params = bytes(es_params, 'utf8')
    
    req = urllib.request.Request(url=path, data=params, headers=headers, method='POST')
    response = urllib.request.urlopen(req).read()
    
    

    大功告成。。。

    展开全文
  • python urllib/urllib2 get/post使用详解

    万次阅读 2015-08-12 14:51:54
    1、urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。2、urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是...

    1、urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。2、urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。

    urllib get数据的方法 (params是关键字)

    #!/usr/bin/python
    #coding=utf-8
     
    import urllib,urllib2
     
    uri = 'http://www.qieke.com/index.php'
    params = {
    '_c': 'user',
    '_m': 'info',
    };
     
    params['user_id']= 123456
    params['user_name'] = '全仔'
    params = urllib.urlencode(params)
    ret = urllib.urlopen("%s?%s"%(uri, params))
    code = ret.getcode()
    ret_data = ret.read()
    

    urllib post数据的方法

    #!/usr/bin/python
    #coding=utf-8
     
    import urllib,urllib2
     
    uri = 'http://www.qieke.com/index.php'
    params = {
    '_c': 'user',
    '_m': 'info',
    };
     
    params['user_id']= 123456
    params['user_name'] = '全仔'
    params = urllib.urlencode(params)
    ret = urllib.urlopen(uri, params)
    code = ret.getcode()
    ret_data = ret.read()
    

    urllib2

    最简单的使用urllib2将如下所示

    import urllib2 
    response = urllib2.urlopen('http://python.org/') 
    html = response.read() 


    urllib2的很多应用就是那么简单(记住,除了"http:",URL同样可以使用"ftp:","file:"等等来替代)。但这篇文章是教授HTTP的更复杂的应用。

    HTTP是基于请求和应答机制的--客户端提出请求,服务端提供应答。urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的

    地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。 

    import urllib2  
    
    req = urllib2.Request('http://www.voidspace.org.uk') 
    
    response = urllib2.urlopen(req) 
    
    the_page = response.read() 


    记得urllib2使用相同的接口处理所有的URL头。例如你可以像下面那样创建一个ftp请求。

    req = urllib2.Request('ftp://example.com/')

    在HTTP请求时,允许你做额外的两件事。首先是你能够发送data表单数据,其次你能够传送额外的关于数据或发送本身的信息("metadata")到服务器,此数据作为HTTP的"headers"来发送。

    Data数据

    有时候你希望发送一些数据到URL(通常URL与CGI[通用网关接口]脚本,或其他WEB应用程序挂接)。在HTTP中,这个经常使用熟知的POST请求发送。这个通常在你提交一个HTML表单时由你的浏览器来做。

    并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。编码工作使用urllib的函数而非

    import urllib 
    
    import urllib2 
    
    url = 'http://www.someserver.com/cgi-bin/register.cgi' 
    
    values = {'name' : 'Michael Foord', 
              'location' : 'Northampton', 
              'language' : 'Python' } 
    
    data = urllib.urlencode(values) 
    
    req = urllib2.Request(url, data) 
    
    response = urllib2.urlopen(req) 
    
    the_page = response.read() 
    


    如ugoni没有传送data参数,urllib2使用GET方式的请求。GET和POST请求的不同之处是POST请求通常有"副作用",它们会由于某种途径改变系统状态(例如提交成堆垃圾到你的门口)。

    尽管HTTP标准说的很清楚POSTs通常会产生副作用,GET请求不会产生副作用,但没有什么可以阻止GET请求产生副作用,同样POST请求也可能不产生副作用。Data同样可以通过在Get请求

    的URL本身上面编码来传送。

    可看如下例子

    >>> import urllib2 
    >>> import urllib 
    >>> data = {} 
    >>> data['name'] = 'Somebody Here' 
    >>> data['location'] = 'Northampton' 
    >>> data['language'] = 'Python' 
    >>> url_values = urllib.urlencode(data) 
    >>> print url_values 
    name=Somebody+Here&language=Python&location=Northampton 
    >>> url = 'http://www.example.com/example.cgi' 
    >>> full_url = url + '?' + url_values 
    >>> data = urllib2.open(full_url) 



    Headers

    讨论特定的HTTP头,来说明怎样添加headers到你的HTTP请求。

     

    有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.5),

    这个身份可能会让站点迷惑,或者干脆不工作。浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。

    import urllib 
    import urllib2 
    url = 'http://www.someserver.com/cgi-bin/register.cgi' 
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' 
    values = {'name' : 'Michael Foord', 
              'location' : 'Northampton', 
              'language' : 'Python' } 
    headers = { 'User-Agent' : user_agent } 
    data = urllib.urlencode(values) 
    req = urllib2.Request(url, data, headers) 
    response = urllib2.urlopen(req) 
    the_page = response.read() 


     

    response应答对象同样有两个很有用的方法。看下面的节info and geturl,我们将看到当发生错误时会发生什么。

    Handle Exceptions处理异常

    当urlopen不能够处理一个response时,产生urlError(不过通常的Python APIs异常如ValueError,TypeError等也会同时产生)。

    HTTPError是urlError的子类,通常在特定HTTP URLs中产生。

     

    URLError

    通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。这种情况下,异常同样会带有"reason"属性,它是一个tuple,包含了一个错误号和一个错误信息。

     

    例如

    >>> req = urllib2.Request('http://www.pretend_server.org') 
    
    >>> try: urllib2.urlopen(req) 
    
    >>> except URLError, e: 
    
    >>> print e.reason 
    
    (4, 'getaddrinfo failed') 


    Error Codes错误码

    因为默认的处理器处理了重定向(300以外号码),并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。

    BaseHTTPServer.BaseHTTPRequestHandler.response是一个很有用的应答号码字典,显示了RFC 2616使用的所有的应答号。这里为了方便重新展示该字典。(译者略)

    当一个错误号产生后,服务器返回一个HTTP错误号,和一个错误页面。你可以使用HTTPError实例作为页面返回的应答对象response。这表示和错误属性一样,它同样包含了read,geturl,和info方法。

     

    >>> req = urllib2.Request('http://www.python.org/fish.html') 
    >>> try: 
    >>>     urllib2.urlopen(req) 
    >>> except URLError, e: 
    >>>     print e.code 
    >>>     print e.read() 
    404 

    Wrapping it Up包装

     

    所以如果你想为HTTPError或URLError做准备,将有两个基本的办法。我则比较喜欢第二种。

     

    第一个:

    [python:nogutter] 
    from urllib2 import Request, urlopen, URLError, HTTPError 
    req = Request(someurl) 
    try: 
        response = urlopen(req) 
    except HTTPError, e: 
        print 'The server couldn/'t fulfill the request.' 
        print 'Error code: ', e.code 
    except URLError, e: 
        print 'We failed to reach a server.' 
        print 'Reason: ', e.reason 
    else: 
        # everything is fine 

    注意:except HTTPError 必须在第一个,否则except URLError将同样接受到HTTPError。 

    第二个:

    [python:nogutter] 
    from urllib2 import Request, urlopen, URLError 
    req = Request(someurl) 
    try: 
        response = urlopen(req)  
    except URLError, e: 
        if hasattr(e, 'reason'): 
            print 'We failed to reach a server.' 
            print 'Reason: ', e.reason 
        elif hasattr(e, 'code'): 
            print 'The server couldn/'t fulfill the request.' 
            print 'Error code: ', e.code 
    else: 
        # everything is fine 


    info and geturl

    urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()

    geturl -- 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许

    会有重定向。获取的URL或许跟请求URL不同。 

    info -- 这个返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage 实例。 

    经典的headers包含"Content-length","Content-type",和其他。查看Quick Reference to HTTP Headers(http://www.cs.tut.fi/~jkorpela/http.html)

    获取有用的HTTP头列表,以及它们的解释意义。








    展开全文
  • 代码主要实现的是接口测试,测试数据保存在...import urllib.request import urllib.error import json import urllib.parse from Interface_Test.Open_exl import OpenExl #导入打开exl文件 import ast class Tes...

    代码主要实现的是接口测试,测试数据是json类型,保存在exl中

    # -*- coding : UTF-8 -*-
    import urllib.request
    import urllib.error
    import json
    import urllib.parse
    from Interface_Test.Open_exl import OpenExl  #导入打开exl文件
    import ast
    
    class TestLogin():
        def __init__(self, url = '', data = None):
            self.user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
            self.header = {'User-Agent': self.user_agent}
            self.url = url
            self.html = '默认内容是空的~~~'
            #data数据类型需要是字节型,所以需要类型转换
            self.data = json.JSONEncoder().encode(data).encode('utf-8')
            #self.data = json.dumps(data).encode('utf-8')
            print(self.data)
    
        def open_url(self):
            try:
                self.req = urllib.request.Request(self.url, self.data, self.header)
                self.response = urllib.request.urlopen(self.req)
                self.html = self.response.read()
                self.is_status = self.response.getcode()
                print('---------接口状态码%s,页面可以正常打开---------' % self.is_status)
    
            except urllib.error.URLError as e:
                print('\033[1;31;40m')
                print('-----------------页面打不开-------------------')
                print(e)
                print('\033[0m')
                self.reason = e
    
            return self.html
    
    
    if __name__ == "__main__":
        #接口URL地址
        url = 'http://xxx/xxx/xxx/API.aspx?cmd='
        #定义获取接口名和接口参数路径
        exc_file = 'D:/xxxx/xxxx/xxxx.xls'
        #打开exl工作表单
        exl_data = OpenExl(exc_file, 0)
        #获取接口名
        interface_name = exl_data.excel_table_data()
        #print(interface_name)
        #获取接口参数
        interface_data = exl_data.excel_table_data(1)
        #print(interface_data)
    
        #定义计数器,用户获取接口同行参数
        count = 1
        for each_interface in interface_name[1:]:
            new_url = url + each_interface
            print(new_url)
            #exl里获取的参数是字符串类型,需要转换为字典类型,然后传入主类中进行类型转换
            data = ast.literal_eval(interface_data[count])
            #print(data)
            count += 1
            login = TestLogin(new_url, data)
            html = login.open_url().decode('utf-8')
            #接口返回的字符串存在urlencode编码,需要unquote进行解码
            html = urllib.parse.unquote(html)
            print(html)
    
    
    

    需要注意三个点:

    1.打开URL时,参数有时传入的是json类型的,但是post进去的数据类型是byte类型的,需要转码

    json.JSONEncoder().encode(data).encode('utf-8')
    或者使用 json.dumps(data).encode('utf-8')进行转码

    2.从exl中获取的值是str类型的,但是程序要求传入的值是dict类型的,此时需要类型转换

    ast.literal_eval(interface_data[count])

    3.接口返回的数据类型有时是‘%e6%96%b0%e6%ac%be%e6%98%a5’这样的,原因是接口返回的值是urlencode编码的,需要通过unquote进行解码:

    urllib.parse.unquote(html)

    展开全文
  • 下面小编就为大家分享一篇Python3.6通过自带的urllib通过get或post方法请求url的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 本文实例讲述了python使用urllib2提交http post请求的方法。分享给大家供大家参考。具体实现方法如下: #!/usr/bin/python #coding=utf-8 import urllib import urllib2 def post(url, data): req = urllib2....
  • 本文主要给大家介绍了关于python如何访问http的GET/POST的相关内容,使用urlliburllib2,可以轻松实现对http的访问,下面话不多说了,来一起看看详细的介绍吧。 示例详解 以下给个例子,实现对...
  • urllib 中的post请求

    2018-06-04 10:15:00
    import urllib.requestimport urllib.parse url = 'http://fanyi.baidu.com/v2transapi' word = 'meizi' formdata = { 'from' : 'en', 'to' : 'zh', 'query':word, 'transtype':'realtime', 'simple_means_flag' ...

    import urllib.request
    import urllib.parse

    url = 'http://fanyi.baidu.com/v2transapi'

    word = 'meizi'

    formdata = {
    'from' : 'en',
    'to' : 'zh',
    'query':word,
    'transtype':'realtime',
    'simple_means_flag' :'3',
    'sign': '800673.578704',
    'token' :'b4af6d5be2544feca4407f376e0b5635'
    }

    headers = {
    'Host': 'fanyi.baidu.com',
    # 'Connection': 'keep-alive',
    # 'Content-Length': '135',
    # 'Accept': '*/*',
    'Origin': 'http://fanyi.baidu.com',
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent':' Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
    # 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Referer': 'http://fanyi.baidu.com/translate?aldtype=16047',
    # 'Accept-Encoding': 'gzip, deflate',
    'Accept-Language':' zh-CN,zh;q=0.9',
    'Cookie': 'REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; PSTM=1526888660; BIDUPSID=3AC4D74B022A729BF6F805111B8EDE9A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BAIDUID=6B0F99164495B82513E4B8AD44956B6A:FG=1; H_PS_PSSID=26357_1465_21093_20928; PSINO=1; locale=zh; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1527585078,1527585086,1527585119,1527592236; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1527592236; to_lang_often=%5B%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%2C%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%5D; from_lang_often=%5B%7B%22value%22%3A%22pt%22%2C%22text%22%3A%22%u8461%u8404%u7259%u8BED%22%7D%2C%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D',

    }


    request = urllib.request.Request(url=url,headers=headers)

    formdata = urllib.parse.urlencode(formdata).encode()


    response = urllib.request.urlopen(request,formdata)

    print(response.read().decode())

    转载于:https://www.cnblogs.com/airapple/p/9132002.html

    展开全文
  • urllib post二进制数据

    千次阅读 2014-03-29 09:41:59
    如果二进制数据比较小,可以先把...这里例举一个base64和二进制数据之间转换的例子,urllib的示例不作介绍: import base64, binascii, struct tokenBase64 = "HfhBc2ymUgSl0/Plaiq74UdU+T+tRQHf/MJi6CQwrk0=" t
  • python2 urllib2 发送post 请求和get 请求 代码如下: import urllib2 user_agent = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 ...
  • 使用urllib进行get或post请求

    千次阅读 2019-03-03 01:14:40
    1、学习get和post请求,尝试使用requests或者是urllib用get方法baidu发出一个请求,并将其返回结果输出 import urllib.request url = ‘https://www.baidu.com’ response = urllib.request.urlopen(url) print...
  • urllib2GET和POST请求

    千次阅读 2017-11-06 10:40:03
    urllib2默认只支持HTTP/HTTPS的GET和POST方法 urllib.urlencode() urlliburllib2 都是接受URL请求的相关模块,但是提供了不同的功能。两个最显著的不同如下: urllib 仅可以接受URL,不能创建 设置了...
  • urllib简介 urllib库是一个比较简单是爬虫库,有了它,我们只需要关心请求的链接是什么,需要传的参数是什么,以及如何设置可选的请求头就好了,不用深入到底层去理解它到底是怎样传输和通信的。有了它,两行代码就...
  • 在进行一个post请求时,postman 里面可以正常请求到数据,但是一模一样放到python里面就不行了,后面通过抓包发现了问题。 直接贴代码: raw = {‘number’: ‘123456’} print(raw) data = parse.urlencode(raw)....
  • from urllib import request url = 'http://www.baidu.com' res = request.urlopen(url=url) # print(res.read()) with open('baidu_index.html','w',encoding='utf-8') as f: f.write(res.read().decod...
  • #!/usr/bin/env python ...import urllib import urllib2 # 通过抓包的方式获取的url,并不是浏览器上显示的url url = "http://m.youdao.com/translate" # 完整的headers headers = { "Referer": "http://m.youd...
  • urllib2 urlopen的post与get

    千次阅读 2019-04-13 12:59:45
    urllib2 urlopen的post与get
  • 在进行一个post请求时,postman 里面可以正常请求到数据,但是一模一样放到python里面就不行了,后面通过抓包发现了问题。 直接贴代码: raw = {‘number’: ‘123456’} print(raw) data = parse.urlencode...
  • urllib:Post方式爬取AJAX加载的数据

    千次阅读 2018-11-06 11:59:36
    Request请求对象的里有data参数,它就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要匹配键值对。 POST请求:代码模板 导入request模块 import urllib.request 代码模板 # 首先...
  • python爬虫第1章 urllib库(二) urllib发送post请求 上一篇: python爬虫第1章 urllib库(一) urllib库概述 一、构建请求对象Request 先看看python urllib默认的请求头: import urllib.request url = r...
  • urllib库模拟简单的Post请求 && 使用Cookie模拟用户访问本文使用Python3.0的urllib库实现。模拟简单的Post请求在上一篇文章中,介绍了通过urllib.request.Request(),返回一个request对象。Request()方法有3个重要的...
  • post请求的例子 import urllib3 import json data = { "username": "mafutian", "password": "abc123", } encoded_data = json.dumps(data).encode("utf-8") http = urllib3.PoolManager() r = http.request( ...
  • def fetch_raw_post_meitu(link, data): proxy_support = urllib.request.ProxyHandler({'https': '192.168.11.195:8888'}) opener = urllib.request.build_opener(proxy_support) urllib.requ...
  • 现在常用的模块应该是requests模块,毕竟它是基于urllib开发的模块,封装性和易用性都更好一些。...本文设定一个使用场景,如何发送json模式的post请求 Python2中使用 # encoding=utf8 ''' 判定是否在tasklist...
  • 1.结合Request()和urlopen()传Headers;2.get请求需手动拼接并使用quote()对中文处理;3.post请求直接转发即可

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,889
精华内容 11,555
关键字:

posturllib