js抓取网页内容(《火星异种》图片加载很慢的连接地址(上))

优采云 发布时间: 2022-02-17 07:26

  js抓取网页内容(《火星异种》图片加载很慢的连接地址(上))

  2020-09-28 434次浏览原版Node.js/Python爬网*敏*感*词*

  关键词:

  学习有勤奋,萤火虫窗内藏书万卷。本文章主要介绍Node.js/Python爬网*敏*感*词*相关知识,希望对大家有所帮助。

  一个星期天晚上偶然发现*敏*感*词*“火星外星人”并在网上观看。在观看过程中,图片加载很慢,有时不小心点击了广告,大大拖慢了我的观看进度。后来想着能不能把所有的*敏*感*词*都抓到本地再看。

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

  1. 静态资源捕获(代码地址:Node.js、Python)

  分析阶段:

  1. 打开《火星异种》*敏*感*词*首页,发现“”的编号是“47”。把数字“47”改成“48”后发现是《吞噬世界》*敏*感*词*的首页,所以我们知道这个数字是用于Logo不同*敏*感*词*的

  2. 随机进入第48集和第86集,发现连接分别是“”和“”,所以我们知道每集的连接地址(注:其实001集的地址是“”,但是因为当时看过40多字,代码没有对这块做特殊处理)

  3. 随机输入50个字,随机查看不同页面的url,发现url是“*.html”的形式,其中*对应当前页码

  4.查看每一页的*敏*感*词*图片元素来查找,

  元素的id = "mhpic",这样就可以轻松获取*敏*感*词*图片的地址

  5. 最后只需要向*敏*感*词*图片所在的地址发送请求,将图片数据保存在本地即可。

  预防措施:

  1. 需要记录当前已经捕获了哪些单词,也就是记录当前捕获的状态。当要爬取的内容很长,无法一次爬取时,需要保存上一次爬取的断点,同时还要避免每次出错后从头开始爬取在爬取过程中发生。

  2. 爬取前最好检查修改后的文件是否存在,不存在才发送请求。这样当程序出现bug,爬取的页面不完整时,就不需要重复爬取已有的图片了。

  3. 增加重试机制,在一定时间内访问同一个站点次数过多,可能会出现拒绝服务等错误。调整访问频率,每次出错后重试。

  奖金:

  查看网页源码时发现,当前页面除了加载当前页面的*敏*感*词*图片资源外,还会加载下一章的图片资源,并隐藏在当前页面。这样,在查看下一页时,可以直接从缓存中读取数据。

  2. 动态资源捕获(代码地址:Node.js)

  分析阶段:

  1. 打开《海贼王》*敏*感*词*首页,随机打开第857、858章,地址分别为“”和“”。发现虽然URL是连续的,但与当前字数不对应。打开第一章,发现地址是“”,所以我猜测可能是中间的一些url无效,需要在代码中做容错(无论如何都做容错比较好)。

  2. 随便翻开857字,发现*敏*感*词*图片是随着向下滚动动态加载的。查看网页源码发现,*敏*感*词*图片没有加载的地方是地址为“”的图片所占据的地方。因此,不可能简单地通过单个请求获取*敏*感*词*图片地址。Node需要使用PhantomJSPhantomJS等工具来模拟浏览器访问,通过代码模拟用户交互,最终获取数据

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

  预防措施:

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

  Python与Node对比体验

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

  虽然 Node 的异步写法在这种场景下很不方便,但也正是因为异步的关系,一个进程可以一次抓拍几个不同的*敏*感*词*,达到多线程的效果。

  至此,这篇关于Node.js/Python爬网*敏*感*词*的文章就写完了。如果您的问题无法解决,请参考以下文章:

  相关文章

  大爬虫作品~以爬虫hao123*敏*感*词*为例

  #私人项目实践分享#Python爬虫实战,请求模块,Python实现爬取网站卡通

  scrapy爬行斗罗大陆*敏*感*词*

  基于Python的ComicReaper*敏*感*词*自动爬取脚本

  C#编写爬取*敏*感*词*的小程序

  无休止的爬行:用蟒蛇爬行*敏*感*词*岛,我又被惩罚了!!

  蟒蛇 | 图片转pdf

  Python*敏*感*词*爬虫:B站!热血*敏*感*词*太美了!用Python爬取热门海岛*敏*感*词*大片,内存爆棚,爬虫太牛了!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线