俄罗斯的怪物猎人p2g爬虫的头爬虫号称世界最强,来看看它到底有多牛

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
标签:至少1个,最多5个
我一直觉得,爬虫是许多web开发人员难以回避的点。我们也应该或多或少的去接触这方面,因为可以从爬虫中学习到web开发中应当掌握的一些基本知识。而且,它还很有趣。
我是一个知乎轻微重度用户,之前写了一只爬虫帮我爬取并分析它的数据,我感觉这个过程还是挺有意思,因为这是一个不断给自己创造问题又去解决问题的过程。其中遇到了一些点,今天总结一下跟大家分享分享。
它都爬了什么?
先简单介绍下我的爬虫。它能够定时抓取一个问题的关注量、浏览量、回答数,以便于我将这些数据绘成图表展现它的热点趋势。为了不让我错过一些热门事件,它还会定时去获取我关注话题下的热门问答,并推送到我的邮箱。
作为一个前端开发人员,我必须为这个爬虫系统做一个界面,能让我登陆知乎帐号,添加关注的题目、话题,看到可视化的数据。所以这只爬虫还有登陆知乎、搜索题目的功能。
然后来看下界面。
下面正儿八经讲它的开发历程。
Python得益于其简单快捷的语法、以及丰富的爬虫库,一直是爬虫开发人员的首选。可惜我不熟。当然最重要的是,作为一名前端开发人员,node能满足爬虫需求的话,自然更是首选。而且随着node的发展,也有许多好用的爬虫库,甚至有这样直接能模拟Chrome访问网页的工具的推出,node在爬虫方面应该是妥妥能满足我所有的爬虫需求了。
于是我选择从零搭建一个基于koa2的服务端。为什么不直接选择egg,express,thinkjs这些更加全面的框架呢?因为我爱折腾嘛。而且这也是一个学习的过程。如果以前不了解node,又对搭建node服务端有兴趣,可以看我之前的一篇文章-。
爬虫方面我选择了+。虽然知乎有很多地方用到了react,但得益于它绝大部分页面还是服务端渲染,所以只要能请求网页与接口(request),解析页面(cherrio)即可满足我的爬虫需求。
其他不一一举例了,我列个技术栈
做node server框架;
做爬虫服务;
做数据存储;
做任务调度;
做邮件推送。
前端框架;
Material Design UI库;
技术选型妥善后,我们就要关心业务了。首要任务就是真正的爬取到页面。
如何能爬取网站的数据?
知乎并没有对外开放接口能让用户获取数据,所以想获取数据,就得自己去爬取网页信息。我们知道即使是网页,它本质上也是个GET请求的接口,我们只要在服务端去请求对应网页的地址(客户端请求会跨域),再把html结构解析下,获取想要的数据即可。
那为什么我要搞一个登陆呢?因为非登陆帐号获取信息,知乎只会展现有限的数据,而且也无法得知自己知乎帐户关注的话题、问题等信息。而且若是想自己的系统也给其他朋友使用,也必须搞一个帐户系统。
大家都会用Chrome等现代浏览器看请求信息,我们在知乎的登录页进行登陆,然后查看捕获接口信息就能知道,登陆无非就是向一个登陆api发送账户、密码等信息,如果成功。服务端会向客户端设置一个cookie,这个cookie即是登陆凭证。
所以我们的思路也是如此,通过爬虫服务端去请求接口,带上我们的帐号密码信息,成功后再将返回的cookie存到我们的系统数据库,以后再去爬取其他页面时,带上此cookie即可。
当然,等我们真正尝试时,会受到更多挫折,因为会遇到token、验证码等问题。不过,由于我们有客户端了,可以将验证码的识别交给真正的人,而不是服务端去解析图片字符,这降低了我们实现登陆的难度。
一波三折的是,即使你把正确验证码提交了,还是会提示验证码错误。如果我们自己做过验证码提交的系统就能够迅速的定位原因。如果没做过,我们再次查看登陆时涉及的请求与响应,我们也能猜到:
在客户端获取验证码时,知乎服务端还会往客户端设置一个新cookie,提交登陆请求时,必须把验证码与此cookie一同提交,来验证此次提交的验证码确实是当时给予用户的验证码。
语言描述有些绕,我以图的形式来表达一个登陆请求的完整流程。
注:我编写爬虫时,知乎还部分采取图片字符验证码,现已全部改为“点击倒立文字”的形式。这样会加大提交正确验证码的难度,但也并非无计可施。获取图片后,由人工识别并点击倒立文字,将点击的坐标提交到登陆接口即可。当然有兴趣有能力的同学也可以自己编写算法识别验证码。
上一步中,我们已经获取到了登陆后的凭证cookie。用户登陆成功后,我们把登陆的帐户信息与其凭证cookie存到mongo中。以后此用户发起的爬取需求,包括对其跟踪问题的数据爬取都根据此cookie爬取。
当然cookie是有时间期限的,所以当我们存cookie时,应该把过期时间也记录下来,当后面再获取此cookie时,多加一步过期校验,若过期了则返回过期提醒。
爬虫的基础搞定后,就可以真正去获取想要的数据了。我的需求是想知道某个知乎问题的热点趋势。先用浏览器去看看一个问题页面下都有哪些数据,可以被我爬取分析。举个例子,比如这个问题:。
打开链接后,页面上最直接展现出来的有关注者,被浏览,1xxxx个回答,还要默认展示的几个高赞回答及其点赞评论数量。右键查看网站源代码,确认这些数据是服务端渲染出来的,我们就可以通过request请求网页,再通过cherrio,使用css选择器定位到数据节点,获取并存储下来。代码示例如下:
async getData (cookie, qid) {
const options = {
url: `${zhihuRoot}/question/${qid}`,
method: 'GET',
headers: {
'Cookie': cookie,
'Accept-Encoding': 'deflate, sdch, br' // 不允许gzip,开启gzip会开启知乎客户端渲染,导致无法爬取
const rs = await this.request(options)
if (rs.error) {
return this.failRequest(rs)
const $ = cheerio.load(rs)
const NumberBoard = $('.NumberBoard-item .NumberBoard-value')
const $title = $('.QuestionHeader-title')
$title.find('button').remove()
success: true,
title: $title.text(),
followers: Number($(NumberBoard[0]).text()),
readers: Number($(NumberBoard[1]).text()),
answers: Number($('h4.List-headerText span').text().replace(' 个回答', ''))
这样我们就爬取了一个问题的数据,只要我们能够按一定时间间隔不断去执行此方法获取数据,最终我们就能绘制出一个题目的数据曲线,分析起热点趋势。
那么问题来了,如何去做这个定时任务呢?
我使用了做任务调度。如果之前做过定时任务的同学,可能对其类似cron的语法比较熟悉,不熟悉也没关系,它提供了not-cron-like的,更加直观的设置去配置任务,看下文档就能大致了解。
当然这个定时任务不是简单的不断去执行上述的爬取方法getData。因为这个爬虫系统不仅是一个用户,一个用户不仅只跟踪了一个问题。
所以我们此处的完整任务应该是遍历系统的每个cookie未过期用户,再遍历每个用户的跟踪问题,再去获取这些问题的数据。
系统还有另外两个定时任务,一个是定时爬取用户关注话题的热门回答,另一个是推送这个话题热门回答给相应的用户。这两个任务跟上述任务大致流程一样,就不细讲了。
但是在我们做定时任务时会有个细节问题,就是如何去控制爬取时的并发问题。具体举例来说:如果爬虫请求并发太高,知乎可能是会限制此IP的访问的,所以我们需要让爬虫请求一个一个的,或者若干个若干个的进行。
简单思考下,我们会采取循环await。我不假思索的写下了如下代码:
// 爬虫方法
async function getQuestionData () {
// do spider action
// questions为获取到的关注问答
questions.forEach(await getQuestionData)
然而执行之后,我们会发现这样其实还是并发执行的,为什么呢?其实仔细想下就明白了。forEach只是循环的语法糖,如果没有这个方法,让你来实现它,你会怎么写呢?你大概也写的出来:
Array.prototype.forEach = function (callback) {
for (let i = 0; i & this. i++) {
callback(this[i], i, this)
虽然forEach本身会更复杂点,但大致就是这样吧。这时候我们把一个异步方法作为参数callback传递进去,然后循环执行它,这个执行依旧是并发执行,并非是同步的。
所以我们如果想实现真正的同步请求,还是需要用for循环去执行,如下:
async function getQuestionData () {
// do spider action
for (let i = 0; i & questions. i++) {
await getQuestionData()
除了for循环,还可以通过for-of,如果对这方面感兴趣,可以去多了解下数组遍历的几个方法,顺便研究下ES6的迭代器Iterator。
其实如果业务量大,即使这样做也是不够的。还需要更加细分任务颗粒度,甚至要加代理IP来分散请求。
合理搭建服务端
下面说的点跟爬虫本身没有太大关系了,属于服务端架构的一些分享,如果只关心爬虫本身的话,可以不用再往下阅读了。
我们把爬虫功能都写的差不多了,后面只要编写相应的路由,能让前端访问到数据就好了。但是编写一个没那么差劲的服务端,还是需要我们深思熟虑的。
我看过一些前端同学写的node服务,经常就会把系统所有的接口(router action)都写到一个文件中,好一点的会根据模块分几个对于文件。
但是如果我们接触过其他成熟的后端框架、或者大学学过一些J2EE等知识,就会本能意识的进行一些分层:
model 数据层。负责数据持久化,通俗说就是连接数据库,对应数据库表的实体数据模型;
service 业务逻辑层。顾名思义,就是负责实现各种业务逻辑。
controller 控制器。调取业务逻辑服务,实现数据传递,返回客户端视图或数据。
当然也有些框架或者人会将业务逻辑service实现在controller中,亦或者是model层中。我个人认为一个稍微复杂的项目,应该是单独抽离出抽象的业务逻辑的。
比如在我这个爬虫系统中,我将数据库的添删改查操作按model层对应抽离出service,另外再将爬取页面的服务、邮件推送的服务、用户鉴权的服务抽离到对应的service。
最终我们的api能够设计的更加易读,整个系统也更加易拓展。
分层在koa上的实践
如果是直接使用一个成熟的后端框架,分层这事我们是不用多想的。node这样的框架也有,我之前介绍的我厂开源的采用的,也帮我们做好了合理的分层。
但是如果自己基于koa从零搭建一个服务端,在这方面上就会遇到一些挫折。koa本身逻辑非常简单,就是调取一系列中间件(就是一个个function),来处理请求。官方自己提供的,即是帮助我们识别请求路径,然后加载对应的接口方法。
我们为了区分业务模块,会把一些接口方法写在同一个controller中,比如我的负责处理问题相关的接口;负责处理话题相关的接口。
那么我们可能会这样编写路由文件:
const Router = require('koa-router')
const router = new Router()
const question = require('./controller/question')
const topic = require('./controller/topic')
router.post('/api/question', question.create)
router.get('/api/question', question.get)
router.get('/api/topic', topic.get)
router.post('/api/topic/follow', topic.follow)
module.exports = router
我的question文件可能是这样写的:
class Question {
async get () {
// return data
async create () {
// create question and return data
module.exports = new Question()
那么问题就来了
单纯这样写是没有办法真正的以面向对象的形式来编写controller的。为什么呢?
因为我们将question对象的属性方法作为中间件传递到了koa-router中,然后由koa底层来合并这些中间件方法,作为参数传递到http.createServer方法中,最终由node底层监听请求时调用。那这个this到底会是谁,不进行调试,或者查看koa与node源代码,是无从得知的。但是无论如何方法调用者肯定不是这个对象自身了(实际上它会是undefined)。
也就是说,我们不能通过this来获取对象自身的属性或方法。
那怎么办呢?有的同学可能会选择将自身一些公共方法,直接写在class外部,或者写在某个utils文件中,然后在接口方法中使用。比如这样:
const error = require('utils/error')
const success = (ctx, data) =& {
ctx.body = {
success: true,
data: data
class Question {
async get () {
success(data)
async create () {
error(result)
module.exports = new Question()
这样确实ok,但是又会有新的问题---这些方法就不是对象自己的属性,也就没办法被子类继承了。
为什么需要继承呢?因为有时候我们希望一些不同的controller有着公共的方法或属性,举个例子:我希望我所有的成功or失败都是这样的格式:
success: false,
message: '对应的错误消息'
success: true,
data: '对应的数据'
按照koa的核心思想,这个通用的格式转化,应该是专门编写一个中间件,在路由中间件之后(即执行完controller里的方法之后)去做专门处理并response。
然而这样会导致每有一个公共方法,就必须要加一个中间件。而且controller本身已经失去了对这些方法的控制权。这个中间件是执行自身还是直接next()将会非常难判断。
如果是抽离成utils方法再引用,也不是不可以,就是方法多的话,声明引用稍微麻烦些,而且没有抽象类的意义。
更理想的状态应该是如刚才所说的,大家都继承一个抽象的父类,然后去调用父类的公共相应方法即可,如:
class AbstractController {
success (ctx, data) {
ctx.body = {
success: true,
data: data
error (ctx, error) {
ctx.body = {
success: false,
msg: error
class Question extends AbstractController {
async get (ctx) {
const data = await getData(ctx.params.id)
return super.success(ctx, data)
这样就方便多了,不过如果写过koa的人可能会有这样的烦恼,一个上下文ctx总是要作为参数传递来传递去。比如上述控制器的所有中间件方法都得传ctx参数,调用父类方法时,又要传它,还会使得方法损失一些可读性。
所以总结一下,我们有如下问题:
controller中的方法无法调用自身的其他方法、属性;
调用父类方法时,需要传递上下文参数ctx。
其实解决的办法很简单,我们只要想办法让controller方法中的this指向实例化对象自身,再把ctx挂在到这个this上即可。
怎么做呢?我们只要再封装一下koa-router就好了,如下所示:
const Router = require('koa-router')
const router = new Router()
const question = require('./controller/question')
const topic = require('./controller/topic')
const routerMap = [
['post', '/api/question', question, 'create'],
['get', '/api/question', question, 'get'],
['get', '/api/topic', topic, 'get'],
['post', '/api/topic/follow', topic, 'follow']
routerMap.map(route =& {
const [ method, path, controller, action ] = route
router[method](path, async (ctx, next) =&
controller[action].bind(Object.assign(controller, { ctx }))(ctx, next)
module.exports = router
大意就是在路由传递controller方法时,将controller自身与ctx合并,通过bind指定该方法的this。这样我们就能通过this获取方法所属controller对象的其他方法。此外子类方法与父类方法也能通过this.ctx来获取上下文对象ctx。
但是bind之前我们其实应该考虑以下,其他中间件以及koa本身会不会也干了类似的事,修改了this的值。如何判断呢,两个办法:
调试。在我们未bind之前,在中间件方法中打印一下this,是undefined的话自然就没被绑定。
看koa-router/koa/node的源代码。
事实是,自然是没有的。那我们就放心的bind吧。
上述大概就是编写这个小工具时,遇到的一些点,感觉可以总结的。也并没有什么技术难点,不过可以借此学习学习一些相关的知识,包括网站安全、爬与反爬、、koa底层原理等等。
这个工具本身非常的个人色彩,不一定满足大家的需要。而且它在半年前就写好了,只不过最近被我挖坟拿出来总结。而且就在我即将写完文章时,我发现知乎提示我的账号不安全了。我估计是以为同一IP同一账户发起过多的网络请求,我这台服务器IP已经被认为是不安全的IP了,在这上面登录的账户都会被提示不安全。所以我不建议大家将其直接拿来使用。
当然,如果还是对其感兴趣,本地测试下或者学习使用,还是没什么大问题的。或者还有更深的兴趣的话,可以自己尝试去绕开知乎的安全策略。
最后的最后附上
--转载请先经过本人授权。
7 收藏&&|&&79
你可能感兴趣的文章
5 收藏,370
23 收藏,1.1k
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
我是聚合怪
我是聚合怪
我是香炉怪
我是香炉怪
模拟登录,https你怎么搞?
模拟登录,https你怎么搞?
@榕树下_ 不用怎么搞,跟http一样去请求就好了
@榕树下_ 不用怎么搞,跟http一样去请求就好了
@相学长 thanks
@相学长 thanks
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。4,258被浏览1,892,063分享邀请回答2.4K204 条评论分享收藏感谢收起42952 条评论分享收藏感谢收起不是吹的 战斗民族俄罗斯有哪些超牛军车?
我的图书馆
不是吹的 战斗民族俄罗斯有哪些超牛军车?
说到俄罗斯你会想到什么?冻死个人的西伯利亚?一天不喝伏特加就难受的毛熊?口径即是正义的强大军工?简单粗暴的暴力美学直接概括了俄国造的特性。战斗民族果然名不虚传,那么战斗民族有哪些超牛的军车呢?俄GAZ-2975“虎”式装甲越野车俄罗斯的武器装备一直是克制美军而生产的,其特点是操作简单,稳定性强,针对性好。是一种全传动汽车,在一些性能上,优于美军“悍马”越野车。主要装备于特种部队。GAZ-米,宽2.2米,高2米,离地距离0.4米,最大转弯半径8.9米,4×4轮式,扭杆外挂,可自动调节轮胎内的压力,采用美国B-180型6缸涡轮柴油发动机,运载能力1500千克。机动性能突出,不仅能在普通路面上高速行驶,还可在各种野外地形疾驰,平均速度120-140公里/小时,座位2-10人,采用液压助力器式操纵盘。“虎”式装甲越野车机动性能超强,虎式装甲汽车可有效抵御轻武器和爆炸装置的攻击,俄制虎式装甲汽车车舱内可容纳9人,装甲型的“虎”式吉普车能够经受得住反步兵地雷的爆炸冲力。“虎”式越野吉普车全重为公斤(装甲加强型),最大载重1500公斤,十分强悍。俄军虎式装甲车参加08年卫国战争胜利日阅兵式。 北京奥运期间,也担任了安保工作。虎式装甲汽车有两种型号:一种是警用型,一种是加厚装甲型。SPM-2 GAZ-233036型“虎”式警用特种装甲汽车由俄罗斯军事工业公司下属的阿尔扎马斯机器制造厂生产(高尔基车辆制造厂下属的子公司),既可用于在反恐行动中运送特警,也可执行国土防御任务和协助边防部队执勤。“虎”式装甲汽车的车体由厚度为5毫米、经过热处理的防弹装甲板制成,可有效抵御轻武器和爆炸装置的攻击。其车体两侧开有射击孔,可用于进行对外观测和射击,另外,车顶部也设置了两个舱盖。车舱内可容纳9人,根据不同的需要,还可安装无线电台和遥控爆炸装置阻断设备。该车装备一台功率为205马力的涡轮增压柴油发动机、机械式六级传动箱和轮胎压力自动调节系统。“虎”式警车在俄罗斯被广泛用于反恐行动,执行的任务包括运送特警、国土防御,以及协助边防部队执勤等。“嘎斯”GAS-2975 俄罗斯悍马这款车也被称为“俄罗斯悍马”,这是一种高机动多用途车,填补了俄罗斯军车上的重要空白。嘎斯2975可以穿越河流,涉水深度达1.2米,充沛的扭矩也能让它爬上柔软的沙丘爬与大部分俄罗斯军队正在服役的车辆相比,老虎看起来更加的具有现代化设计。“嘎斯”-2975“虎”式越野吉普车的动力方面也十分给力。其安装有一台美国康明斯涡轮增压柴油发动机,排量5.9升,最大180马力,扭矩650Nm。而“悍马”的功率为195马力,扭矩583Nm。嘎斯46两栖4X4 小船随处飘在东欧国家作战,你要面对各种复杂的路面状况。湖泊、河流、小溪以及其它水体错综复杂。这时就是嘎斯46上场的时间。它能够快速的穿越各种复杂路况,眼前是伏尔加河?没问题!直接开下去就是了。这种小型两栖车作为一种运输特种部队过河工具,能够进行快速反应,同时还能应付导弹袭击的侦察工作。BRDM-2 4X4还是8X8?BRDM-2的车体采用全焊接钢装甲结构,可防轻武器射击和炮弹破片。BRDM-2的最大特点是前后两个车轮之间有4个辅助车飞车轮。这4个辅助车轮由驾驶员在车内操纵其升降,其动力经分动箱由链传动传递。这样一来,当辅助车轮降下时,由于自它也能传递动力,也应当算是驱动轮,这时理应算是8X8驱动型式。不过,辅助车轮只是在最困难的地段或越壕沟时才使用,而且规定辅助车轮降下时只能用1档行驶。习惯上仍然称BRDM-2为4X4驱动的轻型装甲车。但是不得不感叹毛子的想象力啊,4X4变8X8,果然对于毛子来说,口径和车轮数才是正义。MAZ 537 赤色机械怪物红色帝国暴力美学的经典之一,有“红军铁骑”之称的前苏联/俄国MAZ-537重型牵引车。 MAZ-537自上世纪60年代便开创了8轮全驱动军用越野车的风气,时至今日仍在服役中,可谓宝刀不老。MAZ-537的道路不局限在公路上,在广袤的西伯利亚冰原到贝加尔湖畔,或水或冰,有路或者没路,都不妨碍MAZ-537的行进。可以携带坦克,导弹发射井,侦察机......一辆T-90S主战坦克跟在它的后面,想打它?掂量下自己吧。UAZ-469 北汽212的前身UAZ-469吉普车.是北京212的样板车,外型多少有点不一,但基本数据同一级别,血缘关系基本一样。世界很多军队是该车的用户,就象军火AK系列一样,世界70多个国家用做军亊用途与民用,总产量超过200万辆。现在仍在生产,供给买不起好车的国家,也称为大众用得起的越野车。时至今日,作为其继任者的UAZ-3151也同样服务于红色苏联的主体继任者俄罗斯。虽然UAZ-469无论是外观还是底盘结构都已经和现在的SUV格格不入。但是其210毫米的离地间隙以及强大的越野性能配置却依旧可以收获爱好者的拥趸。更何况,这种四十多年来都没有经过变化过的复古外观更多的体现出了其复古浪漫的一面。MAZ-7907 轮子即是正义明斯克MAZ-型是7900系列中车轮最多、最有特点、也是最为夸张的型号。它和7906型的设计初衷一样,都是作为当时研发中的“Tselina-2”洲际导弹的运输发射车使用。它没有汽车必备的机械变速箱传动机构,而是直接使用大功率电动机传动——你可以把这台车看作是一座小型的移动燃气轮机热电厂,它通过一台航空燃气轮机带动一台大功率交流发电机发电,然后将电力传导给安装在24个车轮轮轴上的 24台轮毂电机,以这种独特方式使自己前进。它这24个轮子中,有16个方向可控,由双向液压转向系统负责转向。它自重6.5吨,核载150吨,设计战斗总重200吨,拥有一定的越野机动能力,可以通过一般泥泞的土路,满载最快时速25km/h。卡马斯军车为了应付恶劣的作战环境,军方在车的设计中采用了大量特有的设计方法,无需任何改造,这些车辆就可以在温度为-45℃~+50℃、+25℃时相对湿度为98%、海拔4500米以上的区域履行作战任务。
馆藏&24261
TA的最新馆藏
喜欢该文的人也喜欢活剥章鱼怪吊打爬虫大Boss!金刚男友力Max_网易娱乐
活剥章鱼怪吊打爬虫大Boss!金刚男友力Max
用微信扫码二维码
分享至好友和朋友圈
南方都市报3月27日报道&  金刚档案身高:100多英尺(超过30米),超过10层楼高性别:直男必杀技:远距离高空弹跳、花式打飞机、手撕尖牙利嘴等性情:易怒、忧郁,喜好金发美女上周五,深圳益田假日广场中庭有一大波人流驻足,有什么大搞作?原来是全宇宙最强的“金刚”驾到!围观群众不仅把这只巨型“怪物”围得水泄不通,部分粉丝还大胆上前与之亲密“接触”,场面可谓热闹非凡噢!真的金刚当然还留在骷髅岛打怪和守护万民,至于深圳商场内的,是一幅贴在垂直电梯的巨型金刚,因为效果太逼真,所以引发市民的热烈围观。在快要过去的3月,电影市场俨然掀起一股强烈“野兽派”风潮,从金刚狼迟暮,到美女野兽之恋,票房和口碑一路高歌猛进,最终在《金刚:骷髅岛》达到高潮:该片上映首日就斩获1.55亿票房,首个周末就妥妥地过4 。5亿(截至26日傍晚6点),势头直奔10亿而去!戏里惊险刺激的高能打斗场面获得了近乎一致的好评,也有影迷反映,观影期间会出现以下肾上腺素激增的身体反应:不自觉地掩面遮眼、脊背发凉和头皮发麻,从椅背跳起、尖叫惊呼;又或者突然少女心炸裂、眼神做花痴状……《金刚:骷髅岛》的动作特效场面有多刺激好看,你的身体都诚实地一一告诉你了!小试牛刀  金刚花式打(真的)飞机总片长两小时的《金刚:骷髅岛》,在开篇30分钟就迅速地放出第一个大招——— 金刚360度无死角暴打飞机。前一秒,美军和科学家组成的直升机战队还有模有样地派兵列阵,下一秒,大山一般的金刚长臂一挥,他们就被扫荡得溃不成军……钢铁炼造的坚硬直升机,在金刚眼中不过是玩具,而火力十足的炮弹,也不过是挠痒痒的三脚猫功夫。于是,金刚挥臂一个狂甩,抬脚一个狠踩,左右手再各自生擒,来个“一拍两散”!火力强劲的直升机被金刚拍得七零八落。而坐在驾驶舱的飞行员们,他们甚至都还没能将金刚从头到脚看清,就一脸懵逼地任人鱼肉。甚至有队员从高空自由落体,本以为逃离了魔掌,哪知下一秒就被金刚活吞入肚。这段戏基本以探险队员的视角呈现,一时间天旋地转,看得人头晕眼花。看来,金刚不仅突袭了探险队,也突袭了银幕前的观众!这不,大伙座椅都还未完全坐热,就被打戏一激灵、看得舍不得眨眼!暴力进阶  手撕并生吞巨型章鱼怪当你以为最先出场的金刚已够惊悚,但在骷髅岛这片原始丛林中,真正可怕的是各类丑陋恐怖的史前巨兽。而吊打这些怪物,自然也成为了金刚最主要的日常活动。沼泽巨鱿章是只身形不输金刚的怪(pao)物(hui),堪称全片除人类外最作死生物。导演为它的出场也费尽心思。先是祭出大水牛“孤礁牛魔”,这一素食巨兽是全片少有的友好动物,在它庞大身躯的背脊上布满苔藓,潜在水中仿佛是湖泊里的小岛。故事发展至此,算是有惊无险。再有队员到河边洗脸,而按照套路,血腥味早该引来无数猛兽,不远处的水面翻起一阵波浪……然而故事再一次有惊无险。当观众体验了几次虚惊之后,大招来了!只见金刚来到小河,将紧绷的身子骤然松弛下来冲洗伤口,巨型章鱼就如幽灵般现身了!它用触须将金刚五花大绑至动弹不得,但很可惜帅不过三秒,就迅速被金刚一个伸展运动、不管三七二十一地生吞活剥了!最后凭一记直击心脏的重拳,黑色的粘稠墨汁喷出,怪兽也随之殒命,直接被金刚带回家里加菜了。火力全开  吊打大Boss骷髅爬虫骷髅爬虫是什么?它们是骷髅岛地下的霸主,阴险毒辣,残暴无良。它们曾把金刚全家灭门,是金刚的世仇。在和终极大boss对战前,导演又安排了两场铺垫戏,来说明骷髅爬虫的恐怖。第一场是金刚大战两只幼年骷髅爬虫。两方的对战模式基本是:骷髅爬虫张大嘴,逮到机会就把牙齿一合、用力咬下;金刚尽管前后受敌,照样能凭借强大的肱二头肌撕开敌人的尖牙利嘴!第二场是落单大兵被身后的骷髅爬虫一秒生吞!
最后一场,金刚和巨型骷髅爬虫单挑,太!刺!激!此时的金刚,可谓集“杰克苏”于一身:被大火烧伤、被铁链捆绑、被人类猪队友坑害……但尽管如此,它还是顽强且灵活地虐杀怪物,一百招不重样!导演也用了非常多的大特写,把怪物的恶心狰狞和金刚的战斗力,还有两者你死我活直接地奉献给观众,什么大石碎兽脑、扒皮抽心啊,简直把暴力美学和各种奇思妙想发挥到极致!更多怪物长腿母怪———基本上可视为毒性加强的放大版蜘蛛精。因为长腿和竹子相似,考察队员一开始甚至不知道发生了什么,就被它一脚叉死了!惊魂秃鹫———会发出奇怪的叫声,见到活物就叼走。影片中一位队友被叼走后,就直接在高空中被残忍肢解了。南都记者 刘平安
本文来源:南方都市报
责任编辑:高庆悦_NK3443
用微信扫码二维码
分享至好友和朋友圈
加载更多新闻
热门产品:   
:        
:         
热门影院:
阅读下一篇
用微信扫描二维码
分享至好友和朋友圈}

我要回帖

更多关于 俄罗斯地狱之门的怪物 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信