鱼C论坛

 找回密码
 立即注册
查看: 3665|回复: 10

[已解决]Python第56章OOXX那一章有人看吗?我照做可是不对,求帮助,谢谢

[复制链接]
发表于 2016-12-26 20:42:59 | 显示全部楼层 |阅读模式
20鱼币
我的代码是这样子的:
  1. import urllib.request
  2. import os

  3. def url_open(url):
  4.     req=urllib.request.Request(url)
  5.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36')
  6.     response=urllib.request.urlopen(url)
  7.     html=response.read()
  8.     return html


  9. def get_page(url):

  10.     html=url_open(url).decode('utf-8')
  11.    
  12.     a=html.find('current-comment-page')+23
  13.     b=html.find(']',a)
  14.     return html[a:b]
  15.                   


  16. def find_imgs(url):
  17.     html=url_open(url).decode('utf-8')
  18.     img_addrs=[]
  19.    
  20.     a=html.find('img src=')
  21.     while a!=-1:
  22.         b=html.find('.jpg',a,a+225)
  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. def save_imgs(folder,img_addrs):
  30.     for each in img_addrs:
  31.         filename=each.split('/')[-1]
  32.         with open(filename,'wb') as f:
  33.             img=url_open(each)
  34.             f.write(img)



  35. def download_mm(folder='小黄图',pages=10):
  36.     os.mkdir(folder)
  37.     os.chdir(folder)

  38.     url='http://jandan.net/ooxx/'
  39.     page_num=int(get_page(url))

  40.     for i in range(pages):
  41.         page_num-=i
  42.         page_url=url+'page-'+str(page_num)+'#comments'
  43.         img_addrs=find_imgs(page_url)
  44.         save_imgs(folder,img_addrs)
  45.         
  46. if __name__ == '__main__':
  47.     download_mm()
复制代码




可是运行后文件夹出来了,里面只有一个空空的图片,错误如下:
  1. Traceback (most recent call last):
  2.   File "C:\Users\Administrator\Desktop\OOXX.py", line 60, in <module>
  3.     download_mm()
  4.   File "C:\Users\Administrator\Desktop\OOXX.py", line 57, in download_mm
  5.     save_imgs(folder,img_addrs)
  6.   File "C:\Users\Administrator\Desktop\OOXX.py", line 41, in save_imgs
  7.     img=url_open(each)
  8.   File "C:\Users\Administrator\Desktop\OOXX.py", line 5, in url_open
  9.     req=urllib.request.Request(url)
  10.   File "D:\lib\urllib\request.py", line 268, in __init__
  11.     self.full_url = url
  12.   File "D:\lib\urllib\request.py", line 294, in full_url
  13.     self._parse()
  14.   File "D:\lib\urllib\request.py", line 323, in _parse
  15.     raise ValueError("unknown url type: %r" % self.full_url)
  16. ValueError: unknown url type: '//ww2.sinaimg.cn/mw600/661eb95cgw1fb40ppksiwj20sg16on3k.jpg'
复制代码



我一点都不懂什么意思,麻烦大家了,谢谢
最佳答案
2016-12-26 20:43:00
本帖最后由 Liangmp 于 2016-12-28 12:05 编辑

同学你好,我在看视频的练习过程中也遇到了同样的问题,错误提示跟你的一样:
ValueError: unknown url type: '//ww2.sinaimg.cn/mw600/661eb95cgw1fb40ppksiwj20sg16on3k.jpg'
可以看到,错误提示里面的unknown url type缺少了'http:',所以我们把缺少的补上就可以了,以下是我参照8楼的代码,对小甲鱼老师的原始代码的修改:
  1. import urllib.request
  2. import os
  3. import re

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


  10. def get_page(url):

  11.     html=url_open(url).decode('utf-8')
  12.     re_page = r'\[(\d{4,})\]'  #匹配初始页码[2290]
  13.     findpage =re.findall(re_page,html)
  14.     pagenum = findpage[0]
  15.     print('start pagenum is :')
  16.     print(pagenum)
  17.     return pagenum
  18.                   
  19. def find_imgs(url):
  20.     html=url_open(url).decode('utf-8')
  21.     '''
  22.     img_addrs=[]
  23.    
  24.     a=html.find('img src=')
  25.     while a!=-1:
  26.         b=html.find('.jpg',a,a+225)
  27.         if b!=-1:
  28.             img_addrs.append(html[a+9:b+4])
  29.         else:
  30.             b=a+9
  31.         a=html.find('img src=',b)
  32.     return img_addrs
  33.     '''
  34.     pattern = r'<img src="(.*?)"'
  35.     img_addrs = re.findall(pattern,html,re.M)
  36.     return img_addrs
  37.    
  38. def save_imgs(folder,img_addrs):
  39.     for each in img_addrs:
  40.         if 'http:' not in each:
  41.             filename=each.split('/')[-1]
  42.             eachhttp = 'http:' + each
  43.             print(eachhttp)
  44.             with open(filename,'wb') as f:
  45.                 img=url_open(eachhttp)
  46.                 f.write(img)
  47.         else:
  48.             filename=each.split('/')[-1]
  49.             print(each)
  50.             urllib.request.urlretrieve(each,filename)

  51. def download_mm(folder='mm图',pages=10):
  52.     os.mkdir(folder)
  53.     os.chdir(folder)

  54.     url='http://jandan.net/ooxx/'
  55.     #url = 'http://jandan.net/pic/'  #同理,我们也可以用这份代码爬取无聊图
  56.     page_num=int(get_page(url))

  57.     for i in range(pages):
  58.         page_num-=i
  59.         page_url=url+'page-'+str(page_num)+'#comments'
  60.         img_addrs=find_imgs(page_url)
  61.         save_imgs(folder,img_addrs)
  62.         
  63. if __name__ == '__main__':
  64.     download_mm()
复制代码

小小说明:
这份代码是把该网页上的所有图片(包括jpg格式和gif格式),所以一些与mm无关的图也可能会被爬取下来哦。
有时候会出现403error,有可能是被发现是爬虫而拦截了,你再试一两次就好。
个人认为8楼的代码写得很好,我有很多地方的修改都是参照8楼的。
亲测可用。
本人也是个新手,请多多指教~

最佳答案

查看完整内容

同学你好,我在看视频的练习过程中也遇到了同样的问题,错误提示跟你的一样: ValueError: unknown url type: '//ww2.sinaimg.cn/mw600/661eb95cgw1fb40ppksiwj20sg16on3k.jpg' 可以看到,错误提示里面的unknown url type缺少了'http:',所以我们把缺少的补上就可以了,以下是我参照8楼的代码,对小甲鱼老师的原始代码的修改: 小小说明: 这份代码是把该网页上的所有图片(包括jpg格式和gif格式),所以一些与mm无关的图也 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-26 20:43:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Liangmp 于 2016-12-28 12:05 编辑

同学你好,我在看视频的练习过程中也遇到了同样的问题,错误提示跟你的一样:
ValueError: unknown url type: '//ww2.sinaimg.cn/mw600/661eb95cgw1fb40ppksiwj20sg16on3k.jpg'
可以看到,错误提示里面的unknown url type缺少了'http:',所以我们把缺少的补上就可以了,以下是我参照8楼的代码,对小甲鱼老师的原始代码的修改:
  1. import urllib.request
  2. import os
  3. import re

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


  10. def get_page(url):

  11.     html=url_open(url).decode('utf-8')
  12.     re_page = r'\[(\d{4,})\]'  #匹配初始页码[2290]
  13.     findpage =re.findall(re_page,html)
  14.     pagenum = findpage[0]
  15.     print('start pagenum is :')
  16.     print(pagenum)
  17.     return pagenum
  18.                   
  19. def find_imgs(url):
  20.     html=url_open(url).decode('utf-8')
  21.     '''
  22.     img_addrs=[]
  23.    
  24.     a=html.find('img src=')
  25.     while a!=-1:
  26.         b=html.find('.jpg',a,a+225)
  27.         if b!=-1:
  28.             img_addrs.append(html[a+9:b+4])
  29.         else:
  30.             b=a+9
  31.         a=html.find('img src=',b)
  32.     return img_addrs
  33.     '''
  34.     pattern = r'<img src="(.*?)"'
  35.     img_addrs = re.findall(pattern,html,re.M)
  36.     return img_addrs
  37.    
  38. def save_imgs(folder,img_addrs):
  39.     for each in img_addrs:
  40.         if 'http:' not in each:
  41.             filename=each.split('/')[-1]
  42.             eachhttp = 'http:' + each
  43.             print(eachhttp)
  44.             with open(filename,'wb') as f:
  45.                 img=url_open(eachhttp)
  46.                 f.write(img)
  47.         else:
  48.             filename=each.split('/')[-1]
  49.             print(each)
  50.             urllib.request.urlretrieve(each,filename)

  51. def download_mm(folder='mm图',pages=10):
  52.     os.mkdir(folder)
  53.     os.chdir(folder)

  54.     url='http://jandan.net/ooxx/'
  55.     #url = 'http://jandan.net/pic/'  #同理,我们也可以用这份代码爬取无聊图
  56.     page_num=int(get_page(url))

  57.     for i in range(pages):
  58.         page_num-=i
  59.         page_url=url+'page-'+str(page_num)+'#comments'
  60.         img_addrs=find_imgs(page_url)
  61.         save_imgs(folder,img_addrs)
  62.         
  63. if __name__ == '__main__':
  64.     download_mm()
复制代码

小小说明:
这份代码是把该网页上的所有图片(包括jpg格式和gif格式),所以一些与mm无关的图也可能会被爬取下来哦。
有时候会出现403error,有可能是被发现是爬虫而拦截了,你再试一两次就好。
个人认为8楼的代码写得很好,我有很多地方的修改都是参照8楼的。
亲测可用。
本人也是个新手,请多多指教~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-26 21:05:02 | 显示全部楼层
路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-27 09:26:36 | 显示全部楼层
你对于url的拼接有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-27 09:30:19 | 显示全部楼层
  1. while a!=-1:
  2.         b=html.find('.jpg',a,a+225)
  3.         if b!=-1:
  4.             img_addrs.append(html[a+9:b+4])
  5.         else:
  6.             b=a+9
  7.         a=html.find('img src=',b)
复制代码


append的内容你修改修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-27 16:38:46 | 显示全部楼层
skeep 发表于 2016-12-27 09:26
你对于url的拼接有问题

请问什么叫做拼接有问题呀?然后append那里修改了一下发现还是不行呀,照着小甲鱼使用代理前和使用代理后的代码都试过了也不可以,从来没接触过编程,拜托指导一下麻烦了!谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-27 17:55:20 From FishC Mobile | 显示全部楼层
如果你不怕我是骗子的话可以加我微信ye_feng23我也遇到这个问题了,昨晚解决的。并且在新手乐园板块发了这个帖子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-27 18:18:44 | 显示全部楼层
铅笔不爱冬丶 发表于 2016-12-27 17:55
如果你不怕我是骗子的话可以加我微信ye_feng23我也遇到这个问题了,昨晚解决的。并且在新手乐园板块发了这 ...

当然不会啦,愿意教我真是太好啦,就是我是新的不能再新的新手,如果你不嫌弃的话那我就加你啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-27 18:49:24 | 显示全部楼层
  1. import urllib.request
  2. import os,re
  3. import random



  4. def url_open(url):
  5.     req = urllib.request.Request(url)
  6.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36')

  7.     response = urllib.request.urlopen(req)
  8.     html = response.read()

  9.     return html


  10.    
  11. def get_page(url):
  12.     html = url_open(url).decode('utf-8')
  13.     zhengze= r'\[(\d{4,})\]'
  14.     page1 = re.findall(zhengze, html)
  15.     page2 = page1[0]
  16.     print(page2)
  17.     return page2

  18. def find_imgs(url):
  19.     html = url_open(url).decode('utf-8')
  20.     pat = r'<img src="(.*?)"'
  21.     img_addrs = re.findall(pat, html, re.M)
  22.     return img_addrs



  23. def download_mm(pages=10):

  24.     url = "http://jandan.net/ooxx/"
  25.     page_num= int(get_page(url))

  26.     for i in range(pages):
  27.           page_num -=i
  28.           page_url = url + 'page-' + str(page_num) + '#comments'
  29.           img_addrs=find_imgs(page_url)
  30.           for each3 in img_addrs:
  31.             if 'http:' not in each3:
  32.                 filename = each3.split("/")[-1]
  33.                 each4 = 'http:' + each3
  34.                 print(each4)
  35.                 with open(filename,'wb') as f:
  36.                     img = url_open(each4)
  37.                     f.write(img)
  38.             else:
  39.                 filename = each3.split("/")[-1]
  40.                 print(each3)
  41.                 urllib.request.urlretrieve(each3,filename)
  42.               

  43. if __name__ == '__main__':
  44.     download_mm()

复制代码

举个例子:
爬取下来的url如下:
//ww3.sinaimg.cn/mw600/661eb95cgw1fb40pjnbu3j20n50ycmzh.jpg
Python无法识别这个url
然后手动在url之前加上"http:"
url变成:http://ww3.sinaimg.cn/mw600/661eb95cgw1fb40pjnbu3j20n50ycmzh.jpg
Python就能识别并且下载了。
所以解决方法就是把img_addrs这个列表中的每一个元素,如果不包含http,就在前面加一个http
这串代码亲测可行,放在你建立的小黄图文件夹下运行就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-28 13:34:07 | 显示全部楼层
ValueError: unknown url type: '//ww2.sinaimg.cn/mw600/661eb95cgw1fb40ppksiwj20sg16on3k.jpg'
这个已经说清楚了 没有写对连接地址 应该有http:的,修改一下就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-22 21:22:20 | 显示全部楼层
Liangmp 发表于 2016-12-28 12:03
同学你好,我在看视频的练习过程中也遇到了同样的问题,错误提示跟你的一样:
ValueError: unknown url ty ...

你好,我用了你这个代码,但还是报错啊,报错原因为

pagenum = findpage[0]  IndexError: list index out of range,不知道是什么原因呀。
新手小白,请多多赐教。谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 06:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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