Node.js/Python爬取网上漫画

  某个周日晚上偶然发现了《火星异种》这部漫画,便在网上在线看了起来。在看的过程中图片加载很慢,而且有时候还不小心点到广告,大大延缓了我看的进度。后来想到能不能把先把漫画全部抓取到本地再去看。

  经过一段时间的研究还是有所收获:成功在风之动漫网站上抓取了《火星异种》,以及在腾讯动漫上抓取了《海贼王》。一般来说,抓取网页内容有两种形式:一是静态资源,即网站内容在第一时间就全部呈现在网页上;另一种是动态资源,即网站内容随后通过用户交互,如:操作滚动条等,异步的更新。对于第一种形式,直接通过发送 request 请求并解析返回结果即可;对于第二种形式,可以通过 PhantomJS 模拟浏览器访问,并通过写代码模拟用户交互行为,最终拿到数据。

1. 静态资源抓取 (代码地址:Node.jsPython)

分析阶段:

  1. 打开《火星异种》漫画首页 ,发现 “http://www.fzdm.com/manhua/47/” 有数字 “47”,将数字 “47” 改成 “48” 后发现是《吞噬人间》漫画首页,于是我们知道了这个数字用来标识不同漫画

  2. 随机进入 48 话和 86 话,发现连接分别为“http://www.fzdm.com/manhua/47/48/” 和 “http://www.fzdm.com/manhua/47/86/”,于是我们知道了每一话的连接地址(注:实际上第001话的地址为 “http://www.fzdm.com/manhua/47/001/”,但由于当时已经看到 40 多话了,代码没有对这一块进行特殊处理

  3. 随机进入 50 话,随机查看不同页的 URL 后发现 URL 的形式为 “http://www.fzdm.com/manhua/47/50/index_*.html” 其中 * 和当前页码对应

4. 查看每一页的漫画图片元素发现,<img> 元素的 id = "mhpic",因此可以轻松获取到漫画图片的地址

  5. 最后只需要发送请求到漫画图片所在的地址,并将图片数据保存在本地即可

注意事项:

  1. 需要记录当前已抓取到哪一话,也就是记录当前抓取的状态。当需要抓取的内容特别长,不能一次性抓完时,保存上一次抓取的断点十分必要,同时也是为了在抓取的过程中出现错误后不用每次从头抓取

  2. 最好在抓取之前先检测改文件是否存在,不存在才发送请求。这是为了当程序中出现bug导致已抓取的页面不全时,不用再重复抓取已经存在的图片

  3. 添加重试机制,在一定时间内访问同一个站点次数太多,可能会出现服务拒绝之类的错误。调节好访问频率,出错后每隔一段时间进行重试即可。

Bonus:

  在查看网页源码的时候发现,当前页面除了加载当前页的漫画图片资源外,还会加载下一话的图片资源,并在当前页隐藏。这样查看下一页的时候就能直接从缓存中读取数据。

2. 动态资源抓取 (代码地址:Node.js)

分析阶段:

  1. 打开《海贼王》漫画首页,随机打开 857 和 858 话,地址分别为 “http://ac.qq.com/ComicView/index/id/505430/cid/874” 和 “http://ac.qq.com/ComicView/index/id/505430/cid/875”。发现虽然 URL 是连贯的,但和当前话数字对应不上。打开第一话发现地址是 “http://ac.qq.com/ComicView/index/id/505430/cid/1”,于是猜测中间有些 URL 可能失效了,需要再代码里做好容错 (无论在什么情况下最好都做好容错)。

  2. 随机打开 857 话,发现漫画图片是随着往下滚动动态加载。查看网页源码发现,未加载漫画图片的地方是用地址为“http://ac.gtimg.com/media/images/pixel.gif”的图片占位。于是不能简单的通过单次请求来获取漫画图片地址。需要使用 PhantomJS PhantomJS for Node等工具来模拟浏览器访问,并通过代码模拟用户交互行为,最终获取数据

  3. 通过 setTimeout 改变 scrollTop 来模拟下拉滚动条,滚动到页面底部后,查看页面有效 img 标签的数量看是否等于当前话的页数,否的话继续模拟用户从头下拉滚动条。

注意事项:

  1. PhantomJS 代码是在隔离沙箱中运行,不能使用 Node 代码环境下的全局变量之类的,可以通过 “onConsoleMessage” 事件来与 Node 环境交互。

Python 和 Node 对比使用体验

  由于对 Node 比较熟,所以是先写好 Node 版本,有时间的话在用 Python 写一遍。在写的过程中发现,Node 的回调写法用在这样的场景不太方便,但如果用上 ES7 的 Async/Await 的话,写起来就方便很多了;但用 Node 的优势是解析网页数据十分方便,就像在浏览器端进行 DOM 操作一样。使用 Python 的优势是同步的写法,缺点是解析网页数据不方便。

  虽然 Node 的异步写法用在这种场景下很不方便,但也正因为异步的关系,可以用一个进程一次性抓取好几个不同的漫画,实现类似多线程的效果。

时间: 2024-10-16 12:09:08

Node.js/Python爬取网上漫画的相关文章

Node.js爬虫-爬取慕课网课程信息

第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让我们方便的操作HTML,就像是用jQ一样 开始前,记得 npm install cheerio 为了能够并发的进行爬取,用到了Promise对象 //接受一个url爬取整个网页,返回一个Promise对象 function getPageAsync(url){ return new Promise(

python爬取哦漫画

1 import requests 2 from lxml import etree 3 from bs4 import BeautifulSoup 4 import os 5 from selenium import webdriver 6 7 8 9 #解析每个漫画分页并下载漫画 10 def manhua(url): 11 12 13 browser.get(url) 14 15 #获取模拟访问的页面源码 16 html=browser.page_source 17 18 19 html

爬虫大作业~以爬取hao123漫画为例

一.准备过程 首先打开hao123漫画筛选区,网址是https://www.hao123.com/manhua/list/?finish=&audience=&area=&cate=&order=1 在这里可以通过审查模式看到第一页的详细信息,而目的则是通过爬取漫画筛选页面的每部漫画的人气与题材来分析最近漫画迷的观漫需求 环境如下: python3.6.2 PyCharm Windows8.1 第三方库(jieba,wordcloud,bs4,Requests,re,wor

利用Python爬取豆瓣电影

目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com/tag/#/?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD,%E9%BB%91%E5%B8%AE 有3个字段是非常重要的: 1.sort=T 2.range=0,10 3.tag

Python 爬取周杰伦instagram

Python 爬取周杰伦instagram 整体框架 使用国内能访问的某国外 app angine 爬取Jay的 Instagram 并显示,再使用国内的 sae 访问这个网站,再爬取一次并发送到微博小号. bs4 使用requests爬取 Instagram 时候,并没有加request header,Instagram 对 robot 还算友好,直接返回不带 js 的网页信息.通过bs4迅速定位到照片.视频信息,再用正则表达式提取到链接并下载.显示. from bs4 import Beau

通过python 爬取网址url 自动提交百度

通过python 爬取网址url 自动提交百度 昨天同事说,可以手动提交百度这样索引量会上去. 然后想了下.是不是应该弄一个py 然后自动提交呢?想了下.还是弄一个把 python 代码如下: import os import re import shutil REJECT_FILETYPE = 'rar,7z,css,js,jpg,jpeg,gif,bmp,png,swf,exe' #定义爬虫过程中不下载的文件类型 def getinfo(webaddress): #'#通过用户输入的网址连接

python爬取免费优质IP归属地查询接口

python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就ok了嘛~但是,网上免费接口要么限制访问频率(淘宝的),要么限制访问次数(百度及其他) 没辙了,从百度找到了几个在线查询的接口,要么不够准确(或者说她们的数据库太旧了),要么就是速度太慢了,跟限制访问似的(没办法,小规模人家的服务器的确不够好) 于是乎就想到了百度首页的ip接口,就这货: 为了防止泄露

使用python爬取csdn博客访问量

最近学习了python和爬虫,想写一个程序练练手,所以我就想到了大家都比较关心的自己的博客访问量,使用python来获取自己博客的访问量,这也是后边我将要进行的项目的一部分,后边我会对博客的访问量进行分析,以折线图和饼图等可视化的方式展示自己博客被访问的情况,使自己能更加清楚自己的哪些博客更受关注,博客专家请勿喷,因为我不是专家,我听他们说专家本身就有这个功能. 一.网址分析 进入自己的博客页面,网址为:http://blog.csdn.net/xingjiarong 网址还是非常清晰的就是cs

python爬取某个网站的图片并保存到本地

python爬取某个网站的图片并保存到本地 #coding:utf-8 import urllib import re import sys reload(sys) sys.setdefaultencoding('gb2312') #获取整个页面的数据 def getHtml (url): page = urllib.urlopen(url) html = page.read() return html #保存图片到本地 def getImg(html): reg = r'src="(.+?\.