申明:这篇博文纯属用来技术分享,如他人利用博文内容来获取商业利益均与本人无关!

之前刚入门爬虫的时候,为了练手去爬了爱漫画网,那时候被它虐的不要不要的,后面搞了几天,东西是能爬到了,但是速度实在太慢了,就放弃了。 这两天一时兴起,又去二战了爱漫画网。结果圆满成功!代码我已经上传到github,地址:https://github.com/ant-chow/ComicCrawl.git 。话不多说,先分享一下成果^-^

先说一下环境,我是用的python,也没用什么爬虫框架,就用了urllib2来请求,beautifulsoup用来解析,这两个包相信大家都会用,不多说。

大体思路:指定一部漫画->直接请求获取所有章节url->对所有章节遍历,获取该章节的所有图片地址(需要想办法)->直接请求图片地址获取图片->保存图片到本地

单纯的讲概念可能有点抽象,我就拿爱漫画首页推的“斗破苍穹”这部漫画来当例子讲一下爬取方法吧:

首先爱漫画网如果你只是单纯的请求的话,能请求到内容,但是只能请求到一些没用的页面内容,它页面的有关漫画的内容如漫画图片等等都是进过封装的。例如你直接请求斗破苍穹的首页:http://www.iimanhua.com/imanhua/doupocang/ 可以请求到所有内容(这为我们后面爬漫画减少了难度,因为可以直接请求到所有的章节对应的url)。但是请求任意一个章节的页面如http://www.iimanhua.com/imanhua/9773/370695.html:时,麻烦就来了,这个章节有多少页直接请求不到,因为页数是用js动态加载的;请求不到多少页,就不能保证请求到所有图片,因为一页只有一张图片。而且就算知道有多少页的话,一页一页的去请求来获取图片的url,然后还要去请求图片的url来获取图片,这样很耗时。

一步一步来,先请求斗破苍穹首页:

basic_url = u'http://www.iimanhua.com/imanhua/doupocang/'# 控制请求次数,超过3次就放弃请求
retry_count = 0
while retry_count < 3:try:req = urllib2.Request(basic_url)html_1 = urllib2.urlopen(req).read()retry_count = 3except Exception, e:print u'第' + str(retry_count+1) + u'次请求失败!' + repr(e)if retry_count < 3:retry_count += 1print u'正在进行第 ' + str(retry_count+1) + u' 次请求...'else:print u'请求失败超过三次,将不再请求!'if retry_count < 3:exit()

请求完之后打印一下内容,发现有乱码。所以还要解决一下乱码:

# 解决乱码问题
my_char = chardet.detect(html_1)
charset = my_char['encoding']
if charset == 'utf-8' or charset == 'UTF-8':html = html_1
else:html = html_1.decode('gb2312', 'ignore').encode('utf-8')

用beautifulsoup解析一下获得的html代码,找到所有章节的url:

chapterURLList = []
chapterLI_all = soup.find('div', id='play_0').find_all('a')
for chapterLI in chapterLI_all:chapterURLList.append(chapterLI.get('href'))

重点来了!按理说现在应该按照思路去遍历章节的url然后取图片地址。这里我们看一下网站的源码:

这里你直接请求页面的话,是请求不到select下面的option的,因为它们都是通过第一行的js代码加载出来的。所以要找到“getPicSelectP()”这个方法是怎么实现的。看一下浏览器的资源管理器

找到了“getPicSelectP()”这个方法的实现代码。很容易看懂,是通过一个叫做“qTcms_S_m_murl”的变量来得到章节的总页数的。所以再找“qTcms_S_m_murl”这个变量在哪里赋值的。

其他的乱七八糟的都不用看,直接看画红线的,“qTcms_S_m_murl”这个变量是通过对一个叫“qTcms_S_m_murl_e”的变量进行base64解码后得到的。没错这就是网站对图片进行的第一重封装,用base64编码来隐藏真实的图片url。那么“qTcms_S_m_murl_e”这个变量又在哪里呢。首先他肯定是base64编码过的类似于“aHR0cDovL3R1”这样的字符串,所以我们只需要在页面上找这样类似的字符串就可以了,我们来看一下这个页面的源码

在页面的头部,找到了一大串这样的字符串,这就是这个章节所有url经过base64编码后的内容(其实眼尖的同学可以发现,上面这个图片大红框下面的那个小红框就是这个章节的下一个章节的地址,所以我们其实也可以通过取到这个地址来遍历所有的章节,大家可以自己去试一下),暴力法把他取下来:

# 获取当前章节所有加密的图片url, 并进行第一重解密
# 注意这里的html是请求任意章节后得到的html内容,请求方式跟上面一样
index1 = html.index("qTcms_S_m_murl_e=\"")
index2 = html.index("var qTcms_S_m_murl_e2")
page_num_base64 = html[index1:index2]
page_num_base64.strip()
page_num_base64 = page_num_base64[18:len(page_num_base64) - 4]
page_num = base64.decodestring(page_num_base64).split("$qingtiandy$")

经过上面的解析后,得到了下面的结果

直接用浏览器去请求这些地址,可以看到图片了。但是不要以为这就完了,这只是图片的一部分,对没错,网站还对这些图片url的一部分进行了伪装,这也是网站的第二重封装。如果你运气不好的话你就可能会碰到被伪装过的图片url。用浏览器去访问伪装后的url的话,是看不到图片的。那么既然他们伪装了图片的url,他们肯定是要再解析回来的,不然页面上怎么显示你说是吧。继续找他们解析伪装url的js

其他的都不要看太多,都是一些广告图片还有其他乱七八糟的东西。主要看红框的部分,变量v就是我们上面获得的经过伪装的图片url,伪装的不是很难,我们把他变成自己的代码来把上面得到的图片url解析一下:

# 按照网站的js对加密的url进行第二重解密
page_num[i] = page_num[i].replace("http://cartoon.jide123.cc/", "http://cartoon.shhh88.com/")
page_num[i] = page_num[i].replace("http://cartoon.jide123.cc:8080/", "http://cartoon.shhh88.com/")
page_num[i] = page_num[i].replace("http://cartoon.shhh88.com/", "http://cartoon.akshk.com/")
if page_num[i].find(base64.decodestring("ZG16ai5jb20=")) != -1:page_num[i] = web_url + "qTcms_Inc/qTcms.Pic.FangDao.asp?p=" + base64.encodestring(page_num[i])# 加这一段是因为发现有的图片url只有尾部,没有根地址,所以给他加个根地址
if page_num[i].find("http:") == -1:page_num[i] = u'http://www.iimanhua.com/' + page_num[i]

现在,所有的真正的图片url都拿到了,就可以直接请求拿图片啦。 试了一下速度,快的飞起啊^-^

呕心沥血写出来的,转载请一定注明出处!

二战漫画爬虫(爱漫画网)相关推荐

  1. 看漫画学python下载_Python爬虫实现漫画下载 - 『编程语言区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...

    [Python] 纯文本查看 复制代码import requests import lxml.html import os import re class Api(): # 搜索漫画 # keywor ...

  2. mangabz漫画网鬼灭之刃漫画爬虫

    mangabz漫画爬虫 遇到的问题(未解决) 1:多线程导致开启多个chrome内存溢出,或者chrome崩溃 2:下载不全需执行多次补全漫画 3:日志打印混乱 import requests imp ...

  3. 利用Termux在手机上运行爬虫下载漫画

    前言 前段时间喜欢上了几部漫画,发现了一个宝藏网站"拷贝漫画".上面有很多我想看的漫画,但是访问速度很慢,官方提供的下载又有次数限制.于是就在GITHUB上找了一个大佬写的爬虫. ...

  4. 漫画爬虫的一个小小的例子

    逢年过节胖三斤,技术手法退十年.- - 差不多一个多月没碰博客了,都快要没手感了. 说一下前一段时间玩爬虫的时候作死的一个小例子吧.大概的描述就是闲的没事做,去爬了一个漫画网站,想着成功了去装个逼.结 ...

  5. [Python BeautifulSoup Threading] 多线程漫画爬虫

    漫画爬虫 简介 爬取公开漫画资源,下载完成后打包成Zip发送至手机指定文件夹. 20201020:新增manganelo爬虫,也是英文漫画,使用了beautifulsoup解析网页,同时使用了多线程. ...

  6. Python漫画爬虫开源 66漫画 AJAX,包含数据库连接,图片下载处理

    小白爬虫,大神绕道 软件:mysql8 python3.8 首先观察漫画网站结构 2020/2/15 VictorGanro原创 仅学习使用 目标网站链接: http://6mh6.com/(我比较喜 ...

  7. python爬虫找漫画出现断章?那你就得看这篇爬虫思想教学咯!

    我们在爬取漫画的过程中,会不会觉得比爬一般的图片更困难一点? 今天我是遇到了, 但还是找了一些方法成功实现了它,那下面经验总结一下吧! 我是沙漏,关注我,不定期更新爬虫文章, 其他时间学linux 和 ...

  8. [js] 网易漫画爬虫

    最近迷上了看漫画,看到网上评论说Kindle看漫画体验不错,于是入手了一台KPW3. 一开始时还想着可以自己跟着kdroid.net上的教程刷个安卓,这样看漫画也方便,直接打开APP就可以看了,谁知道 ...

  9. python练手漫画爬虫,代码,软件成品打包下载链接,效果图

    #-*-coding:GBK -*- import urllib.request import lxml import pyquery import zlib import winreg #操作注册表 ...

最新文章

  1. HTML中div标签的一个简单的使用和介绍
  2. 随机器学习兴起的Julia编程语言
  3. linux上pyenv卸载,Linux环境下的 pyenv的安装
  4. linux怎么运行ing,Linux命令笔记ing
  5. L1为什么具有稀疏性
  6. 丰农控股 CIO 王轶枭:万亿级农资市场,神策数据助力大丰收筑就数据驱动核心竞争力
  7. Android studio git 本地仓库和远程仓库节点对比
  8. DataNode内部的各种数据结构
  9. 小程序app is not defined
  10. android 成长日记 8.Fragment学习之方法回调
  11. c语言科学计数法_C入门:C语言中数据的储存(上)
  12. 服务器上次文件命令,服务器上次文件命令
  13. java中线程调度遵循的原则_深入理解Java多线程核心知识:跳槽面试必备
  14. Dubbo面试 - dubbo的工作原理
  15. 为ESXi 4.x / 5.x / 6.x / 7.x创建持久暂存位置(1033696)
  16. 数据可视化软件有什么特点
  17. python播放音频文件
  18. Fiddler Everywhere v3.4.0
  19. SEO_关键词研究工具
  20. python大漠插件官网视频教程_python使用大漠插件进行脚本开发的尝试(一)

热门文章

  1. 机器学习与分布式机器学习_机器学习应运而生
  2. 人体相关的中日英表达
  3. 通用 zkSNARK
  4. 支持向量机_1: Maximum Margin Classifier
  5. Java实现 LeetCode 113 路径总和 II
  6. 24小时轮播怎么实现的_优酷24小时轮播台如何使用
  7. 我爬取了猪八戒网站的信息,发现了程序员做威客不得不进的坑
  8. wr890n虚拟服务器,TP-Link TL-WR890N无线路由器的上网设置教程
  9. Maven下的Mybatis基本配置和使用
  10. Jetpack架构组件 (一)-- Android Jetpack 简介