使用urllib的request模块,可以方便的实现请求的发送并得到响应。
抓取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()
等方法,以及msg
、version
、status
、reason
、debuglevel
、closed
等属性。
例子:
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()
可以给链接传递一些参数,它的API
如下:
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,cadefault=False,comtext=None)
如果添加该参数,且它是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参数用于设置超时时间,单位为秒
,如果请求超过了设置的时间,就会抛出异常。它支持HTTP
、HTTPS
、FTP
请求。
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类型。
输出:
超时