美文网首页
遇到的问题汇总贴(持续更新)

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

作者: 谁占了我的一年的称号 | 来源:发表于2017-04-24 16:08 被阅读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

    相关文章

      网友评论

          本文标题:遇到的问题汇总贴(持续更新)

          本文链接:https://www.haomeiwen.com/subject/khepzttx.html