zoukankan      html  css  js  c++  java
  • 使用urllib.request发送请求

    urllib.request.urlopen()基本使用

    urllib.request模块提供了基本的构造HTTP请求的方法,利用他可以模拟浏览器的一个请求发起过程,同时他还带有处理authentication(授权验证),redirections(重定向),cookie(浏览器Cookies)以及其他内容。

    import urllib.request
    
    response = urllib.request.urlopen("http://www.baidu.com")
    #read读取的内容是byte,需要进行解码
    print(response.read().decode("utf-8"))
    

    在上面代码的基础上执行print(type(response))
    结果是<class 'http.client.HTTPResponse'>
    这里发现response是一个HTTPResponse类型的对象,它主要包含的方法有read()、readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函数和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性。

    >>> import urllib.request
    >>> response = urllib.request.urlopen("https://www.baidu.com")
    >>> print(response.status)
    200
    >>> print(response.getheaders())
    [('Accept-Ranges', 'bytes'), ('Cache-Control', 'no-cache'), ('Content-Length', '227'), ('Content-Type', 'text/html'), ('Date', 'Tue, 25 Jul 2017 06:36:40 GMT'), ('Last-Modified', 'Wed, 28 Jun 2017 02:16:00 GMT'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('Pragma', 'no-cache'), ('Server', 'BWS/1.1'), ('Set-Cookie', 'BD_NOT_HTTPS=1; path=/; Max-Age=300'), ('Set-Cookie', 'BIDUPSID=BEF13521D9F33BE4108EA36C07303743; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'PSTM=1500964600; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Strict-Transport-Security', 'max-age=0'), ('X-Ua-Compatible', 'IE=Edge,chrome=1'), ('Connection', 'close')]
    >>> print(response.getheader("Server"))
    BWS/1.1
    

    urllib.request.urlopen()详解

    利用urlopen()方法,我们可以完成最基本的简单网页的GET请求抓取。urlopen()函数的API

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

    data 参数是可选的,如果要添加 data ,它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 函数可以进行转化,另外如果你传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST 。**

    # coding=utf-8
    import urllib.parse
    import urllib.request
    #urllib.parse.urlencode() 方法来将参数字典转化为字符串。第二个参数指定编码格式,在这里指定为 utf8 。
    data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding=
    'utf8')
    response = urllib.request.urlopen('http://httpbin.org/post', dat
    a=data)
    print(response.read())
    

    提交的网址是 httpbin.org ,它可以提供 HTTP 请求测试。 http://httpbin.org/post 这个地址可以用来测试 POST 请求,它可以输出请求和响应信息,其中就包含我们传递的 data 参数。

    urllib.request.Request的使用

    由上我们知道利用urlopen()方法可以实现最基本的请求发起,但不足以构建一个完整的请求。

    import urllib.request
     
    request =urllib.request.Request("https://www.baidu.com")
    response = urllib.request.urlopen(request)
    print(response.read().decode("utf-8"))
    

    Request的结构

    class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
    
    • 第一个参数是请求链接,这个是必传参数,其他的都是可选参数。
    • data 参数如果要传必须传 bytes (字节流)类型的,如果是一个字典,可以先用urllib.parse.urlencode() 编码。
    • headers参数是一个字典,可以在构建Request时通过headers参数传递,也可以通过调用Request对象的add_header()方法来添加请求头。请求头最常用的用法是通过修改User-Agent来伪装浏览器,默认User-Agent是Python-urllib,可以通过他来伪装浏览器。例如:伪装火狐浏览器,
    from urllib import request,parse
    url = "http://httpbin.org/post"
    headers = {
        #伪装一个火狐浏览器
        "User-Agent":'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
        "host":'httpbin.org'
    }
    dict = {
        "name":"Germey"
    }
    data = bytes(parse.urlencode(dict),encoding="utf8")
    req = request.Request(url=url,data=data,headers=headers,method="POST")
    response = request.urlopen(req)
    print(response.read().decode("utf-8"))
    
    

    在这里我们通过四个参数构造了一个 Request , url 即请求链接,在 headers 中指定了 User-Agent 和 Host ,传递的参数 data 用了 urlencode() 和 bytes() 方法来转成字节流,另外指定了请求方式为 POST 。

  • 相关阅读:
    Java实现 蓝桥杯 历届试题 小计算器
    事实证明,应用市场是个流量的生意(产品能力并不足以形成护城河)
    迅雷创始人程浩:创业公司5招做好内部创新(组建小型敢死队:一共3个人,一个产品经理,两个研发;腾讯做不做这个项目是一个伪命题;让用户来验证,而不是相反 good)
    核心思想:创业者要做正确的决定,而非容易的决定(享受创业路上的孤单,你必须要有将自己关在小屋子里独自做重大且艰难决定的勇气)
    Delphi能通过SSH登录Linux,连接MYSQL取数么?像Navicat一样
    Qt5.7中使用MySQL Driver(需要把libmysql.dll文件拷贝到Qt的bin目录中。或者自己编译的时候,链接静态库)
    c++对象内存布局的理解
    观察者模式
    本地事务和分布式事务工作
    弱引用
  • 原文地址:https://www.cnblogs.com/yangtaoshu/p/12616344.html
Copyright © 2011-2022 走看看