一、项目背景

动漫之家漫画下载

二、漫画下载

下载《欢乐懒朋友》

url:https://www.dmzj.com/info/huanlelanpengyou.html

目标:保存所有章节的图片到本地

1.获取章节名和链接名

import requests
from bs4 import BeautifulSouptarget='https://www.dmzj.com/info/huanlelanpengyou.html'req=requests.get(target)
html=req.text
bs=BeautifulSoup(html,'lxml')
list_con_li=bs.find('ul',class_="list_con_li")
a=list_con_li.find_all('a')for each in a:print(each.text,each.get('href'))

2.获取漫画图片地址

  • 先看第一章url:https://www.dmzj.com/view/huanlelanpengyou/94870.html#@page=1
    可以发现漫画分页存放,第一页后面加了page=1,第二页加了page=2,以此类推

  • 打开页面,发现不能点击右键检查元素,简单的反爬虫,直接按F12就可以,如果F12不行,还可以在URL前面加view-source:

  • 在检查不容易找到图片地址,可在浏览器Network中轻松找到真实地址,Headers中可以看清请求头信息,Preview可以浏览返回信息。

  • 找到图片的真实地址:https://images.dmzj1.com/img/chapterpic/30997/116345/1573149593515.jpg,然后再去html页面中去搜索

  • 判别是否动态加载:去view-source:中搜索不到图片地址,说明是动态加载的

    • Javascript中的动态加载就两种
    • 外部加载,在HTML页面中,一引用的形式加载一个js,如下
    • 内部加载,就是直接将js脚本直接写在html内。
    • 如下所示:
    <script type="text/javascript">var arr_img = new Array();var page = '';eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('k g=\'{"j":"e","f":"0","h":"d\\/4\\/2\\/1\\/c.3\\r\\5\\/4\\/2\\/1\\/8.3\\r\\5\\/4\\/2\\/1\\/6.3\\r\\5\\/4\\/2\\/1\\/9.3\\r\\5\\/4\\/2\\/1\\/a.3\\r\\5\\/4\\/2\\/1\\/b.3\\r\\5\\/4\\/2\\/1\\/u.3","o":"7","l":"m","n":"\\v\\i \\p\\t\\s\\q"}\';',32,32,'|132297|30997|jpg|chapterpic|nimg|16127590575194||16127590571358|16127590580377|16127590582676|16127590583266|16127590571361|img|113978|hidden|pages|page_url|u8bdd|id|var|chapter_order|38|chapter_name|sum_pages|u4e00|u51fa||u5f39|u952e|16127590586897|u7b2c33'.split('|'),0,{}))</script>
  • 通过对比图片的源地址:https://images.dmzj1.com/img/chapterpic/30997/116345/1573149593515.jpg,容易发现该地址是由上面的js代码中的数字拼凑起来的。下面定义get_urls函数获取图片的源地址,如下:
def get_urls(target):req=requests.get(url=target)bs=BeautifulSoup(req.text,'lxml')script_info=str(bs.script)pics=re.findall('\d{14}',script_info)for idx, pic in enumerate(pics):    #采集图片后顺序不对,按图片名数字升序对图片进行排序if len(pic) == 13:pics[idx] = pic + '0'pics = sorted(pics, key=lambda x:int(x))chapter_qian=re.findall('\|(\d{5})\|',script_info)[0]chapter_hou=re.findall('\|(\d{6})\|',script_info)[0]urls=[]for pic in pics:url='https://images.dmzj1.com/img/chapterpic/'+chapter_qian+'/'+chapter_hou+'/'+pic+'.jpg'urls.append(url)return urls

3.下载图片

使用urllib中的urlretrieve模块下载

import requests
from urllib.request import urlretrieve
dn_url = 'https://images.dmzj1.com/img/chapterpic/30997/116345/1573149593515.jpg'
urlretrieve(dn_url,'1.jpg')

没有其他反爬虫手段,可以直接下载了。但很多情况下是不能直接下载的,而且会出现下载中断的情况,这就需要在下载中引入header头

import requests
from contextlib import closingdownload_header = {'Referer': 'https://www.dmzj.com/view/huanlelanpengyou/111947.html'
}dn_url = 'https://images.dmzj1.com/img/chapterpic/30997/130584/16084654761554.jpg'
with closing(requests.get(dn_url, headers=download_header, stream=True)) as response:chunk_size = 1024  content_size = int(response.headers['content-length'])  if response.status_code == 200:print('文件大小:%0.2f KB' % (content_size / chunk_size))with open('1.jpg', "wb") as file:  for data in response.iter_content(chunk_size=chunk_size):  file.write(data)  else:print('链接异常')
print('下载完成!')

4.下载整本漫画

整合上述代码

import requests
from bs4 import BeautifulSoup
from contextlib import closing
import re,os,time
from tqdm import tqdmdef download_pics(target,names,urls,save_dir):for i,url in enumerate(tqdm(urls)):download_header={'Referer':url}name=names[i]#去掉空格中的.while '.' in name:name=name.replace('.','')#创建章节目录chapter_dir=os.path.join(save_dir,name)if name not in os.listdir(save_dir):os.mkdir(chapter_dir)#获取图片源地址req=requests.get(url)bs=BeautifulSoup(req.text,'lxml')script_info=str(bs.script)pics=re.findall('\d{14}',script_info)for idx, pic in enumerate(pics):    #对图片进行排序if len(pic) == 13:pics[idx] = pic + '0'pics = sorted(pics, key=lambda x:int(x))chapter_qian=re.findall('\|(\d{5})\|',script_info)[0]chapter_hou=re.findall('\|(\d{6})\|',script_info)[0]for idx,pic in enumerate(pics):pic_url='https://images.dmzj1.com/img/chapterpic/'+chapter_qian+'/'+chapter_hou+'/'+pic+'.jpg'pic_name='{0}.jpg'.format(idx+1)pic_save_path=os.path.join(chapter_dir,pic_name)#开始下载图片                with closing(requests.get(pic_url, headers=download_header, stream=True)) as response:chunk_size = 1024  content_size = int(response.headers['content-length'])  if response.status_code == 200:                    with open(pic_save_path, "wb") as file:  for data in response.iter_content(chunk_size=chunk_size):  file.write(data)  else:print('链接异常')time.sleep(10)        #获取章节名和链接名
def get_chapters(target):  req=requests.get(target)html=req.textbs=BeautifulSoup(html,'lxml')list_con_li=bs.find('ul',class_="list_con_li")a=list_con_li.find_all('a')chapter_names=[]chapter_urls=[]for each in a:chapter_names.append(each.text)chapter_urls.append(each.get('href'))    return chapter_names,chapter_urlsif __name__=='__main__':save_dir='欢乐懒朋友'if save_dir not in os.listdir(r'D:\ProgramData\Python'):os.mkdir(save_dir)target='https://www.dmzj.com/info/huanlelanpengyou.html'names,urls=get_chapters(target)download_pics(target,names,urls,save_dir)

三、python爬虫学习--动态下载网站漫画相关推荐

  1. Python爬虫学习教程 bilibili网站视频爬取!【附源码】

    Python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...

  2. python爬虫正则表达式实例-python爬虫学习三:python正则表达式

    python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...

  3. Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称

    Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称   这一节主要是使用xpath解析爬取全国城市名称 这里使用的网址是:空气质量历史数据查询   这一个案例体现的点主要是xpat ...

  4. python 爬虫学习:抓取智联招聘网站职位信息(二)

    在第一篇文章(python 爬虫学习:抓取智联招聘网站职位信息(一))中,我们介绍了爬取智联招聘网站上基于岗位关键字,及地区进行搜索的岗位信息,并对爬取到的岗位工资数据进行统计并生成直方图展示:同时进 ...

  5. Python爬虫学习手册

    like:128-Python 爬取落网音乐 like:127-[图文详解]python爬虫实战--5分钟做个图片自动下载器 like:97-用Python写一个简单的微博爬虫 like:87-爬虫抓 ...

  6. 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导

    爬虫是大家公认的入门Python最好方式,没有之一.虽然Python有很多应用的方向,但爬虫对于新手小白而言更友好,原理也更简单,几行代码就能实现基本的爬虫,零基础也能快速入门,让新手小白体会更大的成 ...

  7. b站学python_Python爬虫学习教程 bilibili网站视频爬取!【附源码】

    python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...

  8. Python爬虫学习总结

    Python爬虫学习总结 一.前提 请求网站并提取数据的自动化程序, 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的 ...

  9. python爬虫学习 - 查看显卡价格

    python爬虫学习 - 查看显卡价格 这是一个简单的爬虫项目,用于从中关村网站上爬取显卡报价数据,后续可以考虑爬取相关的参数信息让数据更立体.数据的保存使用的是json,以python为主要开发语言 ...

最新文章

  1. Docker部署文档
  2. 彻底解决Spring mvc中时间的转换和序列化等问题
  3. 在linux下安装db2全过程
  4. RMQ问题:与众不同(st表的高端应用)
  5. 嵌入式开发中关键字_IO 和 volatile的用法
  6. 凸包练习: POJ 2187(JAVA)
  7. OCP 12c最新考试原题及答案(071-7)
  8. mac php mysql 环境_Mac下配置PHP+MySql环境
  9. 异或运算符 判断奇偶
  10. YOLO-V4解读:速度与精度的完美结合
  11. VMware:虚拟机(xp)与主机(win10)连接步骤(超详细)
  12. java dbutils_Java学习之DBUtils
  13. c#winform——Gobang五子棋简易版双人对战制作(基本结构+代码)
  14. 安卓txt极简记事本文件保存内部存储无广告
  15. 关于长江的题目_高中优秀议论文题目【高中关于长江的作文题目加优秀范文】...
  16. 谷歌浏览器 如何设置在新标签页打开链接
  17. 通过IMSI判断运营商的方法
  18. 2015秋招经历和总结
  19. 【C#】KPM算法解决字符串匹配问题
  20. 灰度共生矩阵的生成和理解

热门文章

  1. windows命令行下通过cl命令编译动态链接库示例
  2. 《C语言程序设计》文件
  3. VVIC接口,item_get - 根据ID取商品详情
  4. linux创建蓝光映像光盘,11.13 mkisofs指令:创建光盘映像文件
  5. java 四则运算_java实现小学生四则运算
  6. python情人节之玫瑰花与表白方式_python情人节之玫瑰花与表白方式-Go语言中文社区...
  7. MP3文件分析之ID3v2.3版本
  8. JavaWeb商城项目笔记--- Day1 (热门商品,热销商品)
  9. Centos 7 无法上网的解决办法
  10. Android中的四大天王