鱼C论坛

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

[已解决]关于无法将'bytes'对象转换为str的问题

[复制链接]
发表于 2020-4-2 15:10:06 | 显示全部楼层 |阅读模式

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

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

x
模仿的是小甲鱼第57讲ooxx,但是出现了这个问题,一直不知道错在哪里,希望有大神帮我看看
import urllib.request
import os

def url_open(url):
    req=urllib.request.Request(url)
    headers={'User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}
    response=urllib.request.urlopen(url,headers)
    html=response.read()

    return html

def get_page(url):    
    html=url_open(url).decode('utf-8')

    a=html.find('href="https://www.mzitu.com/210282/')+36
    b=html.find('"',a)

    return html[a:b]
    
def finf_imgs(url):
    html=url_open(url).decode('utf-8')
    img_addrs=[]
    
    a=html.find('img src=')
    
    while a!=-1:
        b=html.find('.jpg',a,a+255)
        if b!=-1:
            img_addrs.append(html[a+9:b+4])
        else:
            b=a+9

        a=html.find('img src=',b)

    return img_addrs
    
def save_imgs(folder,ig_addrs):
    for each in img_addrs:
        filename=each.split('/')[-1]
        with open(filename,'wb') as f:
            img=open_url(each)
            f.write(img)

def download_mm(folder='ooxx',pages=10):
    os.mkdir(folder)
    os.chdir(folder)

    url='https://www.mzitu.com/210282'
    page_num=int(get_page(url))

    for i in range(pages):
        page_num += i
        page_url=url+'/'+str(page_num)
        img_addrs=find_imgs(page_url)
        save_imgs(folder,img_addrs)

if __name__=='__main__':
    download_mm()
最佳答案
2020-4-2 22:45:20
兄弟错的地方有点多,我帮你改了好久,一会儿你对比看下哪里要改。妹子图没办法爬,你跑完代码就知道了。只能请其他朋友帮忙看下。
import urllib.request
import os

def url_open(url):
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'}
    
    req=urllib.request.Request(url,headers = headers)
    
    response=urllib.request.urlopen(req)
    html=response.read()

    return html

def get_page(url):    
    html=url_open(url).decode('utf-8')

    a=html.find("https://www.mzitu.com/210282/")
    print(html[a+29])

    return html[a+29]
    
def find_imgs(url):
    html=url_open(url).decode('utf-8')
    img_addrs=[]
    
    a=html.find('img src=')
    
    while a!=-1:
        b=html.find('.jpg',a,a+255)
        if b!=-1:
            img_addrs.append(html[a+9:b+4])
        else:
            b=a+9



        a=html.find('img src=',b)

    return img_addrs
    

def save_imgs(folder,img_addrs):
    for each in img_addrs:
        filename=each.split('/')[-1]
        with open(filename,'wb') as f:
            img=url_open(each)
            f.write(img)

def download_mm(folder='ooxx',pages=10):

    os.mkdir(folder)
    os.chdir(folder)
    url='https://www.mzitu.com/210282'
    page_num=int(get_page(url))

    for i in range(pages):
        page_num += i
        page_url=url+'/'+str(page_num)
        img_addrs=find_imgs(page_url)
        save_imgs(folder,img_addrs)
        

if __name__=='__main__':
    download_mm()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-2 16:58:59 | 显示全部楼层
with open(filename,'wb') as f:
            img=open_url(each)
            f.write(img)
这段代码错了!!!


哈哈哈 说出来你可能不相信  , 我刚刚才做到33课时课后作业 ,

不过我刚刚尝试时候 误打误撞有碰到你标题这种情况,就是提示你标题的那种错误


这种原因是因为  wb 是二进制写入   你要import pickle     然后把 f.write 改成用  pickle.dump()  就OK了  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 17:02:29 | 显示全部楼层
Twilight6 发表于 2020-4-2 16:58
这段代码错了!!!

刚刚试了一下,发现还是出同样的问题,呜呜呜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 17:03:32 | 显示全部楼层
流浪者阿薇 发表于 2020-4-2 17:02
刚刚试了一下,发现还是出同样的问题,呜呜呜

不会吧  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 17:12:49 | 显示全部楼层
本帖最后由 Twilight6 于 2020-4-2 17:15 编辑
流浪者阿薇 发表于 2020-4-2 17:02
刚刚试了一下,发现还是出同样的问题,呜呜呜


对不起大佬!打扰了!小的马上撤离战场哈哈哈  因为刚刚看见你的错误一激动就啾进来了哈哈哈

那就超出我的知识范围了哈哈哈哈 不过我总感觉你那个地方应该是错的吧



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 17:21:58 | 显示全部楼层
本帖最后由 Twilight6 于 2020-4-2 17:23 编辑
流浪者阿薇 发表于 2020-4-2 17:02
刚刚试了一下,发现还是出同样的问题,呜呜呜


我是什么都看不懂。。。嘿嘿

调试第二遍时候就卡了 看看能不能帮助到你

调试第二遍时候就卡了  看看能不能帮助到你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 17:22:42 | 显示全部楼层
Twilight6 发表于 2020-4-2 17:21
我是什么都看不懂。。。嘿嘿

哈哈哈哈没事我自己也看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 17:32:31 From FishC Mobile | 显示全部楼层
流浪者阿薇 发表于 2020-4-2 17:22
哈哈哈哈没事我自己也看不懂

错误信息呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 17:54:27 | 显示全部楼层
Traceback (most recent call last):
  File "C:\Users\ASUS\Desktop\爬虫\不同页面不同图片 - 副本.py", line 62, in <module>
    download_mm()
  File "C:\Users\ASUS\Desktop\爬虫\不同页面不同图片 - 副本.py", line 53, in download_mm
    page_num=int(get_page(url))
  File "C:\Users\ASUS\Desktop\爬虫\不同页面不同图片 - 副本.py", line 16, in get_page
    req=urllib.request.urlopen(url,headers)
  File "D:\Program Files\Python38\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "D:\Program Files\Python38\lib\urllib\request.py", line 525, in open
    response = self._open(req, data)
  File "D:\Program Files\Python38\lib\urllib\request.py", line 542, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "D:\Program Files\Python38\lib\urllib\request.py", line 502, in _call_chain
    result = func(*args)
  File "D:\Program Files\Python38\lib\urllib\request.py", line 1362, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "D:\Program Files\Python38\lib\urllib\request.py", line 1319, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "D:\Program Files\Python38\lib\http\client.py", line 1230, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "D:\Program Files\Python38\lib\http\client.py", line 1276, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "D:\Program Files\Python38\lib\http\client.py", line 1225, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "D:\Program Files\Python38\lib\http\client.py", line 1041, in _send_output
    chunk = f'{len(chunk):X}\r\n'.encode('ascii') + chunk \
TypeError: can't concat str to bytes
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 18:42:50 | 显示全部楼层

headers  格式不对
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}

改完  还有创建目录错误 请自行修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-2 19:13:07 From FishC Mobile | 显示全部楼层
流浪者阿薇 发表于 2020-4-2 17:22
哈哈哈哈没事我自己也看不懂

headers 应该是一个字典
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 22:10:00 | 显示全部楼层
本帖最后由 shatanzongcai 于 2020-4-2 22:46 编辑

兄弟,你这个错误的地方有一点多诶,headers这个东西是放在urllib.request.Request()里面而不是urlopen()里面,然后你的字典格式也是错的,headers={'User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'} ,这里连接的应该是冒号而不是逗号啊兄弟!!!!之后还有url_open 打成open_url,还有其他的变量名字打错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 22:45:20 | 显示全部楼层    本楼为最佳答案   
兄弟错的地方有点多,我帮你改了好久,一会儿你对比看下哪里要改。妹子图没办法爬,你跑完代码就知道了。只能请其他朋友帮忙看下。
import urllib.request
import os

def url_open(url):
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'}
    
    req=urllib.request.Request(url,headers = headers)
    
    response=urllib.request.urlopen(req)
    html=response.read()

    return html

def get_page(url):    
    html=url_open(url).decode('utf-8')

    a=html.find("https://www.mzitu.com/210282/")
    print(html[a+29])

    return html[a+29]
    
def find_imgs(url):
    html=url_open(url).decode('utf-8')
    img_addrs=[]
    
    a=html.find('img src=')
    
    while a!=-1:
        b=html.find('.jpg',a,a+255)
        if b!=-1:
            img_addrs.append(html[a+9:b+4])
        else:
            b=a+9



        a=html.find('img src=',b)

    return img_addrs
    

def save_imgs(folder,img_addrs):
    for each in img_addrs:
        filename=each.split('/')[-1]
        with open(filename,'wb') as f:
            img=url_open(each)
            f.write(img)

def download_mm(folder='ooxx',pages=10):

    os.mkdir(folder)
    os.chdir(folder)
    url='https://www.mzitu.com/210282'
    page_num=int(get_page(url))

    for i in range(pages):
        page_num += i
        page_url=url+'/'+str(page_num)
        img_addrs=find_imgs(page_url)
        save_imgs(folder,img_addrs)
        

if __name__=='__main__':
    download_mm()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 23:05:05 | 显示全部楼层
shatanzongcai 发表于 2020-4-2 22:45
兄弟错的地方有点多,我帮你改了好久,一会儿你对比看下哪里要改。妹子图没办法爬,你跑完代码就知道了。只 ...
with open(filename,'wb') as f:  # 代码45行
            img=url_open(each)   # 代码46行
            f.write(img)

请教下  二进制不是只能用pickle.dump()来写入嘛?  这边用了write 应该算错了吧?
我今天刚刚学pickle模块  真心请教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 10:50:48 | 显示全部楼层
shatanzongcai 发表于 2020-4-2 22:45
兄弟错的地方有点多,我帮你改了好久,一会儿你对比看下哪里要改。妹子图没办法爬,你跑完代码就知道了。只 ...

哇谢谢大佬,我刚刚看到这里,还是新手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 12:50:07 | 显示全部楼层
Twilight6 发表于 2020-4-2 23:05
请教下  二进制不是只能用pickle.dump()来写入嘛?  这边用了write 应该算错了吧?
我今天刚刚学pic ...

其实不是的,文件写入是可以使用二进制写入的,比方说你想要下载一首音乐,音乐文件不是字符串,你可以用二进制下载,这个时候你的文件写入应该是 F = open('某某音乐.mp3','wb'),不需要使用pickle。一般来说如果你的数据有很多不同的类型用pickle比较好一点,但是如果全都是二进制就可以直接使用wb。具体你可以返回去看看小甲鱼关于文件打开的视频和扩展阅读
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 12:57:47 | 显示全部楼层
流浪者阿薇 发表于 2020-4-3 10:50
哇谢谢大佬,我刚刚看到这里,还是新手

朋友你要是不知道类啊,函数具体怎么用,除了上网找以外,你可以直接打开IDLE然后按F1搜索你要看的那个函数,你比方说不知道headers应该加在哪里,你就搜一下,他会有教程告诉你参数都填什么。看不了英文也可以去找一找网上有的中文版。还有我发现朋友你好像函数的参数那一块有一点搞不明白,你去网上找一找python必须参数,关键词参数就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 13:25:54 | 显示全部楼层
shatanzongcai 发表于 2020-4-3 12:50
其实不是的,文件写入是可以使用二进制写入的,比方说你想要下载一首音乐,音乐文件不是字符串,你可以用 ...

好,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 21:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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