三、python爬虫学习--动态下载网站漫画
一、项目背景
动漫之家漫画下载
二、漫画下载
下载《欢乐懒朋友》
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爬虫学习--动态下载网站漫画相关推荐
- Python爬虫学习教程 bilibili网站视频爬取!【附源码】
Python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...
- python爬虫正则表达式实例-python爬虫学习三:python正则表达式
python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...
- Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称
Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称 这一节主要是使用xpath解析爬取全国城市名称 这里使用的网址是:空气质量历史数据查询 这一个案例体现的点主要是xpat ...
- python 爬虫学习:抓取智联招聘网站职位信息(二)
在第一篇文章(python 爬虫学习:抓取智联招聘网站职位信息(一))中,我们介绍了爬取智联招聘网站上基于岗位关键字,及地区进行搜索的岗位信息,并对爬取到的岗位工资数据进行统计并生成直方图展示:同时进 ...
- Python爬虫学习手册
like:128-Python 爬取落网音乐 like:127-[图文详解]python爬虫实战--5分钟做个图片自动下载器 like:97-用Python写一个简单的微博爬虫 like:87-爬虫抓 ...
- 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导
爬虫是大家公认的入门Python最好方式,没有之一.虽然Python有很多应用的方向,但爬虫对于新手小白而言更友好,原理也更简单,几行代码就能实现基本的爬虫,零基础也能快速入门,让新手小白体会更大的成 ...
- b站学python_Python爬虫学习教程 bilibili网站视频爬取!【附源码】
python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...
- Python爬虫学习总结
Python爬虫学习总结 一.前提 请求网站并提取数据的自动化程序, 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的 ...
- python爬虫学习 - 查看显卡价格
python爬虫学习 - 查看显卡价格 这是一个简单的爬虫项目,用于从中关村网站上爬取显卡报价数据,后续可以考虑爬取相关的参数信息让数据更立体.数据的保存使用的是json,以python为主要开发语言 ...
最新文章
- Docker部署文档
- 彻底解决Spring mvc中时间的转换和序列化等问题
- 在linux下安装db2全过程
- RMQ问题:与众不同(st表的高端应用)
- 嵌入式开发中关键字_IO 和 volatile的用法
- 凸包练习: POJ 2187(JAVA)
- OCP 12c最新考试原题及答案(071-7)
- mac php mysql 环境_Mac下配置PHP+MySql环境
- 异或运算符 判断奇偶
- YOLO-V4解读:速度与精度的完美结合
- VMware:虚拟机(xp)与主机(win10)连接步骤(超详细)
- java dbutils_Java学习之DBUtils
- c#winform——Gobang五子棋简易版双人对战制作(基本结构+代码)
- 安卓txt极简记事本文件保存内部存储无广告
- 关于长江的题目_高中优秀议论文题目【高中关于长江的作文题目加优秀范文】...
- 谷歌浏览器 如何设置在新标签页打开链接
- 通过IMSI判断运营商的方法
- 2015秋招经历和总结
- 【C#】KPM算法解决字符串匹配问题
- 灰度共生矩阵的生成和理解
热门文章
- windows命令行下通过cl命令编译动态链接库示例
- 《C语言程序设计》文件
- VVIC接口,item_get - 根据ID取商品详情
- linux创建蓝光映像光盘,11.13 mkisofs指令:创建光盘映像文件
- java 四则运算_java实现小学生四则运算
- python情人节之玫瑰花与表白方式_python情人节之玫瑰花与表白方式-Go语言中文社区...
- MP3文件分析之ID3v2.3版本
- JavaWeb商城项目笔记--- Day1 (热门商品,热销商品)
- Centos 7 无法上网的解决办法
- Android中的四大天王