今天就先挑战另外个动态加载的漫画网站,dmzj

漫画太多了,我们先挑选几个漫画下载试一试。

比如我们点击第一部漫画,进去后看看。

这里有很多章节,获得所有的章节这里不难。
接下来我们点击一个章节进去看看

我们看到了地址栏url后面有一些page的编号,如果我们换个编号就能跳到对应的页卡,而且我们在点击下一页和上一页的时候,页面没有刷新,这就是说明img的地址是全部存在于当前页面的,我们得去在本html内找到所有的img。

按F12后可以发现,这里存在所有的IMG地址

而且我们通过request在代码中是不能获得这俩元素的,说明这俩元素是动态生成的。这就是动态加载了。

我们把这一章节的所有img的url罗列下来,做个分析,毕竟是一个章节的,按道理img的url是有规律的啊,我们看到url是主要有三个数字组成,比如:
https://images.dmzj.com/img/chapterpic/1247/25304/14492330112801.jpg

这三个数字来自哪里?我们可以在所有的js文件和script里面搜索下,看看数字在哪里有存在即可,终于在一个script里面发现了猫腻啊。

这个是script是可以通过request获得的,对应关系如下:
我们把该script块和页卡选择框的元素放在一起去对照对照,如下取了第30章节和第29章节的内容:

因此我门需要的所有的url信息都是在这script的字符串里面可以去得到的呢。
我不想去追究这个逆天的字符串的顺序问题了,做个简单的吧(具体看code)。

完整代码如下:

# coding: utf-8
from concurrent.futures import ThreadPoolExecutor
import time
import os
import requests
from bs4 import BeautifulSouprootrurl = 'https://www.dmzj.com'
save_dir = 'D:/estimages/'headers = {"Referer": rootrurl,'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",'Accept-Language': 'en-US,en;q=0.8','Cache-Control': 'max-age=0','Connection': 'keep-alive'
}  ###设置请求的头部,伪装成浏览器def saveOneImg(dir, p1, p2, p3):img_url = 'https://images.dmzj.com/img/chapterpic/{}/{}/{}.jpg'.format(p1, p2, p3)new_headers = {"Referer": img_url,'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",'Accept-Language': 'en-US,en;q=0.8','Cache-Control': 'max-age=0','Connection': 'keep-alive'}  ###设置请求的头部,伪装成浏览器,实时换成新的 header 是为了防止403 http code问题,防止反盗链,try:img = requests.get(img_url, headers=new_headers)  # 请求图片的实际URLif (str(img).find('200') > 1):with open('{}/{}.jpg'.format(dir, img.url.split("/")[-1].split('.')[0].ljust(14, '0')), 'wb') as jpg:  # 请求图片并写进去到本地文件jpg.write(img.content)print(img_url)jpg.close()return Trueelse:return Falseexcept Exception as e:print('exception occurs: ' + img_url)print(e)raise edef getIms(p):strlist = str(p).split('|')dirlist = []imgslist = []for item in strlist:if item.isdigit():dirlist.append(item)if len(item) > 10:imgslist.append(item)dirlist = dirlist[:2]return dirlist, imgslistdef saveOneCap(dir, href):print(href)html = BeautifulSoup(requests.get(href, headers=headers).text, features="html.parser")dirlist, imgslist = getIms(html.find('script'))print(dirlist)print(imgslist)for jpg in imgslist:while 1:try:if saveOneImg(dir, dirlist[0], dirlist[1], jpg):  # first trybreaksaveOneImg(dir, dirlist[1], dirlist[0], jpg)  # try again if failedbreakexcept Exception as e:continue  # try again if occurs errordef saveOnePageFunc(dir, capters):for cap in capters:# 按照tag和图片组的内容来创建目录new_dir = '{}{}/{}'.format(save_dir, dir, cap.get_text())if not os.path.exists(new_dir):os.makedirs(new_dir)saveOneCap(new_dir, cap.get('href'))time.sleep(2)passdef tagSpider(tag, url):# 解析当前页面html = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser")# 提交一个保存页面的任务saveOnePageFunc(tag, html.find('ul', {'class': 'list_con_li autoHeight'}).find_all('a'))print("thread work over. ")if __name__ == '__main__':# 获得所有标签taglist = {'川灵物语': 'https://www.dmzj.com/info/chuanlingwuyu.html','魔王与勇者与圣剑神殿': 'https://www.dmzj.com/info/mwyyzysjsd.html','真励之徒弟': 'https://www.dmzj.com/info/zhenlizhitu.html','妖神记': 'https://www.dmzj.com/info/yaoshenji.html'}# 给每个标签配备一个线程with ThreadPoolExecutor(max_workers=10) as t:  # 创建一个最大容纳数量为20的线程池for tag, url in taglist.items():t.submit(tagSpider, tag, url)# 单个连接测试下下# tagSpider('川灵物语', 'https://www.dmzj.com/info/chuanlingwuyu.html')# 等待所有线程都完成。while 1:print('-------------------')time.sleep(1)

效果如下:


Python《突破JS动态加载,成功爬取漫画》相关推荐

  1. Github配置(git+vscode+python+jupyter)

    ①下载git 打开 git bash 工具的用户名和密码存储 $ git config --global user.name "Your Name" $ git config -- ...

  2. 【实验楼】python简明教程

    ①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...

  3. 【Kaggle Learn】Python 5-8

    五. Booleans and Conditionals Using booleans for branching logic x = True print(x) print(type(x))''' ...

  4. 【Kaggle Learn】Python 1-4

    [Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...

  5. 使用python愉快地做高数线代题目~

    今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...

  6. python 位运算与等号_Python 运算符

    和大多数语言一样,Python也有很多运算符,并且运算符跟其他语言的运算符大同小异接下来一一介绍: 算术运算符: 运算符描述实例 +加 - 两个对象相加a+b的输出结果是30 -减 - 得到复数或者一 ...

  7. python减小内存占用_如何将Python内存占用缩小20倍?

    当程序执行过程中RAM中有大量对象处于活动状态时,可能会出现内存问题,特别是在对可用内存总量有限制的情况下. 下面概述了一些减小对象大小的方法,这些方法可以显著减少纯Python程序所需的RAM数量. ...

  8. python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...

    本文实例讲述了Python实现对文件进行单词划分并去重排序操作.,具体如下: 文件名:test1.txt 文件内容: But soft what light through yonder window ...

  9. python程序如何执行死刑图片_如何判断对象已死

    已死的对象就是不可能被任何途径使用的对象,有以下几种方法判断一个对象是否已经死了: 引用计数 给对象添加一个引用计数器,每当有一个地方引用他,计算器就加 1:当引用失效时,计数器减 1:任何时刻计数器 ...

  10. Python gRPC 安装

    1. 安装依赖库 sudo pip3 install grpcio sudo pip3 install protobuf sudo pip3 install grpcio_tools 2. 生成对应文 ...

最新文章

  1. python线程安全的单例_[python笔记] 单例的几种实现方式(线程安全)
  2. 2020Alibaba数学竞赛决赛试题
  3. 优酷html5视频网站,国内主要视频网站的嵌入方式
  4. 使用OpenSSL工具制作X.509证书的方法及其注意事项总结
  5. java定时任务_java:springBoot使用@Scheduled注解配置定时任务
  6. python历史5分钟数据_python每5分钟从kafka中提取数据的例子
  7. android没有蓝牙设备,【Android】没有触发LeScanCallback导致无法搜索到蓝牙设备
  8. spark shuffle流程入门
  9. pytorch打包exe出现WARNING: file already exists but should not: C:\Users\workAI\AppData\Local\Temp\_MEI13
  10. Aqara网关、yeelight智能灯、智能窗帘电机如何实现场景化互联?
  11. 优麒麟linux系统下载,优麒麟最新版Ubuntu Kylin 16.04官方发布下载地址
  12. win32汇编学习的一些摘要
  13. 数据分析入门,深入浅出的数据分析
  14. SQL Server 进阶 01 数据库的设计
  15. FPGA|记得把BDF设为顶层文件啊!!!
  16. matlab语音编码,melp-MATLAB 基于低速率语音编码的 算法的源代码,很全很强大! 积极下载! 238万源代码下载- www.pudn.com...
  17. 人工智能技术在电力系统的应用有哪些
  18. 【Kaggle】纽约市出租车费预测(经典)
  19. 5天不再惧怕多线程——第一天 尝试Thread
  20. 深圳大学C语言 超级战士实验

热门文章

  1. 使用Linux命令行测试网速
  2. 随机生成一组不重复的随机数组
  3. [转]iOS开发使用半透明模糊效果方法整理
  4. 腾讯地图api将物理地址转化成坐标
  5. JAVA https证书相关
  6. Spring Boot 构建RESTful Web服务
  7. LSA类型讲解——LSA-5(第5类LSA——Autonomous System External LSA)、LSA-4(第四类LSA——ASBR Summary LSA)讲解
  8. linux sar命令找不到,linux的sar命令未找到
  9. java导数据到Excel
  10. Mac 系统部署Frp内网穿透服务 实现frpc shell启动脚本启动、停止