博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【python实战系列】批量下载喜欢的漫画(七)
阅读量:2055 次
发布时间:2019-04-28

本文共 3542 字,大约阅读时间需要 11 分钟。

最近一段时间迷上了看漫画,所以一不小心就拖更,哈哈,漫画的魅力实在是太大了,没办法,我也控几不住我记几啊。

     不过最近家中网络老是不好,严重影响我看漫画的心情,于是就想着提前把漫画在公司下载下来,等到了没网或者网络不好的时候再看。但一个个下载漫画太慢了,有下载这功夫,我还不如直接看完。人呐,就是一个懒惰而又矛盾的生命体啊。没办法,只能另外想办法了。

      虽说生活已经如此地艰难,但我还是想到了办法,可以通过一个程序对漫画进行批量下载,并将每个系列归类到各个文件夹中。

       说干就干,我们先进入网站利用chrome的强大审查元素的工具对网站的结构进行审查。

先获取一个系列的名称

title = result.select('.listview')[0].text

 

通过上图获取系列中每篇漫画的地址和标题,我们就可以通过程序进入该链接,获取我们需要的数据,当然,上面只是相对路径,我们可以通过域名+该链接  拼接成完整的路径。

linkAList = result.select('ul li h3 a')

接下来就是漫画正文部分了,我们继续用chrome对正文部分的图片进行审查

虽说我并不知道该网站的漫画为啥显示不出来,不过图片资源还是能访问的,通过上图,我们可以找到正文中漫画图片的定位,我们可以通过元素定位获取到对应的图片列表,并对其进行下载。

imgList = result.select('.article-content img')
  •  
urllib.request.urlretrieve(img_url, titlePath + "/%02d.jpg" % titleID)

    虽说程序大致已经完成了,不过还有一些问题,就是一般漫画都会有分页,我们需要获取所有分页的漫画。这就需要接着对分页的元素进行审查,通过观察发现,每翻一页,对应的url也会发生变化,既:

 

也就是说我们只需要将原地址的基础上加上 "_页码",即为分页后的数据。

这样,分页后的数据也解决了。不过还有一个问题:

我们不知道一个漫画一共有多少页?

不过这个问题也难不倒我,我们可以通过获取分页的元素进行动态获取分页的总大小。

pageLiArr = result.select(".pagination-wrapper .pagination li a")print('访问分页的链接地址:' + titleUrl)    img_cover(titleUrl, titlePath, titleID)    for pageLi in pageLiArr[3:(len(pageLiArr) - 1)]:        pageNo = pageLi.text        tempUrl = titleUrl.replace('.html', '_' + pageNo + '.html')        print('访问分页的链接地址:' + tempUrl)        img_cover(tempUrl, titlePath, titleID)

接下来贴一下完整的代码:

import requestsfrom bs4 import BeautifulSoupimport urllib.requestimport osuser_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'comicPath = 'F:\\test\\comic\\'domainUrl = 'http://www.gllmh.com/'def getRespone(url):    req_header = {'User-Agent': user_agent    }    response = requests.get(url, headers=req_header)    page = response.text    page = page.encode('ISO-8859-1').decode('gbk', errors='ignore')    result = BeautifulSoup(page, 'lxml')    response.close()return resultdef img_cover(url, titlePath, titleID):try:        result = getRespone(url)        imgList = result.select('.article-content img')for img in imgList:# 拼接路径            img_url = img['src']            urllib.request.urlretrieve(img_url, titlePath + "/%02d.jpg" % titleID)            titleID = titleID + 1            print("下载中....,进度:%d" % (titleID / len(imgList) * 100) + "%")except Exception as e:        print("页面访问失败,继续访问下一个...")        print(e)def downImgUrlList(titleUrl, titlePath, titleID):    result = getRespone(titleUrl)    pageLiArr = result.select(".pagination-wrapper .pagination li a")    print('访问分页的链接地址:' + titleUrl)    img_cover(titleUrl, titlePath, titleID)for pageLi in pageLiArr[3:(len(pageLiArr) - 1)]:        pageNo = pageLi.text        tempUrl = titleUrl.replace('.html', '_' + pageNo + '.html')        print('访问分页的链接地址:' + tempUrl)        img_cover(tempUrl, titlePath, titleID)def downComicByTypeUrl(url):    result = getRespone(url)    title = result.select('.listview')[0].text    linkAList = result.select('ul li h3 a')    print(title)    typePath = comicPath + titleif not os.path.exists(typePath):        os.mkdir(typePath)    print('-' * 50)for linkA in linkAList:        titleUrl = domainUrl + linkA['href']        titlePath = typePath + '/' + linkA['title'] + '/'if not os.path.exists(titlePath):            os.mkdir(titlePath)        print('正在下载:' + linkA['title'] + ':' + titleUrl)        titleID = 0        downImgUrlList(titleUrl, titlePath, titleID)if __name__ == '__main__':# "http://www.gllmh.com/kbmh/xt300/"    downComicByTypeUrl('http://www.gllmh.com/kbmh/xt300/')

 

运行程序:

 

接下来我们就看一看我们的下载后的漫画:

这样就大功告成了,有兴趣的同学也可以去试一试,这样看漫画还是挺方便的。

 

喜欢本文的话,可以关注一下公众号,每天定时更新一篇python学习日记,让我们一起成长!

项目地址:

转载地址:http://ianlf.baihongyu.com/

你可能感兴趣的文章
剑指offer 38.丑数
查看>>
剑指offer 39.构建乘积数组
查看>>
剑指offer 57. 删除链表中重复的结点
查看>>
剑指offer 58. 链表中环的入口结点
查看>>
剑指offer 59. 把字符串转换成整数
查看>>
剑指offer 60. 不用加减乘除做加法
查看>>
leetcode 热题 Hot 100-3. 合并两个有序链表
查看>>
leetcode 热题 Hot 100-4. 对称二叉树
查看>>
Leetcode C++《热题 Hot 100-12》226.翻转二叉树
查看>>
Leetcode C++《热题 Hot 100-13》234.回文链表
查看>>
Leetcode C++《热题 Hot 100-14》283.移动零
查看>>
Leetcode C++《热题 Hot 100-15》437.路径总和III
查看>>
Leetcode C++《热题 Hot 100-16》448.找到所有数组中消失的数字
查看>>
Leetcode C++《热题 Hot 100-17》461.汉明距离
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-19》543.二叉树的直径
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>
Leetcode C++《热题 Hot 100-22》2.两数相加
查看>>
Leetcode C++《热题 Hot 100-23》3.无重复字符的最长子串
查看>>
Leetcode C++《热题 Hot 100-24》5.最长回文子串
查看>>