基于Python实现ComicReaper漫画自动爬取脚本过程解析
作者:Laplacedoge 发布时间:2021-07-25 21:45:45
这篇文章主要介绍了基于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次或若干次
在正则表达式中, '(.*?)' 的组合用来表示一个贪婪匹配(并且会被捕捉到)
使用这个正则表达式, 就可以匹配到 title 属性与 href 属性的属性值中的双引号里面的内容了
具体实现是 chapterIndexReaper 函数, 主要用来"收割"当前漫画的所有章节并存储为字典列表
代码如下 :
#获取一本漫画的所有章节的目录
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
来源:https://www.cnblogs.com/Laplacedoge/p/11828622.html


猜你喜欢
- 摘要:本文主要就数据库恢复与系统任务的调度,在结合一般性的数据库后台处理的经验上,提出较为实用而新颖的解决方法,拓宽了数据库后台开发的思路。
- 一、MySQL优点:体积小、速度快、总体拥有成本低,开源;支持多种操作系统;是开源数据库,提供的接口支持多种语言连接操作 ;MySQL的核心
- 一般情况下,局域网里的终端比如本地服务器设置静态IP的好处是可以有效减少网络连接时间,原因是过程中省略了每次联网后从DHCP服务器获取IP地
- 光学元件类平面反射镜是一种极为简单的模型,因为我们只需要考虑一个平面即可。但是除此之外的其他光学元件,可能会变得有些复杂:我们必须考虑光在入
- Java的idea在更新2020.1时就更新了官方汉化,当时Pycharm还没用出现汉化,但这两天提示我更新2020.1.1的时候,我发现p
- 1.微博三方登录流程1.1 前端获取认证code1.在Vue页面加载时 动态发送请求获取微博授权url2.django收到请求的url后,通
- 目录一、Python执行外部命令1、subprocess模块简介2、subprocess模块的遍历函数3、subprocess模块的Pope
- <html xmlns="http://www.w3.org/1999/xhtml"> <head&g
- 这篇文章主要介绍了python 图像处理画一个正弦函数代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 原文件:7.8094,1.0804,5.7632,0.012269,0.008994,-0.003469,-0.79279,-0.06468
- 前言QTableWidget是Qt程序中常用的显示数据表格的控件,类似于c#中的DataGrid。QTableWidget是QTableVi
- 有一个同学在Gne的群里面咨询如何通过Selenium获取当前鼠标指向的元素,在我讲了方法以后,他过了两天又来问:那么,我今天就来写一篇文章
- 多个字段模糊查询, 括号中的下划线是双下划线,双下划线前是字段名,双下划线后可以是icontains或contains,区别是是否大小写敏感
- 一、前言Python中列表的复制分为几种情况:直接赋值浅复制深复制下面通过实例分析一下这几种情况的区别。二、直接赋值a = [11, 22,
- Pygame的Event事件模块事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如常用的鼠标点击、键盘敲击
- 在对float零值判断时往往只需要和0做==即可,所以曾经int和float都用==0来做对比,比如下方: in
- 常规的Excel数据处理中,就是对Excel数据文件的读/写/文件对象操作。通过对应的python非标准库xlrd/xlwt/xlutils
- 用到了两个库,xlrd和xlwtxlrd是读excel,xlwt是写excel的库[/code]1)xlwd用到的方法:xlwt.Workb
- 这些天,我需要全文搜索。这个区块中最酷的孩子们是Elastic Search和Sorl:他们快速,灵活,资源消耗沉重并且需要Java,这几乎
- 1.创建图在tensorflow中,一个程序默认是建立一个图的,除了系统自动建立图以外,我们还可以手动建立图,并做一些其他的操作。下面我们使