1、错误重现
[root@wrx python3]# vim spider.py #!/usr/local/bin/python3 import urllib.request import urllib.parse import re url = "http://www.sdlj.ltd/article" values = {"id":"23"} data = urllib.parse.urlencode(values) request = urllib.request.Request(url,data) response = urllib.request.urlopen(request) html = response.read() print(html) #执行结果 [root@wrx python3]# python3 spider.py Traceback (most recent call last): File "spider.py", line 11, in <module> response = urllib.request.urlopen(request) File "/usr/local/lib/python3.4/urllib/request.py", line 161, in urlopen return opener.open(url, data, timeout) File "/usr/local/lib/python3.4/urllib/request.py", line 462, in open req = meth(req) File "/usr/local/lib/python3.4/urllib/request.py", line 1113, in do_request_ raise TypeError(msg) TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.
2、查询资料得知需要在urllib.parse.urlencode(values)后面加上encode(encoding="utf-8")
#修改后如下 #!/usr/local/bin/python3 import urllib.request import urllib.parse import re url = "http://www.sdlj.ltd/article" values = {"id":"23"} data = urllib.parse.urlencode(values).encode(encoding="utf-8") #此处有修改 request = urllib.request.Request(url,data) response = urllib.request.urlopen(request) html = response.read() print(html) #执行结果 [root@wrx python3]# python3 spider.py Traceback (most recent call last): File "spider.py", line 11, in <module> response = urllib.request.urlopen(request) File "/usr/local/lib/python3.4/urllib/request.py", line 161, in urlopen return opener.open(url, data, timeout) File "/usr/local/lib/python3.4/urllib/request.py", line 470, in open response = meth(req, response) File "/usr/local/lib/python3.4/urllib/request.py", line 580, in http_response 'http', request, response, code, msg, hdrs) File "/usr/local/lib/python3.4/urllib/request.py", line 508, in error return self._call_chain(*args) File "/usr/local/lib/python3.4/urllib/request.py", line 442, in _call_chain result = func(*args) File "/usr/local/lib/python3.4/urllib/request.py", line 588, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 400: Bad Request