鱼C论坛

 找回密码
 立即注册
查看: 2307|回复: 19

[已解决]python3.6抓取妹子图图片出现UnicodeDecodeError: 'gb2312' codec can't decode by...

[复制链接]
发表于 2017-12-7 15:57:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求大神帮忙看看,已经看了三天了都没找到解决方法。

初学python,煎蛋网抓不了图片,因此我用的meizutu,在网页二级制内容编码转换为gb2312时出现了解码异常(网页默认编码就是gb2312),不明觉厉呀,求助!!

源码如下:
import urllib
import os
import re

def url_open(url):
    req = urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
    req.add_header('Referer','http://www.meizitu.com/')
    response = urllib.request.urlopen(req)
    html = response.read()
   
    return html

def find_iamges(url):
   
    html = url_open(url).decode('gb2312')

#    p = r'target="_blank"><img src="([^"]+\.jpg)"'
#    img_addrs = re.findall(p,html)
#   
#    for each in img_addrs:
#        print(each)
   
    html = url_open(url)
    img_addrs = []
    a = html.find('img src=')
   
    print('a is %d' % a)
    while a != -1:
        b = html.find('.jpg',a,a+255)
        print('b is %d' % b)
        if b != -1:
            img_addrs.append(html[a+9:b+4])
        else:
            b = a + 9
            
        a = html.find('img src=',b)
        print('a is %d' % a)

    return img_addrs

def save_images(folder,image_addrs):
    for each in image_addrs:
        filename = each.split('/')[-1]
        with open(filename, 'wb') as f:
            img = url_open("http:"+each)
            f.write(img)

def download_pic(folder = 'meizitu',pages = 15):
    if not os.path.exists(folder):
        os.mkdir(folder)
    os.chdir(folder)
   
    url = 'http://www.meizitu.com/'
   
    iamge_addrs = find_iamges(url)
    save_images(folder,iamge_addrs)

if __name__ == '__main__':
    download_pic()




错误异常信息如下:

  File "C:/Users/101002200/download_meizitu.py", line 22, in find_iamges
    html = url_open(url).decode('gb2312')

UnicodeDecodeError: 'gb2312' codec can't decode byte 0x8c in position 22143: illegal multibyte sequence
最佳答案
2017-12-15 14:47:41
taotao0325 发表于 2017-12-15 14:43
就是我这个源码,解码方式修改为gbk可以?

对的,因为gbk包含了gb2312
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-12-7 16:55:50 | 显示全部楼层
讲道理,我觉得你爬取的网页数据也是压缩格式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 17:31:22 | 显示全部楼层
我刚刚爬了一下,是GBK格式啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 17:36:39 | 显示全部楼层
你的代码里面好多错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-14 21:15:30 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-7 17:36
你的代码里面好多错误

  帮忙指导下呗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-14 21:15:57 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-7 16:55
讲道理,我觉得你爬取的网页数据也是压缩格式

楼主可以自己打开网页查看下源码,是gb2312的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-14 21:16:46 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-7 17:31
我刚刚爬了一下,是GBK格式啊

使用urlopen方式获取网址内容,读取的内容可以正常解码吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-14 21:22:37 | 显示全部楼层
  1. #爬妹子网妹子图
  2. import urllib.request
  3. import os
  4. import re

  5. def url_open(url):   
  6.     req = urllib.request.Request(url)
  7.     req.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")
  8.     response = urllib.request.urlopen(req)
  9.     html = response.read()

  10.     print(url)
  11.     return html
  12.    
  13. def get_page(url):
  14.     lastpath = re.search(r'<li class="thisclass">(\d)</li>' ,url_open(url).decode('gbk'))
  15.     return lastpath.group(1)
  16.   
  17. def find_imgs(url):
  18.     html = url_open(url).decode('gbk')
  19.     p = r'<img src="([^"]+\.jpg)"'
  20.    
  21.     img_addrs = re.findall(p,html)
  22.    
  23.     return img_addrs
  24.            
  25.     #return img_addrs

  26. def download_mm(folder='OOXX'):
  27.     os.mkdir(folder)
  28.     os.chdir(folder)
  29.     url = 'http://www.meizitu.com/'
  30.     #page_str = get_page(url)
  31.     #page_num = int(page_str)
  32.     page_num = int(get_page(url))
  33.     while page_num<=1:
  34.        # page_num += 1
  35.         page_url = url + 'a/more_' + str(page_num) + '.html'
  36.         img_addrs = find_imgs(page_url)
  37.         x = (len(img_addrs)+1)*(page_num-1)
  38.         for each in img_addrs:
  39.             filename = str(x)+'.'+each.split('.')[-1]
  40.             x +=1
  41.             with open(filename, 'wb') as f:
  42.                 img = url_open(each)
  43.                 f.write(img)
  44.         page_num += 1
  45.       
  46.         
  47. if __name__ == '__main__':
  48.     download_mm()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-14 21:23:16 | 显示全部楼层
taotao0325 发表于 2017-12-14 21:16
使用urlopen方式获取网址内容,读取的内容可以正常解码吗

在你的基础上改的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-14 21:28:30 | 显示全部楼层
taotao0325 发表于 2017-12-14 21:15
楼主可以自己打开网页查看下源码,是gb2312的
  1. import urllib.request

  2. url = 'http://www.meizitu.com/'
  3. response = urllib.request.urlopen(url)#.decode('gbk')
  4. html = response.read()
  5. #html = gzip.decompress(html).decode("")
  6. html = html.decode('gbk')
  7. print(html
复制代码


爬的你的网站
编码用的gbk
TIM截图20171214212728.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-14 21:29:46 | 显示全部楼层
taotao0325 发表于 2017-12-14 21:16
使用urlopen方式获取网址内容,读取的内容可以正常解码吗

不是压缩形式就可以,只要编码正确。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-15 10:23:09 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-14 21:28
爬的你的网站
编码用的gbk

charset=gb2312
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-15 10:24:06 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-14 21:29
不是压缩形式就可以,只要编码正确。

不行的。我这个这个代码也简单,楼主可以自己试下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-15 12:14:16 | 显示全部楼层

我也看了是gb2312,但是用这个确实爬不了。用gbk却可以,其中具体原因我也不知道。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-15 12:40:19 | 显示全部楼层
taotao0325 发表于 2017-12-15 10:24
不行的。我这个这个代码也简单,楼主可以自己试下

你爬取的网页只是大部分编码格式是gb2312,但是还有一部分的是gbk格式,所以你只用gb2312是不行的,gbk包含了gb2312.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-15 14:43:05 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-15 12:40
你爬取的网页只是大部分编码格式是gb2312,但是还有一部分的是gbk格式,所以你只用gb2312是不行的,gbk包 ...

如果既有gbk又有gb2312我该怎么弄?gbk和gb2312我都试过,单独解码都是失败
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-15 14:43:36 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-15 12:14
我也看了是gb2312,但是用这个确实爬不了。用gbk却可以,其中具体原因我也不知道。

就是我这个源码,解码方式修改为gbk可以?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-15 14:46:59 | 显示全部楼层
taotao0325 发表于 2017-12-15 14:43
如果既有gbk又有gb2312我该怎么弄?gbk和gb2312我都试过,单独解码都是失败

你用gbk单独解码失败?我试过你这个网站用gbk解码是可以的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-15 14:47:41 | 显示全部楼层    本楼为最佳答案   
taotao0325 发表于 2017-12-15 14:43
就是我这个源码,解码方式修改为gbk可以?

对的,因为gbk包含了gb2312
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-12-15 15:21:09 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-15 14:47
对的,因为gbk包含了gb2312

怪了,今天还真可以,我那天调试的时候试了gbk一直不行,花了一天半时间.....


谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-4 14:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表