遇到的问题汇总贴(持续更新)

2017-04-24  本文已影响108人  谁占了我的一年的称号

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

上一篇下一篇

猜你喜欢

热点阅读