用python写爬虫程序的时候经常使用的库肯定是urllib,除此之外,还有urllib2和cookielib等,但是由于python版本的更新,在一些库和方法的使用上python3并不能向下兼容。所以在写爬虫程序时并不能按照python2的引用方法。现将urllib等方法的引用方法归纳如下(以python3.4为例,是否会适用python3.2等版本不可知):
首先,python3.4中,而是将urllib2、urlparse、robotparser并入了urllib模块,并且修改了urllib模块,其中包含了5个子模块,每个子模块中的常用方法如下:
urllib.error: ContentTooShortError;URLError;HTTPError
urllib.parse:urlparse;_splitparams;urlsplit;urlunparse;urlunsplit;urljoin;urldefrag;
unquote_to_bytes;unquote;parse_qs;parse_qsl;unquote_plus;quote;
quote_plus;quote_from_bytes;urlencode;to_bytes;unwrap;splittype;splithost;splituser;splitpasswd;splitport等;
urllib.request: urlopen; install_opener; urlretrieve; urlcleanup; request_host; build_opener; _parse_proxy; parse_keqv_list; parse_http_list; _safe_gethostbyname; ftperrors; noheaders; getproxies_environment; proxy_bypass_environment; _proxy_bypass_macosx_sysconf; Request
urllib.response: addbase; addclosehook; addinfo;addinfourl;
urllib.robotparser: RobotFileParser
以上方法并没有列举完全,具体的每个子块的所有类和方法可以在python安装包里的Lib/urllib下查询(如果不是python3.4.3版本的python版本,可以到这个目录下面查询相应的方法。)
另外,python2中的cookielib,在python3.4中重命名为http.cookiejar. 引用时直接import http.cookiejar 即可。
最后,由于python3严格区分bytes和str类型,并且这两种类型不能以任意隐式方式使用,但是urllib中的有些方法对于str和bytes有严格的规定,比如下面这段代码:
values={}
values['username']="";
values['password']="";
data=urllib.parse.urlencode(values)
url="http://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request=urllib.request.Request(url,data)
response=urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
这段代码在python3.4上运行时会报错:“TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.”这句话的意思就是说:urllib.request.Request(url,data)中的data必须是bytes类型,但是urllib.parse.urlencode(values)产生的data的类型是str,所以遇到这种情况就需要进行str和bytes的转化:
从str到bytes:调用方法encode('utf-8'). 所以,上边代码需要改写成:data=urllib.parse.urlencode(values).encode('utf-8')
从bytes到str:调用方法decode('utf-8').