转载请注明来源, 原文链接 :
讲真的, 手机看漫画翻页总是会手残碰到页面上的广告好吧, 再碰上站点的带宽还很低, 无疑是雪上加霜, 要是指定漫画的主页URL就能给我返回整本漫画的所有图片并且整理好存放在指定目录就好了...
这促使我产生了使用Python 3来实现, 做一个 ComicReaper(漫画收割者) 的想法!
总体流程
那就开始吧
做一些准备工作
导入将会使用到Python的两个库, re 与 urllib
1 #导入正则表达式
2 importre3 #导入 urllib.request
4 import urllib.request
先用字符串存储两个链接, 一个是本次漫画网站站点的域名URL, 另一个是当前我们要爬取的漫画主页URL
再定义一个 header 字典, 用于存储我们的 User-Agent 和 Referer Referrer (由于早期HTTP规范的拼写错误, 为了保持向后兼容就将错就错了)
1 url_domainame = r'https://www.manhuadb.com'
2 url_host = r'https://www.manhuadb.com/manhua/2317'
3 header ={4 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0',5 'Referer' : ''
6 }
首部字段 User-Agent
首部字段 User-Agent 告诉服务器当前创建请求的浏览器是什么(有的网站会针对不同的浏览器提供不同的页面, 比如如果是手机浏览器提出的请求, 服务器就向客户端提供网站的手机版页面)
比如说同样是请求 GitHub 的主页, 左边是使用笔记本电脑浏览器请求的页面, 右边是在安卓手机上请求的
首部字段 Referer
首部字段 Referer 告诉服务器当前请求的页面是从哪个Web页面发起的(一般情况下 Referer 字段用于防盗链)
有的网站不允许直接访问站内的URL, 只能通过从主页点击链接来进行跳转, 或者...我们在请求之前构建请求头把 User-Agent 字段设置为主页或发起页即可
获取章节目录
一次性获取所有的章节信息将会是一个不错的选择, 因为发起一次请求的代价很高(当网速较慢或者网站带宽较低时, 延时很高)
我们要获取当前漫画所有章节的标题与URL(标题用于后期存储时文件夹的命名, URL用于跳转到当前章节的开始页面)并且打包成字典存储在列表中
对在浏览器中按下 [F12]键打开开发者工具来对漫画的章节页面进行分析
我们可以看到页面中有很多章节, 也就是章节跳转链接, 每个链接的标签中正好具有我们需要的标题和URL, 分别是标签的 title 属性与href 属性, 我们将使用字典来存储它
先不慌着前进, 考虑到整个HTML中有非常多的链接, 那么也就意味着页面中具有大量的标签, 如果我们只是单纯地从HTML中过滤出标签, 这样我们会得到大量我们并不需要的标签, 这是不明智的, 我们必须只过滤出章节跳转链接的标签, 仔细观察, 发现章节跳转链接的标签们都具有一个特点, 那就是它们都具有 class 属性并且属性值为 "fixed-a-es" , 这就找到了一个可以定位章节标签的依据, 把这一点加入到我们的正则表达式的匹配规则中去
现在就可以定义一个正则表达式匹配字符串了(什么是正则表达式?)(在线正则表达式练习) :
在Python中, 在字符串常量的开头加一个 'r' 表示本字符串中的 '\' 字符将不会用来作转义字符使用, 保留了它原本的含义, 也就是反斜杠字符
在正则表达式中, '.' 字符用于匹配任何字符(当匹配时具有 're.S' 标志时此话成立, 否则只能匹配任意但除了 '\n' 以外的字符)
在正则表达式中, '*' 字符用于描述它左边的匹配字符的出现次数为0次或若干次
在正则表达式中, '(.*?)' 的组合用来表示一个贪婪匹配(并且会被捕捉到), 至于什么是贪婪匹配, 可以看这位博主的这篇文章
使用这个正则表达式, 就可以匹配到 title 属性与 href 属性的属性值中的双引号里面的内容了
具体实现是 chapterIndexReaper 函数, 主要用来"收割"当前漫画的所有章节并存储为字典列表
2 defchapterIndexReaper(url_host, header):3 #定义一个临时字典, 用于临时存储一个章节的标题与url
4 dic_temp ={5 'Title' : '',6 'Url' : ''
13 html = urllib.request.urlopen(req).read().decode('utf-8')14 #爬取漫画章节标题与url的正则表达式