这篇文章主要介绍了基于Python实现ComicReaper漫画自动爬取脚本过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
讲真的, 手机看漫画翻页总是会手残碰到页面上的广告好吧...
要是能只需要指定一本漫画的主页URL就能给我返回整本漫画就好了...
这促使我产生了使用Python 3来实现, 做一个 ComicReaper(漫画收割者) 的想法!
本文所用漫画链接 : http://www.manhuadb.com/manhua/2317
总体流程
那就开始吧
做一些准备工作
先用字符串存储两个链接, 一个是本次漫画网站站点的域名URL, 另一个是当前我们要爬取的漫画的主页URL
再定义一个 header 字典, 用于存储我们的 User-Agent 和 Referer Referrer (由于早期HTTP规范的拼写错误, 为了保持向后兼容就将错就错了)
首部字段 User-Agent
首部字段 User-Agent 告诉服务器当前创建请求的浏览器是什么(有的网站会针对不同的浏览器提供不同的页面, 比如如果是手机浏览器提出的请求, 服务器就向客户端提供网站的手机版页面)
比如说同样是请求 GitHub 的主页, 左边是使用笔记本电脑上面的浏览器请求的页面, 右边是在安卓手机上请求的页面
首部字段 Referer
首部字段 Referer 告诉服务器当前请求的页面是从哪个Web页面发起的(一般情况下 Referer 字段用于防盗链)
有的网站不允许直接访问网站里面的URL, 只能通过从主页点击某个链接来进行跳转, 或者...我们在请求之前把 User-Agent 字段设置为主页或发起页即可
url_domainame = r'http://www.manhuadb.com' url_host = r'http://www.manhuadb.com/manhua/2317' header = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0', 'Referer' : '' }
获取章节目录
首先我们对我们接下来要做的事情做一个具体流程分析
我们要获取当前漫画所有章节的标题与URL(标题用于后期存储时文件夹的命名, URL用于跳转到当前章节的开始页面)并且存储在列表中
将会使用到Python的两个库, re 与 urllib
import re # 导入正则表达式 import urllib.request # 导入 urllib.request
对在浏览器中按下 [F12] 键打开开发者工具来对漫画的章节页面进行分析
我们可以看到页面中有很多章节, 也就是章节跳转链接, 每个链接的<a>标签中正好具有我们需要的标题和URL, 分别是<a>标签的 title 属性与 href 属性, 我们将使用字典来存储它
先不慌着前进, 考虑到整个HTML中有非常多的链接, 那么也就意味着页面中具有大量的<a>标签, 如果我们只是单纯地从HTML中过滤出<a>标签, 这样我们会得到大量我们并不需要的<a>标签, 这是不明智的, 我们必须只过滤出章节跳转链接的<a>标签, 仔细观察, 发现章节跳转链接的<a>标签们都具有一个特点, 那就是它们都具有 class 属性并且属性值为 "fixed-a-es" , 这就找到了一个可以定位章节<a>标签的依据, 把这一点加入到我们的正则表达式的匹配规则中去
现在就可以定义一个正则表达式匹配字符串了:
pat = r'<a class="fixed-a-es" href="(.*" rel="external nofollow" rel="external nofollow" title="(.*"'
为什么要这么写 :
- 在Python中, 在字符串常量的开头加一个 'r' 表示本字符串中的 '\' 字符将不会用来作转义字符使用, 保留了它原本的含义, 也就是反斜杠字符
- 在正则表达式中, '.' 字符用于匹配任何字符(当匹配时具有 're.S' 标志时此话成立, 否则只能匹配任意但除了 '\n' 以外的字符)
- 在正则表达式中, '*' 字符用于描述它左边的匹配字符的出现次数为0次或若干次
- 在正则表达式中, '(.*"收割"当前漫画的所有章节并存储为字典列表
代码如下 :
#获取一本漫画的所有章节的目录 def chapterIndexReaper(url_host, header): # 定义一个临时字典, 用于临时存储一个章节的标题与url dic_temp = { 'Title' : '', 'Url' : '' } # 章节字典列表, 存储当前漫画的所有章节字典 set_dic = [] # 构建Request对象 req = urllib.request.Request(url = url_host, headers = header) # 读取所请求的req并用utf-8编码来进行解码, 所得到的的字符串赋值给html html = urllib.request.urlopen(req).read().decode('utf-8') # 爬取漫画章节标题与url的正则表达式 pat = r'<a class="fixed-a-es" href="(.*" rel="external nofollow" rel="external nofollow" title="(.*"' # 使用pat在html中进行进行匹配(re.S参数是为了让"."除了能够匹配本身规定的字符, # 另外也能匹配"\n"), 返回一个结果列表res res = re.findall(pat, html, re.S) for i in res: dic_temp['Title'] = i[1] dic_temp['Url'] = url_head + i[0] # 向当前的章节字典列表的后面追加新的章节, 注意, 此处要使用浅拷贝 # (因为dic_temp是一个临时变量, 需要创建它的副本并追加到set_dic中去, # 否则当dic_temp刷新时set_dic中的元素会相应发生改变) set_dic.append(dic_temp.copy()) return set_dic
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]