遇到的问题汇总贴(持续更新)
1.request.urlretrieve
在python3中应该写成 :urllib.request.urlretrieve
添加表头信息的方法:
opener = urllib.request.build_opener()
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')]
urllib.request.install_opener(opener)
try:
urllib.request.urlretrieve(image_url, 'd:\\tupian\\%s' % (''.join(image_url.split('/')[-4:])))
except urllib.error.HTTPError as e:
print('下载不了')
2.在scrapy的pipilines 里调用上面的函数时,要注意在spider中是否已经将image_urls单独取出,如果添加到items里的是字符串怎会出现以下报错:
raise ValueError("unknown url type: %r" % self.full_url)
解决方法:
for image_url in [item['image_urls']]:
3.在爬取时碰到这种情况:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 7-8: illegal multibyte sequence
解决方法:
首先,encode是unicode转换成str;decode是str转换成unicode。
这里为叙述方便,下文用小写'u'代表unicode类型的变量,用小写's'代表str类型的变量。
u.encode('...'):只要你填写了正确的编码,基本上总是能成功的。就像任何文件都可以压缩成zip文件。
u.decode('...'):没有任何意义,因为decode是将str转为unicode编码,而u本身就是unicode编码的。
s.encode('...'):在python 3中,将产生一个编码后的byte类型的字符串(这里有点像Python 2.x中的str),byte类型的字符串是支持解码操作的。
s.decode('...'):运行都会出错。因为python 3中的str类型对象有点像Python 2中的unicode, 而decode是将str转为unicode编码,所以str仅有一个encode方法,调用这个方法后将产生一个编码后的byte类型的字符。
(注意:在使用decode('...')时一定要确定对象是什么编码。就像,打开zip文件的时候,你要确保它确实是zip文件,而不仅仅是伪造了扩展名的zip文件。)
其他话题: (1)插入非法字符:
一个字符串中不一定都是统一编码的,如读取一个网页,head部分是utf8编码,而body部分却可能是gb编码,或者由于 截断的缘故一些字符串已经不完整了,这个时候再做编码操作就可能出错。如:
s = "我爱你"
s
'\xce\xd2\xb0\xae\xc4\xe3'
serr = '\xce\xd2\xb0\xae\xc4\xe3\xa1'
s.decode("gbk")
u'\u6211\u7231\u4f60'
serr.decode("gbk")
Traceback (most recent call last):
File "", line 1, in
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 6: incomplete multibyte sequence
gbk无法编码第6个字符0xa1。这个时候我们可以指定decode的第2个参数为"ignore":
>>> serr.decode("gbk", "ignore")
u'\u6211\u7231\u4f60'
4.ChunkedEncodingError
这是由于在加表头信息的时候没有加上。
'Accept-Encoding': 'gzip, deflate, sdch'
原来一直以为这个是没用的,其实并不是
参考这边文章:http://www.jianshu.com/p/353230d591f2
5.http.client.IncompleteRead: IncompleteRead(2907 bytes read, 13 more expected)
这个错误在查了资料之后,简单说就是因为http发送的chunk包还没结束,tcp已经关闭了链接。解决办法
import httplib
httplib.HTTPConnection._http_vsn= 10
httplib.HTTPConnection._http_vsn_str = 'HTTP/1.0'
但是python3应该是http.client,所以修改一下,将http强行制定为1.0
http.client._http_vsn= 10
http.client._http_vsn_str = 'HTTP/1.0'
或者,跳过这个错误。
try:
page = urllib2.urlopen(urls).read()
except httplib.IncompleteRead, e:
page = e.partial
参考:http://blog.sina.com.cn/s/blog_3fb83bd801015hwz.html
https://stackoverflow.com/questions/14442222/how-to-handle-incompleteread-in-python