用python爬取整部漫画

文章目录

  • 用python爬取整部漫画
    • 契机
    • 收集信息
      •  目录页
      •   内容页
    • 开始爬取
      •   目录页
      •   内容页
    • 完整代码

契机

最近突然少女心爆棚,追上了一本甜甜的恋爱日漫《寄宿学校的朱丽叶》,可是腾讯坑啊,从第五话就开始收费了

然后就开始在百度上找资源,发现某免费漫画网站好像挺容易爬的,刚好学学爬虫(虽然最后发现好像并没有我想的那么简单,但好歹还是完成了)

一直知道有 requests urllib BeautilfulSoup 这几个库,但是只会用 requests 发个不带参数的 get 请求然后打印内容啥的

因为是学习,为了给自己降低难度,所以只用熟悉一点的官方库 requests,虽然其他两个好像更加方便

收集信息

 目录页

http://comic3.ikkdm.com/comiclist/2160/

网站结构很清晰,comiclist 代表所有漫画的目录,2160 为次漫画,如果要爬取所有漫画,则要控制 2160

按 F12 查看源码

第一个链接是主链接,后面三个是备用链接,备用链接不管,只需要收集两个信息,第一个 href 里的内容,以及中文名称,其中 55245 代表为第一话,因为到了后面就没规律了,所以放弃直接拼接 URL ,而是继续爬出所有链接

这里有两个坑

  • 一个是网页的编码
    涉及到三个编码,一个是 .encoding 返回的 ISO-8859-1,一个是本地默认的 UTF-8,一个是网页的编码 gbk,一开始我以为是应为 UTF-8 显示不正常,把它 decode 为 ISO-8895-1 ,结果更乱了,最后才知道,好像是传过来的是 ISO-8859-1,要 decode 为 gbk 才正常
#所以这两种是可以正常显示中文的
data.content.decode('gbk')
data.text.encode('ISO-8859-1').decode('gbk')  #ISO-8859-1要不要好像都没关系
  • 然后是,F12的内容跟爬取的内容有一点点出入(可能是浏览器做了优化???)
    首先是 href 标签用的是 单引号,浏览器显示的 双引号,还有 a标签,有的是大写,有的是小写
    经测试,下面的正则可以正确得到想要的内容(正则不太会写,有更好的写法,麻烦师傅们不吝赐教)
    两个括号中的内容即所需,其中 1.htm 后面发现为页数,所以不在爬取的范围内
href = re.findall("<[aA] href='(/comiclist/2160/.*?)/1.htm'.*?>(.*?)</[Aa]>", data)

  内容页

点击任一话,按 F12 查看源码

可以看到有一个 img 标签后面有图片地址,一开始我以为就这么简单,但是我还是太年轻了,结果测试的时候发现正则匹配不到

查看 python 返回的内容(写到这里,我想到Ctrl+U应该是一样的,貌似确实如此),发现并没有那么一句,然后我猜测可能是 JS 代码加载出来的


对比 JS 和下面的地址

<IMG SRC='"+m201304d+"newkuku/2016/06/21/寄宿学校的朱丽叶/001/000150P.jpg
http://s4.kukudm.com/newkuku/2016/06/21/寄宿学校的朱丽叶/001/000150P.jpg

发现是可以通过 JS 代码拼接出图片地址的

但是,奇怪的事情又发生了
正则匹配不到 <IMG SRC=’"+m201304d+ ,我在 notepad 里直接复制都搜索不到它,这是我一直想不通的问题 (我真是太蠢,+ 用 \ 转义便可了)

最后通过如下正则得到图片地址

image = re.search("(newkuku/20.*?)'>", content)

开始爬取

  目录页

首先回到目录页,爬取每一话的链接和名称

import requests
import reurl = 'http://comic3.ikkdm.com/comiclist/2160/'data = requests.get(url)
data = data.content.decode('gbk')href = re.findall("<[aA] href='(/comiclist/2160/.*?)/1.htm'.*?>(.*?)</[Aa]>", data)a = [i[0] for i in href]
b = [i[1] for i in href]urls = ["http://comic3.ikkdm.com" + link for link in a]
paths = [d for d in b]print(href)
print(urls)
print(paths)

输出结果,分别得到所有话的链接和名称

  内容页

既然得到了每一话的链接,那么下一步就是保存图片

先测试其中一话,将图片保存到相应的目录下面,代码如下

import os
import requests
import reurl = 'http://comic3.ikkdm.com/comiclist/2160/52245/1.htm'
path = "朱丽叶"content = requests.get(url)
content = content.content.decode('gbk')image = re.search("(newkuku/20.*?)'>", content)  #满足正则的有两个,但是只要第一个,search匹配到就结束,速度应该会比 finfall 快一点
img = 'http://s4.kukudm.com/' + image.group(1)jpg = requests.get(img)
jpg = jpg.contentos.system('mkdir '+path)
with open(path + '/1.jpg', 'wb') as f:f.write(jpg)

成功在脚本的目录下生成了 ”朱丽叶“ 的目录,并保存了一张 1.jpg 的图片

这还不够,我们之前提到最后的 1.htm 表示此话的第一页,这里是有规律的,后面的就链接就很容易想到,写个循环就能解决的

但是到底该循环几次呢??
再去源码里找找
发现这个东西

页眉、页脚都有,正则同样能匹配两次,所以依然用 search,不用 findall
代码如下:

import requests
import reurl = 'http://comic3.ikkdm.com/comiclist/2160/52245/1.htm'data = requests.get(url)
data = data.content.decode('gbk')total = re.search('共(\\d+)页', data)print(int(total.group(1))) #输出50,没有问题,因为是循环用到的,所以把他转化为整型

完整代码

把上面的代码稍作修改、拼接到一起,便可以得到完整代码去爬取漫画了

如下

import re
import time
import requests
import osurl = 'http://comic3.ikkdm.com/comiclist/2160/'
data = requests.get(url)
data = data.text.encode('ISO-8859-1').decode('gbk')href = re.findall("<[aA] href='(/comiclist/2160/.*?)/1.htm'.*?>(.*?)</[Aa]>", data)a = [i[0] for i in href]
b = [i[1] for i in href]
urls = ["http://comic3.ikkdm.com" + link for link in a]
paths = [d for d in b]for i in range(0,len(a)):paths[i] = paths[i].replace(" ", "_")os.system('mkdir ' + paths[i])# url = 'http://comic3.ikkdm.com/comiclist/2160/68767'url = urls[i]content = requests.get(url + '/1.htm')if content.status_code == 404:print(paths[i]+"--->404")continuecontent = content.text.encode('ISO-8859-1').decode('gbk')total = re.search('共(\\d+)页', content)for j in range(1, int(total.group(1)) + 1):time.sleep(2)host = url + '/' + str(j) + '.htm'content = requests.get(host)content = content.text.encode('ISO-8859-1').decode('gbk')image = re.search("(newkuku/20.*?)'>", content)img = 'http://s4.kukudm.com/' + image.group(1)jpg = requests.get(img)jpg = jpg.contentwith open(paths[i] + '/' + str(j) + '.jpg', 'wb') as f:f.write(jpg)print("finished %d/%d---->%d/%d" % (int(i),int(len(a)),int(j),int(total.group(1))))

实际测试过程中还是状况百出,所以又加了一点点东西

  • paths[i] = paths[i].replace(" ", “_”)
    中间有个空格,直接给我创建了两个文件夹,所以把空格替换一下
  • 判断是不是 404
    有几话没有,不加这个程序就会报错
  • sleep(2)
    间隔两秒,太快了容易出事
  • 最后加了个进度

记录一下自己所学到的知识,以加深印象

如果这篇文章让你觉得有一点点用,那我都觉得十分荣幸

python 爬取整部漫画(简单的图片爬取)相关推荐

  1. 超简单的图片爬取项目,复制粘贴就能用,批量爬取动漫图片。(保姆教程,可根据需要修改URL)

    各位未来国家栋梁们好啊~相信栋梁们经常需要在网络上寻找各种资源,作为二次元的必备精神食粮,图片资源那是必不可少!在这里用python写了一个超简单的图片爬取小项目~话不多说,附上源码!(有用的话点个赞 ...

  2. oracle向上取整10倍数,Oracle四舍五入,向上取整,向下取整

    用oracle sql对数字进行操作: 取上取整.向下取整.保留N位小数.四舍五入.数字格式化 取整(向下取整): select floor(5.534) from dual; select trun ...

  3. JS 中的Math方法向上取整、向下取整、保留整数、绝对值、取最大值、最小值等

    JS 中的Math方法向上取整.向下取整.保留整数.绝对值.取最大值.最小值等 1.只保留整数部分(丢弃小数部分) parseInt(5.1234);// 5 2.向下取整(<= 该数值的最大整 ...

  4. python爬取鬼灭漫画+简单JS分析

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨皖渝 源自丨快学python(ID:kxpyt ...

  5. Python Selenium+Requests爬虫[双线程]--今日头条图片爬取【亲测能行!!!】

    码前冷静分析 首先需要准备好selenium.requests库以及Chromedriver 这个就不细说了,有很多博客可以参考 然后讲一下大体思路 首先搜索想要爬取图片的关键词 - 接着是" ...

  6. Python爬虫入门教程 26-100 知乎文章图片爬取器之二

    1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中 ...

  7. python取整的几种常见方式-向上取整、向下取整、四舍五入取整、int()取整、“//”整除取整

    python使用中会遇到几种取整的情况,现在整理一下,以供以后学习参考. 一.向上取整,所有小数都是向着数值更大的方向取整,不论正负. math.ceil() import mathmath.ceil ...

  8. c语言的除法向上还是向下取整,C语言向上或向下取整函数

    点击上方 " 畅学电子 " 一键关注,轻松学习电子知识畅学电子网订阅号每天更新电子行业技术文章,及单片机最新资讯,随时随地轻松学习 C语言有以下几种取整方法: 1.直接赋值给整数变 ...

  9. c语言除法向下取整是加一么,【向上取整/向下取整】C语言向上或向下取整 函数...

    C语言有以下几种取整方法: 1.直接赋值给整数变量.如: int i = 2.5; 或 i = (int) 2.5; 这种方法采用的是舍去小数部分 2.C/C++中的整数除法运算符"/&qu ...

最新文章

  1. 中文短文本相似度:WMD
  2. 烂泥:nginx、php-fpm、mysql用户权限解析
  3. react native引入第三方库
  4. 必应词典UWP版-开发小结
  5. 深入理解分布式技术 - 分布式缓存实战_常见的坑及解决办法
  6. linux检测文件名编码,Linux下查看文件编码,文件或文件名编码格式转换 | 缥缈的云...
  7. iOS一次定位解决方案(基于高德iOS SDK)
  8. mats测试所有显存命令_RGBLCD液晶屏层叠显示测试
  9. 在线考试新入.html,JSP+SSM+MySql实现的在线考试系统毕设指导思路模板
  10. 安装MOSS2007全过程及创建网站的过程
  11. redis服务端的maxclient和最大连接空闲时间设置
  12. 玛莎拉蒂品牌与酷客多小程序达成官方合作!
  13. [2019杭电多校第三场][hdu6608]Fansblog
  14. java常量池在哪里_【Java基础】Java常量池在哪里? - 收获啦
  15. ACM卡常数(各种玄学优化)
  16. 永恒之蓝(MS17010)漏洞kali使用MSF进行漏洞复现
  17. 20220321 Unity 3D修改项目名称和图标
  18. Civil3D创建装配集合
  19. MySQL数据库体系 全面梳理(漂亮简洁的思维导图)
  20. 我理解的myisam引擎之二 MyISAM表(MYD)存储格式

热门文章

  1. 物理机安装linux系统失败,物理机(服务器)安装centos6.5 无法启动报Error loading operating--(示例代码)...
  2. (附源码)springboot法律全书 毕业设计 280844
  3. 蚂蚁集团CEO宣布辞职,发生了什么?
  4. JAVA TOOL-【1】配置
  5. 音视频5.4——两个MP3混音合成一个MP3
  6. 算法复杂度分析中的符号(Θ、Ο、ο、Ω、ω)的意义
  7. 【转】最全前端面试问题及答案总结
  8. 科目二考试之倒车入库步骤
  9. 如何使用python做图_如何使用python做动图
  10. 十年HRD总结3个逆向思维的招聘方法