因为工作的需要,我需要下载现有学校各个版本的电子课本的封面拿来给到我们的UI设计师做参考设计。但是那么多出版社那么多个版本的电子课本,一张一张图片下载耗时不说,也实在是让人闹心。
前几天写了一个图片下载的爬虫《Python实例:一个简单的图片小爬虫》,想着修改一下用来下载电子课本封面图片也是不错。
说来就来,找到了一个电子课本聚合的网站:http://www.dzkbw.com/ (电子课本网)。查看源代码分析了一下它的网页结构:
发现以 data-original 标签包裹的Cover.jpg 文件就是封面图片,而相应 alt 指向的是图片的描述。于是,果断将 alt 指向的文字内容作为图片的文件名。
还需要注意的是需要将编码方式修改一下 r.encoding = r.apparent_encoding ,不然显示中文会变成乱码的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #获取http://www.dzkbw.com/上指定出版社的课本封面图片 import re import requests import urllib.request url = "http://www.dzkbw.com/books/bsd/" def getHtml(url): r = requests.get(url) r.encoding = r.apparent_encoding return r.text def getPic(url): html = getHtml(url) reg1 = '<h1>(.+?)</h1>' listDoc = re.findall(reg1, html) reg2 = 'data-original=\"(.+?)\" alt=\"(.+?)\"' listPic = re.findall(reg2, html) for img, name in listPic: print("Downloading %s.jpg" % (name)) urllib.request.urlretrieve(img, '%s.jpg' % (name)) getPic(url) |
执行后将则将图片保存在与py文件同级目录下了。然后通过修改url来实现不同出版社的封面图片下载。
嗯,这样好像有点不太方便呢,我还得把图片移动到不同出版社的文件夹下面,还得不停的复制相应的url路径。
干脆把文件夹名称与相应url做一个字典,然后存储到指定文件路径去吧!
OK,既然要存储到指定路径就需要新建相应文件夹了,这就需要引入 os 模块了,之前好像没用过的说。没事,我有百度大法!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #获取http://www.dzkbw.com/上指定出版社的课本封面图片 import re import requests import os import urllib.request def getHtml(url): r = requests.get(url) r.encoding = r.apparent_encoding return r.text def getPic(url, docName): html = getHtml(url) reg2 = 'data-original=\"(.+?)\" alt=\"(.+?)\"' listPic = re.findall(reg2, html) os.mkdir('F:\\Cover\\%s\\' % docName) local = 'F:\\Cover\\%s\\' % docName for img, name in listPic: print("Downloading %s.jpg" % (name)) urllib.request.urlretrieve(img, '%s%s.jpg' % (local, name)) listUrl = { '人教版' : 'http://www.dzkbw.com/books/rjb/', '苏教版' : 'http://www.dzkbw.com/books/sjb/', '北师大' : 'http://www.dzkbw.com/books/bsd/', '沪教版' : 'http://www.dzkbw.com/books/hjb/', '鲁教版' : 'http://www.dzkbw.com/books/ljb/', '冀教版' : 'http://www.dzkbw.com/books/jjb/', '浙教版' : 'http://www.dzkbw.com/books/zjb/', '仁爱版' : 'http://www.dzkbw.com/books/renai/', '外研版' : 'http://www.dzkbw.com/books/waiyan/', '译林版' : 'http://www.dzkbw.com/books/yilin/', '闽教版' : 'http://www.dzkbw.com/books/mjb/', '语文版' : 'http://www.dzkbw.com/books/ywcbs/', '青岛版' : 'http://www.dzkbw.com/books/qdb/', '中图版' : 'http://www.dzkbw.com/books/ztb/', '科粤版': 'http://www.dzkbw.com/books/kyb/', '人民版': 'http://www.dzkbw.com/books/renming/', '西师大版': 'http://www.dzkbw.com/books/xsd/', '北京版': 'http://www.dzkbw.com/books/beijing/' } for i in listUrl: url = listUrl[i] getPic(url, i) |
输出结果——
嘛,貌似还可以利用正则去匹配导航栏生成字典,这样连字典部分都可以省略了的样子。嗯,这个问题等后面有空了再继续改吧,先挖个坑。
2017.05.26 填坑
主要更新:使用BeautifulSoup库获取首页导航栏中子页名称和url路径,并生成字典。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #获取http://www.dzkbw.com/上指定出版社的课本封面图片 import re import requests import os import urllib.request from bs4 import BeautifulSoup def getHtml(url): #输入url地址,输出html代码 r = requests.get(url) r.encoding = r.apparent_encoding return r.text def getPic(url, docName): #输入url地址和文件夹名称,下载图片 html = getHtml(url) reg2 = 'data-original=\"(.+?)\" alt=\"(.+?)\"' listPic = re.findall(reg2, html) os.mkdir('F:\\Cover\\%s\\' % docName) local = 'F:\\Cover\\%s\\' % docName for img, name in listPic: print("Downloading %s.jpg" % (name)) urllib.request.urlretrieve(img, '%s%s.jpg' % (local, name)) def getUrls(homepage): html = BeautifulSoup(getHtml(homepage), 'html.parser') urls = html.select('#nav > div > a') listDocname = [] listUrls = [] for i in range(1, len(urls)): listDocname.append(urls[i].get_text()) listUrls.append(homepage + urls[i].get('href')) dictData1 = dict(zip(listDocname, listUrls)) dictData2 = more(homepage, dictData1['更多版本']) dictData = dict(dictData1, **dictData2) del dictData['更多版本'] return dictData def more(homepage,more): html = BeautifulSoup(getHtml(more), 'html.parser') urls = html.select('#f_nav > ul > li > a') listDocname = [] listUrls = [] for i in range(len(urls)): listDocname.append(urls[i].get_text()) listUrls.append(homepage + urls[i].get('href')) dictData = dict(zip(listDocname, listUrls)) return dictData homepage = "http://www.dzkbw.com" listUrl = getUrls(homepage) for i in listUrl: url = listUrl[i] getPic(url, i) |
果然是:Python大法好啊!