urllib 文档描述
因为特意在使用python3.x版本,所以在学习爬虫的时候经常会用到一些网上2.x版本的代码,总是报错,就很尴尬。这里列出一些已经遇到的问题,之后在遇到其他的还会有补充。
先引用官方文档列出一下python3.x 版本中urllib各部分的功能:
urllib is a package that collects several modules for working with URLs:
- urllib.request for opening and reading URLs 打开和阅读
- urllib.error containing the exceptions raised by urllib.request 包含意外和错误
- urllib.parse for parsing URLs 解析
- urllib.robotparser for parsing robots.txt files 解析robots.txt文件
直译大概是这样:(
文档连接
urlopen
首先就是urlopen,在2.x版本中,urlopen的使用方法如下:
import urllib2
url = 'http://www.abc.com'
response = urllib2.urlopen(url)
而在python3.x中urllib 和 urllib2 合并了。那么,这样说来应该写作:
import urllib
url ='http://www.abc.com'
response = urllib.urlopen(url)
但是,事实上会报出如下错误:
module ‘urllib’ has no attribute ‘urlopen’
因为urlopen并不在urllib模块中,而是被移动到了urllib.request中。这跟前面所提到的文档中写的是一致的,urllib.request是要用来打开和阅读连接。
这里必须要说明:
import urllib
urllib.request.urlopen()
报错(原因待查):
AttributeError: module ‘urllib’ has no attribute ‘request’
正确的做法是在import的时候必须注明:
import urllib.request
所以正确的代码段落如下所示:
import urllib.request
url = 'http://www.abc.com'
response = urllib.request.urlopen(url)
urlencode
在python2.x中urlencode的用法如下:
import urllib
url='http://www.abc.com'
values = {}
values['username']='abc'
values['password']='abc'
data = urllib.urlencode(values)
在python3.x中报错信息如下:
AttributeError: module ‘urllib’ has no attribute ‘urlencode’
在前面的介绍中写到urllib.parse是用来做url解析的,所以在这里urlencoding被移入了urllib.parse中。正确的写法为:
import urllib
values={}
values['username']='abc'
values['password']='abc'
data = urllib.parse.urlencode(values)
另外在抓取的时候经常会有人出现乱码的现象,除了常规文件头要加的那几个系统默认编码调整以外,在request.read()后面一定要加一个decode这样才能够正常显示中文。