发送请求

使用urllib的request模块,可以方便的实现请求的发送并得到响应。

发送请求

urlopen()

抓取Python官网:

import urllib.request

response = urllib.request.urlopen("https://www.python.org")
print(response.read().decode('utf-8'))

部分输出:

# 部分输出

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="/static/js/libs/jquery-1.8.2.min.js"><\/script>')</script>

    <script src="/static/js/libs/masonry.pkgd.min.js"></script>

    <script type="text/javascript" src="/static/js/main-min.js" charset="utf-8"></script>

decode('utf-8')方法将网页以制定编码解析。

response是一个HTTPResponse类型的对象:

print(type(response))

输出如下:

<class 'http.client.HTTPResponse'>

它包含read()readinto()getheader(name)getheaders()fileno()等方法,以及msgversionstatusreasondebuglevelclosed等属性。

例子:

import urllib.request

response = urllib.request.urlopen("https://www.baidu.com")
print(response.status)
print('\n',response.getheaders())
print('\n',response.getheader('Server'))

输出结果:

200

 [('Accept-Ranges', 'bytes'), ('Cache-Control', 'no-cache'), ('Content-Length', '227'), ('Content-Type', 'text/html'), ('Date', 'Thu, 09 Aug 2018 14:49:17 GMT'), ('Etag', '"5b56b4a8-e3"'), ('Last-Modified', 'Tue, 24 Jul 2018 05:10: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=9FA4E613328025CC47152BC4A49E9AB3; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'PSTM=1533826157; 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')]

 BWS/1.1

可见,分别输出了状态码响应头和响应头里面的Server值。

urlopen()的参数

urlopen()可以给链接传递一些参数,它的API如下:

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,cadefault=False,comtext=None)
data参数

如果添加该参数,且它是bytes(字节流)类型,则需要通过bytes()方法转化,传递了该参数,它的请求方式就不再是GET,而是POST方式。

import urllib.parse
import urllib.request

data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf-8')
response = urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read())

转换为bytes(字节流)类型的方法types()需要两个参数: 第一个是str(字符串)类型的参数,第二个是指定编码格式。

需要使用urllib.parse模块的urlencode()方法,将字典转化为字符串。

timeout参数

timeout参数用于设置超时时间,单位为,如果请求超过了设置的时间,就会抛出异常。它支持HTTPHTTPSFTP请求。

import urllib.request

response = urllib.request.urlopen("http://joecy.wang",timeout=0.001)
print(response.read())

输出:

# 部分代码
Traceback (most recent call last):
  File "/home/joecy/Desktop/TestCode/Untitled-3.py", line 3, in <module>
   ......
urllib.error.URLError: <urlopen error timed out>

使用try-except处理异常:

import socket
import urllib.request

try:
    response = urllib.request.urlopen("http://joecy.wang",timeout=0.001)
except urllib.error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print("超时")

使用ininstance判断异常e.reason是不是socket.timeout类型。

输出:

超时