Python urllib – Python 3 urllib
时间:2020-02-23 14:43:39 来源:igfitidea点击:
Python urllib模块允许我们以编程方式访问URL数据。
Python URLlib
我们可以使用python urllib在python程序中获取内容。
我们还可以使用它来调用REST Web服务。
我们可以发出GET和POST http请求。
这个模块允许我们发出HTTP以及HTTPS请求。
我们可以发送请求标头,还可以获取有关响应标头的信息。
Python urllib GET示例
让我们从一个简单的示例开始,在该示例中,我们将阅读Wikipedia主页的内容。
import urllib.request response = urllib.request.urlopen('https://www.wikipedia.org') print(response.read())
响应read()
方法返回字节数组。
上面的代码将打印Wikipedia主页返回HTML数据。
它不是人类可读的格式,但是我们可以使用一些HTML解析器从中提取有用的信息。
带有标头的Python urllib请求
让我们来看看当我们尝试在公路上运行上述程序时会发生什么。
import urllib.request response = urllib.request.urlopen('https://www.theitroad.local') print(response.read())
我们将收到以下错误消息。
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/hyman/Documents/PycharmProjects/BasicPython/urllib/urllib_example.py Traceback (most recent call last): File "/Users/hyman/Documents/PycharmProjects/BasicPython/urllib/urllib_example.py", line 3, in <module> response = urllib.request.urlopen('https://www.theitroad.local') File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 223, in urlopen return opener.open(url, data, timeout) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 532, in open response = meth(req, response) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 642, in http_response 'http', request, response, code, msg, hdrs) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 570, in error return self._call_chain(*args) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 504, in _call_chain result = func(*args) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 650, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbidden
这是因为我的服务器不允许以编程方式访问数据,因为它是用于可以解析HTML数据的浏览器。
通常,我们可以通过在请求中发送User-Agent
标头来克服此错误。
让我们看一下修改后的程序。
import urllib.request # Request with Header Data to send User-Agent header url = 'https://www.theitroad.local' headers = {} headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17' request = urllib.request.Request(url, headers=headers) resp = urllib.request.urlopen(request) print(resp.read())
我们正在使用字典创建请求标头,然后在请求中发送它。
上面的程序将打印从theitroad主页接收HTML数据。
Python urllib REST示例
REST Web服务通过HTTP协议访问,因此我们可以使用urllib模块轻松访问它们。
我在使用JSON Server创建的本地计算机上运行了一个基于JSON的简单演示休息Web服务。
这是一个很棒的Node模块,可以运行虚拟JSON REST网络服务以进行测试。
import urllib.request response = urllib.request.urlopen('https://localhost:3000/employees') print(response.read())
请注意,控制台输出正在打印JSON数据。
Python urllib响应标头
我们可以通过在响应对象上调用info()
函数来获得响应头。
这将返回一个字典,因此我们也可以从响应中提取特定的标头数据。
import urllib.request response = urllib.request.urlopen('https://localhost:3000/employees') print(response.info()) print('Response Content Type is = ', response.info()["content-type"])
输出:
X-Powered-By: Express Vary: Origin, Accept-Encoding Access-Control-Allow-Credentials: true Cache-Control: no-cache Pragma: no-cache Expires: -1 X-Content-Type-Options: nosniff Content-Type: application/json; charset=utf-8 Content-Length: 260 ETag: W/"104-LQla2Z3Cx7OedNGjbuVMiKaVNXk" Date: Wed, 09 Jan 2016 19:26:20 GMT Connection: close Response Content Type is = application/json; charset=utf-8
Python urllib POST
让我们看一下POST方法调用的示例。
import urllib.request import urllib.parse post_url = 'https://localhost:3000/employees' headers = {} headers['Content-Type'] = 'application/json' # POST request encoded data post_data = urllib.parse.urlencode({'name' : 'David', 'salary' : '9988'}).encode('ascii') #Automatically calls POST method because request has data post_response = urllib.request.urlopen(url=post_url, data=post_data) print(post_response.read())
当我们调用urlopen
函数时,如果请求具有data
,那么它将自动使用POST
http方法。