基于Python实现ComicReaper漫画自动爬取脚本过程解析


Posted in Python onNovember 11, 2019

这篇文章主要介绍了基于Python实现ComicReaper漫画自动爬取脚本过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

讲真的, 手机看漫画翻页总是会手残碰到页面上的广告好吧...

要是能只需要指定一本漫画的主页URL就能给我返回整本漫画就好了...

这促使我产生了使用Python 3来实现, 做一个 ComicReaper(漫画收割者) 的想法!

本文所用漫画链接 : http://www.manhuadb.com/manhua/2317

总体流程

基于Python实现ComicReaper漫画自动爬取脚本过程解析

那就开始吧

做一些准备工作

先用字符串存储两个链接, 一个是本次漫画网站站点的域名URL, 另一个是当前我们要爬取的漫画的主页URL

再定义一个 header 字典, 用于存储我们的 User-Agent 和 Referer Referrer (由于早期HTTP规范的拼写错误, 为了保持向后兼容就将错就错了)

首部字段 User-Agent

首部字段 User-Agent 告诉服务器当前创建请求的浏览器是什么(有的网站会针对不同的浏览器提供不同的页面, 比如如果是手机浏览器提出的请求, 服务器就向客户端提供网站的手机版页面)

比如说同样是请求 GitHub 的主页, 左边是使用笔记本电脑上面的浏览器请求的页面, 右边是在安卓手机上请求的页面

基于Python实现ComicReaper漫画自动爬取脚本过程解析

首部字段 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实现ComicReaper漫画自动爬取脚本过程解析

将会使用到Python的两个库, re 与 urllib

import re


 # 导入正则表达式
 import urllib.request  # 导入 urllib.request

对在浏览器中按下 [F12] 键打开开发者工具来对漫画的章节页面进行分析

基于Python实现ComicReaper漫画自动爬取脚本过程解析

我们可以看到页面中有很多章节, 也就是章节跳转链接, 每个链接的<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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 文件操作实现代码
Oct 07 Python
Python判断字符串与大小写转换
Jun 08 Python
Python字符串处理实现单词反转
Jun 14 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
python中format()函数的简单使用教程
Mar 14 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
python中class的定义及使用教程
Sep 18 Python
Python实现投影法分割图像示例(二)
Jan 17 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
浅谈python出错时traceback的解读
Jul 15 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
Python多继承以及MRO顺序的使用
Nov 11 #Python
python 有效的括号的实现代码示例
Nov 11 #Python
Python+OpenCV实现实时眼动追踪的示例代码
Nov 11 #Python
python的pyecharts绘制各种图表详细(附代码)
Nov 11 #Python
python OpenCV GrabCut使用实例解析
Nov 11 #Python
Python上下文管理器用法及实例解析
Nov 11 #Python
Django 请求Request的具体使用方法
Nov 11 #Python
You might like
给海燕B411配件机起死回生配上件
2021/03/02 无线电
用PHP+java实现自动新闻滚动窗口
2006/10/09 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
php的mssql数据库连接类实例
2014/11/28 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现划词翻译
2020/04/23 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
考博专家推荐信模板
2013/12/02 职场文书
财务部总监岗位职责
2014/03/12 职场文书
企业员工薪酬方案
2014/06/04 职场文书
优秀班集体申报材料
2014/12/25 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
Python函数对象与闭包函数
2022/04/13 Python