鱼C论坛

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

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

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

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

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

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

  1. import urllib.request
  2. import os

  3. def url_open(url):
  4.     req=urllib.request.Request(url)
  5.     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'}
  6.     response=urllib.request.urlopen(url,headers)
  7.     html=response.read()

  8.     return html

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

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

  13.     return html[a:b]
  14.    
  15. def finf_imgs(url):
  16.     html=url_open(url).decode('utf-8')
  17.     img_addrs=[]
  18.    
  19.     a=html.find('img src=')
  20.    
  21.     while a!=-1:
  22.         b=html.find('.jpg',a,a+255)
  23.         if b!=-1:
  24.             img_addrs.append(html[a+9:b+4])
  25.         else:
  26.             b=a+9

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

  28.     return img_addrs
  29.    
  30. def save_imgs(folder,ig_addrs):
  31.     for each in img_addrs:
  32.         filename=each.split('/')[-1]
  33.         with open(filename,'wb') as f:
  34.             img=open_url(each)
  35.             f.write(img)

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

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

  41.     for i in range(pages):
  42.         page_num += i
  43.         page_url=url+'/'+str(page_num)
  44.         img_addrs=find_imgs(page_url)
  45.         save_imgs(folder,img_addrs)

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

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

  10.     return html

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

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

  15.     return html[a+29]
  16.    
  17. def find_imgs(url):
  18.     html=url_open(url).decode('utf-8')
  19.     img_addrs=[]
  20.    
  21.     a=html.find('img src=')
  22.    
  23.     while a!=-1:
  24.         b=html.find('.jpg',a,a+255)
  25.         if b!=-1:
  26.             img_addrs.append(html[a+9:b+4])
  27.         else:
  28.             b=a+9



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

  30.     return img_addrs
  31.    

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

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

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

  43.     for i in range(pages):
  44.         page_num += i
  45.         page_url=url+'/'+str(page_num)
  46.         img_addrs=find_imgs(page_url)
  47.         save_imgs(folder,img_addrs)
  48.         

  49. if __name__=='__main__':
  50.     download_mm()

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-2 16:58:59 | 显示全部楼层
  1. with open(filename,'wb') as f:
  2.             img=open_url(each)
  3.             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 | 显示全部楼层
  1. Traceback (most recent call last):
  2.   File "C:\Users\ASUS\Desktop\爬虫\不同页面不同图片 - 副本.py", line 62, in <module>
  3.     download_mm()
  4.   File "C:\Users\ASUS\Desktop\爬虫\不同页面不同图片 - 副本.py", line 53, in download_mm
  5.     page_num=int(get_page(url))
  6.   File "C:\Users\ASUS\Desktop\爬虫\不同页面不同图片 - 副本.py", line 16, in get_page
  7.     req=urllib.request.urlopen(url,headers)
  8.   File "D:\Program Files\Python38\lib\urllib\request.py", line 222, in urlopen
  9.     return opener.open(url, data, timeout)
  10.   File "D:\Program Files\Python38\lib\urllib\request.py", line 525, in open
  11.     response = self._open(req, data)
  12.   File "D:\Program Files\Python38\lib\urllib\request.py", line 542, in _open
  13.     result = self._call_chain(self.handle_open, protocol, protocol +
  14.   File "D:\Program Files\Python38\lib\urllib\request.py", line 502, in _call_chain
  15.     result = func(*args)
  16.   File "D:\Program Files\Python38\lib\urllib\request.py", line 1362, in https_open
  17.     return self.do_open(http.client.HTTPSConnection, req,
  18.   File "D:\Program Files\Python38\lib\urllib\request.py", line 1319, in do_open
  19.     h.request(req.get_method(), req.selector, req.data, headers,
  20.   File "D:\Program Files\Python38\lib\http\client.py", line 1230, in request
  21.     self._send_request(method, url, body, headers, encode_chunked)
  22.   File "D:\Program Files\Python38\lib\http\client.py", line 1276, in _send_request
  23.     self.endheaders(body, encode_chunked=encode_chunked)
  24.   File "D:\Program Files\Python38\lib\http\client.py", line 1225, in endheaders
  25.     self._send_output(message_body, encode_chunked=encode_chunked)
  26.   File "D:\Program Files\Python38\lib\http\client.py", line 1041, in _send_output
  27.     chunk = f'{len(chunk):X}\r\n'.encode('ascii') + chunk \
  28. 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 | 显示全部楼层    本楼为最佳答案   
兄弟错的地方有点多,我帮你改了好久,一会儿你对比看下哪里要改。妹子图没办法爬,你跑完代码就知道了。只能请其他朋友帮忙看下。
  1. import urllib.request
  2. import os

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

  10.     return html

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

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

  15.     return html[a+29]
  16.    
  17. def find_imgs(url):
  18.     html=url_open(url).decode('utf-8')
  19.     img_addrs=[]
  20.    
  21.     a=html.find('img src=')
  22.    
  23.     while a!=-1:
  24.         b=html.find('.jpg',a,a+255)
  25.         if b!=-1:
  26.             img_addrs.append(html[a+9:b+4])
  27.         else:
  28.             b=a+9



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

  30.     return img_addrs
  31.    

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

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

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

  43.     for i in range(pages):
  44.         page_num += i
  45.         page_url=url+'/'+str(page_num)
  46.         img_addrs=find_imgs(page_url)
  47.         save_imgs(folder,img_addrs)
  48.         

  49. if __name__=='__main__':
  50.     download_mm()

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

使用道具 举报

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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