鱼C论坛

 找回密码
 立即注册
查看: 898|回复: 2

[已解决]第14章p14_10,唯美贴吧图片下载

[复制链接]
发表于 2018-7-21 17:50:30 | 显示全部楼层 |阅读模式

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

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

x
我在IDLE 里边试了,一直不对,程序源码如下:
  1. import urllib.request
  2. import re
  3. import os


  4. def open_url(url):
  5.     req = urllib.request.Request(url)  # 利用request类构建一个完整的请求,可以增加header等信息
  6.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \
  7.                     (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0')
  8.     page = urllib.request.urlopen(req)
  9.     html = page.read().decode("utf-8")
  10.     return html


  11. def get_img(html):
  12.     p = r'<img class="BDE_Image".*? src="[^"]*\.jpg".*?>'
  13.     imglist = re.findall(p, html)
  14.     try:
  15.         os.mkdir("Newpictures")
  16.     except FileExistsError:
  17.         # 如果该文件夹已经存在则覆盖保存!
  18.         pass
  19.     os.chdir("Newpictures")
  20.     for each in imglist:
  21.         filename = each.split("/")[-1]
  22.         urllib.request.urlretrieve(each, filename, None)


  23. if __name__ == "__main__":
  24.     url = "http://tieba.baidu.com/p/3823765471"
  25.     get_img(open_url(url))
复制代码


然后第一次修改是吧https -> http 还是有错。新建的文件夹已经出来了,但是里边没有下载下来图片。目前代码的错误如下:
  1. ===== RESTART: E:/SOFT-files/Python/FishC/Basic Example/14_5/14_5_10.py =====
  2. Traceback (most recent call last):
  3.   File "E:/SOFT-files/Python/FishC/Basic Example/14_5/14_5_10.py", line 31, in <module>
  4.     get_img(open_url(url))
  5.   File "E:/SOFT-files/Python/FishC/Basic Example/14_5/14_5_10.py", line 26, in get_img
  6.     urllib.request.urlretrieve(each, filename, None)
  7.   File "C:\Program Files\Python37\lib\urllib\request.py", line 247, in urlretrieve
  8.     with contextlib.closing(urlopen(url, data)) as fp:
  9.   File "C:\Program Files\Python37\lib\urllib\request.py", line 222, in urlopen
  10.     return opener.open(url, data, timeout)
  11.   File "C:\Program Files\Python37\lib\urllib\request.py", line 525, in open
  12.     response = self._open(req, data)
  13.   File "C:\Program Files\Python37\lib\urllib\request.py", line 548, in _open
  14.     'unknown_open', req)
  15.   File "C:\Program Files\Python37\lib\urllib\request.py", line 503, in _call_chain
  16.     result = func(*args)
  17.   File "C:\Program Files\Python37\lib\urllib\request.py", line 1387, in unknown_open
  18.     raise URLError('unknown url type: %s' % type)
  19. urllib.error.URLError: <urlopen error unknown url type: img class="bde_image" src="https>
复制代码


然后再pycharm上试了之后,网址可以列出来,但是对应文件夹下还是没有新建的文件夹目录。代码改动的不是很多,如下:
  1. # -*- coding utf-8 -*-
  2. import urllib.request
  3. import re
  4. import os


  5. def open_url(url):
  6.     req = urllib.request.Request(url)  # 利用request类构建一个完整的请求,可以增加header等信息
  7.     req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \
  8.                     (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0')
  9.     page = urllib.request.urlopen(req)
  10.     html = page.read().decode("utf-8")
  11.     return html


  12. def get_img(html):
  13.     p = r'<img class="BDE_Image".*? src="[^"]*\.jpg".*?>'
  14.     imglist = re.findall(p, html)
  15.     try:
  16.         os.mkdir("Newpictures")
  17.     except FileExistsError:
  18.         # 如果该文件夹已经存在则覆盖保存!
  19.         pass
  20.     os.chdir("Newpictures")
  21.     for each in imglist:
  22.         filename = each.split("/")[-1]
  23.         urllib.request.urlretrieve(each, filename, None)


  24. if __name__ == "__main__":
  25.     url = "https://tieba.baidu.com/p/3823765471"
  26.     get_img(open_url(url))
复制代码


十分感谢大家帮忙!谢谢!
最佳答案
2018-7-21 23:36:28
我粘贴了你代码试运行,下载不到是因为大哥你没有给正则表达式分组啊,利用findall函数的话,方便在于,给src属性内部分组,那么这个findall函数返回的就是分组内部的内容,所以你要改成酱紫->p = r'<img class="BDE_Image".*?src="([^"]*\.jpg)".*?>',就可以下载到了

可以看到右边编译内容没有问题

可以看到右边编译内容没有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-21 23:36:28 | 显示全部楼层    本楼为最佳答案   
我粘贴了你代码试运行,下载不到是因为大哥你没有给正则表达式分组啊,利用findall函数的话,方便在于,给src属性内部分组,那么这个findall函数返回的就是分组内部的内容,所以你要改成酱紫->p = r'<img class="BDE_Image".*?src="([^"]*\.jpg)".*?>',就可以下载到了

sccs

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

使用道具 举报

 楼主| 发表于 2018-7-22 08:03:12 | 显示全部楼层
qwe852992259 发表于 2018-7-21 23:36
我粘贴了你代码试运行,下载不到是因为大哥你没有给正则表达式分组啊,利用findall函数的话,方便在于,给s ...

谢谢你,可能代码多了容易忽略一些细节问题,又看了看书,确实是我没分组。。以后要细心一点,谢谢哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 20:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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