导语:美国专栏作家斯蒂芬·斯宾塞分享了如何从现有的数据中挖掘黑马词的经验。你如果已经完成了关键词的挖掘,并且制定出了关键词策略,你认为工作到此就结束了吗?远远不够。你确定没有错过任何高质量的关键词?我这有几个技巧帮助你利用现有数据和工具挖掘黑马词。

SEO|如何从现有数据中挖掘黑马词

Keyword 关键字

SEO优化最关键的步骤之一,就是精准选择关键词。

有许多工具可以帮助你挖掘关键字,比如Google AdWords Keyword Planner, Searchmetrics, SEMrush, Keyword Discovery, WordStream等工具。(译者:国内有百度凤巢、站长工具、金花站长工具等。如果你需要了解更多关于SEO关键词挖掘相关的文章,请点击微信号的菜单查看。)开发站内搜索词

这是网络营销人员做关键词研究与策略时会忽略的主要领域之一。如果你的网站有一个搜索功能,请导出这些数据,从中找到可能被我们忽视的关键词。

当一个用户在你的网站上搜索时,他们会告诉你几件事:

①我觉得这个项目或是信息肯定在这个网站上的某个地方,但是我不知道具体在哪里。②我不知道你的网站上有没有这样的项目或信息,但我希望你有。③我知道这个项目或信息在你的网站上,但是通过你的网站搜索引擎比通过导航找到它们要更快。

在搜索那些确实存在于你的网站上的产品或信息的情况下,大量的搜索可能是提醒你将这些项目变得更容易被找到,或是将你的导航变得更加直观。

然而你可能会发现,用户很可能用你以前从来都没有考虑过的关键词来搜索你的产品。从本质上来讲,这是用户在告诉你,他们的搜索习惯是什么。

如果有相当多的人在你的网站上搜索一些特定的关键词,同时这些关键词也能带来转化,那么你一定要确保这些关键词已经包含在跟踪系统和优化策略中。

你可以优化这些关键词现有的着陆页,或是为这些关键词创建新的着陆页,当排名上升后就可以将用户从搜索引擎结果页直接指引到关键词着陆页上。你不仅可以获得更多的流量,而且用户通过搜索引擎找到想要的产品比通过导航寻找所需的时间更短。

你可以用GA(谷歌分析工具)跟踪用户的搜索行为,你只需要在GA进行设置,并且给URL进行打码即可实现,跟踪的参数和资源包括:

①?keyword= 跟踪关键词字符串②search? 搜索参数字符串③?query= 查询参数字符串④searchpage.jsp? 搜索页面参数字符串⑤search/?text= 搜索文本字符串

你可以对上面任意参数进行组合使用,只要确保这组参数不会和GA其他跟踪参数重复即可。

从这里开始,你就可以很便捷的在GA中查看数据报告,并且可以运用过滤器来筛选结果,其中包括识别搜索页面的字符串。

SEO|如何从现有数据中挖掘黑马词

GA筛选出所有页面的报告

在下面的例子中,关键词已经被隐藏,第4行的关键词可能会给网站带来不错的价值。当关键词被足够多的用户搜索时,很可能会为网站带来销售转化。

SEO|如何从现有数据中挖掘黑马词

谷歌分析筛选出所有的页面报告你应该优化网站以更好的突显产品,同时你也应该研究关键词,是否有新的关键词能带来新的流量。那些你所不知道关键字词才是真正机会

另一个不错的战术就是寻找那些你目前还没有追踪或定向的,但已经有排名的关键词。

我曾在过去的策略中写过怎样运用Searchmetrics挖掘那些“未被发现”的关键词,以便补充你的整个关键词体系和策略。去寻找那些未被发现的黑马词,并且创建友好型的页面内容,可以使关键词为网站带来更多流量。

我最近使用的另一个工具:AuthorityLabs的“Now Provided”功能,可以帮助我们挖掘关键词提升网站流量。

在搜索引擎跟踪、多平台跟踪、多域名跟踪的功能之外,这个工具还有一个快速而强大的功能:发现那些可以对你的网站造成巨大的影响的微小变化,同时也监测未优化却已经有排名的关键词。

这个报告中的数据是从谷歌分析和SEMrush中导出的,并且添加了AuthorityLabs中的数据,展现了有排名的着陆页和排名TOP50的关键词。

SEO|如何从现有数据中挖掘黑马词

AuthorityLabs的“Now Provided”报告-登陆页面

当你深入研究某个页面时,这个报告可以告诉你每个关键词,或者至少是排名TOP50关键词的预估流量。

在下面这个例子中,“新关键词”是指网站没有追踪或优化的关键词。事实上,这些词就算没有优化仍然可以在谷歌的排名第十一位。然而,如果在这个关键词的着陆页面中重点突出相关产品,可能会带来不错的销售转化。

SEO|如何从现有数据中挖掘黑马词

AuthorityLabs“Now Provided”报告-关键词排名的承接页

试想一下,如果他们对这个关键词稍微优化一下,比如增加关键词的密度、内部链接或者修改一下meta标签。这个词的排名可能会跃升至搜索结果页第2页的首位甚至是第1页。这会带来更多的自然流量。

这个工具还有一个强大的功能,就是可以以Excel CSV格式导出所有你正在挖掘的关键词数据。通过一个简单的数据查询,然后应用数据过滤器,你可以迅速地将有相同特质的关键词进行归类。

在为你展示着陆页、关键词、跳出率、排名位置、搜索量和PPC点击价格等数据的基础上,它也给出了关键词竞争力的评级(从0到1.0)和“关键词优化难度等级”。

AuthorityLabs基于各种因素计算出关键词优化难度等级。它可以快速排序,以此找到流量和价值最高的关键词。

SEO|如何从现有数据中挖掘黑马词

AuthorityLabs“Now Provided”的报告-CSV的导出

你可以根据这个报告找到关键词优化的机会从而带来自然流量,相比购买最昂贵的CPC而言,这种渠道的投资回报率更高。

“排名位置排序”是我分析这个报告最喜爱的方式之一。将搜索引擎结果页的位置2移动到位置1可以导致非常大的流量变化,可能会使流量翻番。你可以分析究竟有多少位置2的关键词能够有潜力上升到位置1。

另外一个机会可能是根据排名11,12或13位置的关键词,来过滤这个报告。如果这些关键词只排在第2页,可能只带来较少的流量,相比较而言,将其中一些关键词优化到第1页也许并不需要花很大的精力。而在搜索结果首页的关键词会得到更高的点击率。

这里有许多排序或筛选报告的方法,你可以在已关注的关键词中寻找机会,也可以分析出是什么因素提升了提升了流量,也许此前你并不知情。

顺便说一句,一个我从来没有在其他地方(甚至是GA中,尽管所有的数据都来自那里)见到过的和AuthorityLabs一样的报告,即自然流量的承接页报告。这并不是流量或关键词报告,而是每天为网站带来自然流量的承接页的页面总和。这个报告可以作为你网站的“探测仪”。如果你发现有些页面的流量突然下降,那么可能是谷歌刻意对你的网站进行了降权,或是监测工具出现了问题,或是技术人员无意中封锁了网站的某个部分。

我喜欢将它用作关键词和内容优化的指导。如果带来自然流量的页面数量越来越多或者关键词排名逐渐靠前,这意味着,你的网页优化和内容创建工作卓有成效。

SEO|如何从现有数据中挖掘黑马词

AuthorityLabs可以监测每天有多少页面带来了谷歌自然流量

在上面的例子中,你可以看到这个网站在2015年9月有一个转折点。转折点之后,伴随着新内容创建的完成,这个网站有相当多的页面带来了自然流量。最后的思考

我敢打赌你并不知道,在你现在的网站中,有一个绝好的关键词机会可以带来更多的流量、增加更多销售并且提升品牌知名度。永远不要认为你的关键字策略已经“完美”了,直到你已经用完了所有可以带来流量的关键词机会。

挖掘好关键词之后,创建良好的用户体验以及高质量的内容,自然流量就会得到提升。方法已经告诉你,剩下的就是你怎么去执行了。如果你有任何问题,可以在评论中留言。

注:本文内容由九枝兰团队翻译,转载请加上今日头条号:九枝兰网络营销 以及微信ID:jiuzhilan。对于不署名者,九枝兰将保留追究的权利。

原作者:Stephan Spencer

译者:郭雨知@九枝兰

转:http://toutiao.com/i6233234312968274433/

HTML5使得设计师和开发者在各个不同领域都比之前更强大了。快速,漂亮,安全,响应式,这些特性使使得设计师和开发者可以创造出更加强大更富有创意、更快速、性能优异的APP和网页。所以,接下来我所推荐的工具就是帮你搞定这些问题的。

简约的响应式图表 – CHARTIST.JS

十二个HTML5/CSS3/<b class=JS便捷工具" />

由于社区对于图表类JS库的失望,Chartist.js 诞生了。尽管有上百种不同的库可供你选择,但是用它们的时候,你总会碰到意想不到的问题,需要不停调整。

FSVS – 全屏垂直滑块

十二个HTML5/CSS3/<b class=JS便捷工具" />

这是使用jQuery和CSS3写的一个简约全屏垂直滑块组件,支持鼠标混动、点击并托拽,以及触摸手势。

Nikolay Talanoy 设计的的全屏滑块控件

十二个HTML5/CSS3/<b class=JS便捷工具" />

组件本身的设计令人惊艳,更重要的是它还拥有不错的动效。

Cody House 设计的大图滑块控件

十二个HTML5/CSS3/<b class=JS便捷工具" />

这是一个横跨屏幕响应式且易于定制的滑块控件

Elevator.js

十二个HTML5/CSS3/<b class=JS便捷工具" />

Elevator.js 修正了老范儿的回到顶部按钮的效果,如果你非常在意这个细节的设计不妨来试试这个吧。

Pure CSS Questionnaire Concept (hover items)

十二个HTML5/CSS3/<b class=JS便捷工具" />

固定背景特效

十二个HTML5/CSS3/<b class=JS便捷工具" />

这是一个不错的模板,充分利用了background-attachment 的CSS属性来创造固定背景的效果。

使用SVG创造模糊效果

十二个HTML5/CSS3/<b class=JS便捷工具" />

这是一个教程,教你如何借助JS和SVG模糊滤镜在HTML元素上创造模糊效果。

3D 折叠面板

十二个HTML5/CSS3/<b class=JS便捷工具" />

使用jQuery和CSS创造出折叠控制面板的效果,隐藏次要内容。

圆形弹出式导航菜单

十二个HTML5/CSS3/<b class=JS便捷工具" />

使用SASS和CSS3营造出来的过度、变换的动画效果,点击图表,弹出更多选项。

登录框概念设计

十二个HTML5/CSS3/<b class=JS便捷工具" />

交互式托拽色彩概念设计

十二个HTML5/CSS3/<b class=JS便捷工具" />

这是一个颇为好玩的插件,当你在处理网站视觉稿的时候,只需要将色彩腿拽到对应的地方就可以实现着色。

十二个HTML5/CSS3/<b class=JS便捷工具" />

想认识志同道合的朋友一起学习web

加入我们的学习QQ群 190166743

丰富的学习资源,周一到周四免费直播公开课

转:http://toutiao.com/i6231038143353586178/

下面,我列出了一些资源比较丰富的代码编辑器和IDEs,在开发复杂的程序的过程中,它们可以帮助你节省大量的时间。它们拥有所有的支持工具和强大的功能,能让你在开发过程中保持灵活和高效。

Codelite是一个开源并且免费的跨平台集成开发环境,它支持C/C++编程语言。它对于任何新手程序员来说都是非常好的工具,并且在轻量级的项目中被高度推崇。这个功能丰富的IDE有一个非常直观的界面和一些动态工具,同时它还能很好地兼容很多浏览器。

开发者必备的10个免费IDE和代码编辑器

Bluefish是一个灵活的开源编辑器。它拥有很多非常好的功能,可以让编辑过程更加轻松和快捷。它简单易用,并提供了许多的功能来编写和编辑自己的源代码,以创建高质量的Web项目。Bluefish也包含一些额外的程序和片段作为扩展。它作为一个开源项目,还有一些更好的机会可以增加扩展性的功能。

开发者必备的10个免费IDE和代码编辑器

Java Inventor是一个高性能的Java IDE,能让Java应用程序的开发和部署更加容易。它的产生就是为了减少Java程序员的开发时间。他是一个RAD工具能让你创建表格,管理数据,报告等。IDE部分能对你的应用程序的整体外观和感觉进行改造。

开发者必备的10个免费IDE和代码编辑器

你可以测试你的JavaScript代码的可靠性并看到它的实际运行情况。JS Bin是一个交互的IDE,可以让开发者创建和分享他们的工作,这样误差就可以及时地被检测到并解决。它还能让你在输出之前进行预览,并用于进一步的编辑和分享。它是完全免费的,还拥有许多功能,可以帮助你简化你的开发流程。

开发者必备的10个免费IDE和代码编辑器

Komodo IDE是一个跨平台的集成开发环境,支持所有的主要编程语言,能让你的开发工作快速完成。它拥有一个智能的代码编辑器,会帮助你编写出高质量的代码。它还提供了一种支持Python 2.4-3.3版本的多线程自动调试器。

开发者必备的10个免费IDE和代码编辑器

jEdit是一个非常先进的文本编辑器,用于编写Java程序,同时还能兼容所有主要的浏览器。它具有一个内置的宏语言和易于扩展的插件设计,可以直接从jEdit的插件管理器直接下载并安装。它也很容易定制,对于新手和有经验的开发人员来说都是非常适合的。

开发者必备的10个免费IDE和代码编辑器

Aptana是一个专业的开源工具,专门用于开发Web应用程序。Aptana主要是针对Javascript的开发。它也支持多种编程语言,能实现对CSS,HTML,JavaScript的全面支持。对于那些开发PHP和Ruby的开发者来说,Aptana也是一个非常好的选择。

开发者必备的10个免费IDE和代码编辑器

Code::Blocks是一个免费的支持 C/C++编程的开源集成开发环境。它可以在所有主要的平台上无缝运行,并且是高度可定制的和可配置的。它使用插件框架建立,可以通过安装一些功能性的插件进行扩展。它还带有一个插件向导,这样您就可以创建自己的插件。Code::Blocks是绝对通用的并能很好地用于建设您的项目。

开发者必备的10个免费IDE和代码编辑器

DrJava对于初学者来说是非常简单的并且功能比较齐全。它是免费的开源集成开发环境,主要针对那些开发领域的初学者。它还包括一些强大和神奇的功能,使得这个IDE也成为了高级开发人员的首选。DrJava还提供了多平台的支持功能,带有一个直观的界面,让开发过程变得简单快速。

开发者必备的10个免费IDE和代码编辑器

Coda是一个富文本编辑器,可以让你为Web项目创建简洁,快速和高效的代码。使用Coda你还能进行预览并根据需要作出适当的调整。此外,Coda也会给你一个完美的方式来管理你的本地和远程文件。

开发者必备的10个免费IDE和代码编辑器

本文翻译自:www.k2ice.com

本站文章除注明转载外,均为本站原创或翻译

转:http://toutiao.com/i6230846390918971905/

Node.js是一个面向服务器的框架,立足于Chrome强大的V8 JS引擎。尽管它由C++编写而成,但是它及其应用是运行在JS上的。本文为开发者总结了4个Node.js要点。

1. 非阻塞(Non-blocking)或异步I/O

由于Node.js一个服务器端框架,所以它主要工作之一是处理浏览器请求。在传统的I/O系统中,每个请求的发出都是在上一请求到达之后才发出的。所以这被称为阻塞(blocking)I/O。服务器会阻挡其它的请求以处理当前请求,从而导致浏览器等待。

Node.js不以这种方式来进行I/O处理。如果一个请求需要长时间处理,Node.js会把该请求发送给一个事件循环(event loop),然后继续处理在调用堆栈(call stack)中的下一请求。当延后请求处理完毕时,它会告知Node.js同时浏览器会做出响应反馈。

以下使用一个事例来说明。

Blocking I/O

// take order for table 1 and wait...
var order1 = orderBlocking(['Coke', 'Iced Tea']);
// once order is ready, take order back to table.
serveOrder(order1);
// once order is delivered, move on to another table.
// take order for table 2 and wait...
var order2 = orderBlocking(['Coke', 'Water']);
// once order is ready, take order back to table.
serveOrder(order2);
// once order is delivered, move on to another table.
// take order for table 3 and wait...
var order3 = orderBlocking(['Iced Tea', 'Water']);
// once order is ready, take order back to table.
serveOrder(order3);
// once order is delivered, move on to another table.

在这个餐馆例子中,服务员接收了菜单指令,等待饭菜处理,然后在饭菜处理完成后把饭菜端到桌子上。在服务员等候饭菜处理期间,他会拒绝其它客人的菜单指令。

Non-blocking I/O

// take order for table 1 and move on...
orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){
  return serveOrder(drinks);
});
// take order for table 2 and move on...
orderNonBlocking(['Beer', 'Whiskey'], function(drinks){
  return serveOrder(drinks);
});
// take order for table 3 and move on...
orderNonBlocking(['Hamburger', 'Pizza'], function(food){
  return serveOrder(food);
});

而在非阻塞模式下,服务员会告知厨师他接受到的菜单指令,然后去接收下一桌的指令。当第一桌饭菜处理完毕时,他会为那桌客人上菜,然后继续接收其它客人的指令。这样一来服务员不会由于阻塞指令而造成时间浪费。

2. 原型(Prototype)

原型在JS中是一个复杂的概念。在典型继承机制语言如Java或C++中,为了实现代码复用,你必须先创建一个类然后透过它来生成对象或透过类扩展来生成对象。但是在JS中没有类似的类概念。在JS中创建一个对象后,你需要透过它来扩展对象或创建新对象。这就叫做原型继承(prototypal inheritence)。

每个JS对象都连接着一个原型对象并对并继承该对象的属性。每个对象与预定义JS的Object.prototype相联系。如果你透过obj.propName或obj['propName'>方式来查找对象属性但查找失败时,这时可尝试通过obj.hasOwnProperty('propName')的方式进行查找,JS运行时会在在原型对象中查找属性。如果属性不存在于原型链中,那么将返回undefined值。

让我们用以下例子来进行说明:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        var F = function  {};
        F.prototype = o;
        return new F;
    };
var otherPerson = Object.create(person);

当你创建了一个新对象,你必须选定一个以原型为基础的对象。在这里,我们为对象函数添加了一个create方法。create方法创建了一个以其它对象为原型的对象,并作为参数传入。

当我们变更新的对象时,它的原型是保持不变的。但是,当我们改动了原型对象,该变更会影响所有基于该原型的对象。

3. 模块(Modules)

如果你曾在Java中使用过包,那么Node.js的组件与之类似。如果没有,也不用担心;组件其实是简单的JS文件,用于实现特定的功能。组件模式的意义是让你工作得更加轻松。要使用组件,你必须像在JAVA中导入包一样进行JS文件导入。Node.js中有两种组件

核心组件(Core Modules)- 核心组件是结合Node.js库被预编译的。其目的是把程序员经常使用的功能开放出来,避免重复劳动。常见的核心组件有HTTP, URL, EVENTS, FILE SYSTEM等等。

用户自定义组件(UserDefined Modules)- 用户自定义组件是提供给用户使用以实现具体功能的组件。当核心组件不足以满足程序员需要的时候,自定义组件就可派上用场了。

组件是通过require函数被抽取的。如果这是一个核心组件,那么参数就是组件名。如果这是一个用户自定义组件,那么参数就是其在文件系统中的组件路径。例如:

// extract a core module like this
var http = require('http);
// extract a user defined module like this
var something = require('./folder1/folder2/folder3/something.js');

4. 回调(Callbacks)

JS中,函数是第一类对象。也就是说你可以像对常规对象那样对函数进行所有操作。例如指派函数到一个变量,把这些作为参数传给方法,把它们声明为对象的属性,甚至是把它们从函数里返回。

回调在JS中是异步函数,可以作为参数传递给其它函数或从其它函数里执行或返回而后再执行。这是回调的基本概念。

当我们把一个回调函数作为参数传递给另外的函数时,我们传递的仅仅是函数的定义;换言之,我们不会知道回调函数的执行时间。这完全依赖于回调函数机制。它会在稍后某个时间点进行回调调用。这是Node.js的非阻塞或异步行为的基本概念,可用下例进行说明:

setTimeout(function {
    console.log("world");
}, 2000)
console.log("hello");

这是一个最简单的调用。我们把一个匿名函数作为参数进行传递,作用是为setTimeout函数进行控制台的输出记录登记。因为这仅仅是个函数定义,我们不知道函数何时会被执行。这取决于setTimeout函数的second参数,即2S后。

首先,second记录语句记录了对控制台的输出,2S后,在回调函数中的记录语句记录了输出的内容。

// output
hello
world

写在最后

以上4点对Node.js开发者来说是要彻底理解和掌握的,建议多动手来好好体会这4个要点的含义。

原文出自: Dzone

(责编/夏梦竹)

 

转:http://toutiao.com/news/6228307537867833858/

Dynamics.js是设计基于物理规律的动画的重要JavaScript库。它可以赋予生命给所有包含CSS 和SVG属性的DOM(文本对象模型)元素,换句话说,Dynamics.js适用于所有JavaScript对象以及一系列其它的元素。目前,Dynamics.js常被用于设计交互式菜单栏、同步下拉菜单、加载器、按钮以及其它功能。这个库提供了可定制动画类型的各种基本选项,如频率、反弹力、旋转、摩擦、持续时间等等。

创建酷炫动画效果的10个JavaScript库

Cta.js 是用于在网页上创建动画元素“Action-to-Effect”路径的轻量级库。它常被用在tile-based应用程序的导航、模态窗口的打开、侧边栏上可点击的按钮等等。

创建酷炫动画效果的10个JavaScript库

Beep.js是一个通过使用WebAudio API创建基于网页的电子合成器的JavaScript库。它可以用于创建音乐或者设计和音乐相关的学习教程。

创建酷炫动画效果的10个JavaScript库

Rainyday.js是一个使用HTML5 canvas创建雨滴落在玻璃表面的出色效果的强大JavaScript库。它拥有一个集成了各种可自定义实现的动画组件的可扩展应用程序接口。

创建酷炫动画效果的10个JavaScript库

Iconate.js是一个可将设计图标转化为流行动画元素的伟大资源。它拥有大量可供选择的字体、字形图标以及自定义图标集。

创建酷炫动画效果的10个JavaScript库

Dom-Animator.js是一个在DOM(文本对象模型)中可显示内容节点里ASCII动画的JavaScript库。

创建酷炫动画效果的10个JavaScript库

Famous 是用于设计流行动画的强大JavaScript库,它包含的基于事件的系统(event-based system)使得渲染平滑动画和过渡特效这类的更新转换工作变得非常简单。Famous还有一个可创建自定义动画和动画仿真的3D物理引擎,你可以做出包含在不同的重力、拖放和碰撞下的粒子或者3D物体的状态。

创建酷炫动画效果的10个JavaScript库

Bounce.js 是一个在CSS 3的支持下能做出各种酷炫动画的JavaScript库。你可以设计不同的动画和运动效果,如自转、公转、来回运动、急加速等。

创建酷炫动画效果的10个JavaScript库

Snabbt.js是一个使用CSS3转换矩阵的轻量级JavaScript动画库。它的结构非常简单,支持各种过渡和运动效果的应用,如缩放、尺寸调整、扭曲、旋转等等。Snabbt.js还支持attention animation功能,这个功能在表单验证方面是非常有用的。

创建酷炫动画效果的10个JavaScript库

Rekapi是用于CSS动画关键帧动画以及DOM中JavaScript动画的高级avaScript库。在复杂动画的设计方面,Rekapi以其实用性被人们广为熟知。您可以使用Rekapi创建生动的饼图和曲线图、五彩纸屑、交互性时间线以及各种用户界面。

创建酷炫动画效果的10个JavaScript库

本文翻译自codecondo.com

本站文章除注明转载外,均为本站原创或翻译

转:http://toutiao.com/i6221939614307844609/

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品

一看就明白的爬虫入门讲解-基础理论篇

关于爬虫内容的分享,我会分成两篇,六个部分来分享,分别是:

  1. 我们的目的是什么
  2. 内容从何而来
  3. 了解网络请求
  4. 一些常见的限制方式
  5. 尝试解决问题的思路
  6. 效率问题的取舍

本文先聊聊前三个部分。

一、我们的目的是什么

一般来讲对我们而言需要抓取的是某个网站或者某个应用的内容,提取有用的价值,内容一般分为两部分,非结构化的文本,或者结构化的文本。

关于非结构化的数据

1.1 HTML文本(包含javascript代码)

HTML文本基本上是传统爬虫过程中最常见的,也就是大多数时候会遇到的情况,例如抓取一个网页,得到的是HTML,然后需要解析一些常见的元素,提取一些关键的信息。HTML其实理应属于结构化的文本组织,但是又因为一般我们需要的关键信息并非直接可以得到,需要进行对HTML的解析查找,甚至一些字符串操作才能得到,所以还是归类于非结构化的数据处理中。

常见解析方式如下:

CSS选择器

现在的网页样式比较多,所以一般的网页都会有一些CSS的定位,例如class,id等等,或者我们根据常见的节点路径进行定位,例如腾讯首页的财经部分:

这里id就为finance,我们用css选择器,就是"#finance"就得到了财经这一块区域的html,同理,可以根据特定的css选择器可以获取其他的内容。

XPATH

XPATH是一种页面元素的路径选择方法,利用chrome可以快速得到,如:

一看就明白的爬虫入门讲解-基础理论篇

copy XPATH 就能得到——//*[@id="finance"]

正则表达式

正则表达式,用标准正则解析,一般会把HTML当做普通文本,用指定格式匹配当相关文本,适合小片段文本,或者某一串字符,或者HTML包含javascript的代码,无法用CSS选择器或者XPATH。

字符串分隔

同正则表达式,更为偷懒的方法,不建议使用。

1.2 一段文本

例如一篇文章,或者一句话,我们的初衷是提取有效信息,所以如果是滞后处理,可以直接存储,如果是需要实时提取有用信息,常见的处理方式如下:

分词

根据抓取的网站类型,使用不同词库,进行基本的分词,然后变成词频统计,类似于向量的表示,词为方向,词频为长度。

NLP

自然语言处理,进行语义分析,用结果表示,例如正负面等。

关于结构化的数据

结构化的数据是最好处理,一般都是类似JSON格式的字符串,直接解析JSON数据就可以了,提取JSON的关键字段即可

二、内容从何而来

过去我们常需要获取的内容主要来源于网页,一般来讲,我们决定进行抓取的时候,都是网页上可看到的内容,但是随着这几年移动互联网的发展,我们也发现越来越多的内容会来源于移动app,所以爬虫就不止局限于一定要抓取解析网页,还有就是模拟移动app的网络请求进行抓取,所以这一部分我会分两部分进行说明。

1 网页内容

网页内容一般就是指我们最终在网页上看到的内容,但是这个过程其实并不是网页的代码里面直接包含内容这么简单,所以对于很多新人而言,会遇到很多问题,比如:

明明在页面用Chrome或者Firefox进行审查元素时能看到某个HTML标签下包含内容,但是抓取的时候为空。

很多内容一定要在页面上点击某个按钮或者进行某个交互操作才能显示出来。

所以对于很多新人的做法是用某个语言别人模拟浏览器操作的库,其实就是调用本地浏览器或者是包含了一些执行javascript的引擎来进行模拟操作抓取数据,但是这种做法显然对于想要大量抓取数据的情况下是效率非常低下,并且对于技术人员本身而言也相当于在用一个盒子,那么对于这些内容到底是怎么显示在网页上的呢?主要分为以下几种情况:

网页包含内容

这种情况是最容易解决的,一般来讲基本上是静态网页已经写死的内容,或者动态网页,采用模板渲染,浏览器获取到HTML的时候已经是包含所有的关键信息,所以直接在网页上看到的内容都可以通过特定的HTML标签得到

javascript代码加载内容

这种情况是由于虽然网页显示时,内容在HTML标签里面,但是其实是由于执行js代码加到标签里面的,所以这个时候内容在js代码里面的,而js的执行是在浏览器端的操作,所以用程序去请求网页地址的时候,得到的response是网页代码和js的代码,所以自己在浏览器端能看到内容,解析时由于js未执行,肯定找到指定HTML标签下内容肯定为空,这个时候的处理办法,一般来讲主要是要找到包含内容的js代码串,然后通过正则表达式获得相应的内容,而不是解析HTML标签。

Ajax异步请求

这种情况是现在很常见的,尤其是在内容以分页形式显示在网页上,并且页面无刷新,或者是对网页进行某个交互操作后,得到内容。那我们该如何分析这些请求呢?这里我以Chrome的操作为例,进行说明:

一看就明白的爬虫入门讲解-基础理论篇

所以当我们开始刷新页面的时候就要开始跟踪所有的请求,观察数据到底是在哪一步加载进来的。然后当我们找到核心的异步请求的时候,就只用抓取这个异步请求就可以了,如果原始网页没有任何有用信息,也没必要去抓取原始网页了。

2 App内容

因为现在移动应用越来越多,很多有用信息都在App里面,另外解析非结构化文本和结构文本对比而言,结构化文本会简单多了,不同去找内容,去过多分析解析,所有既有网站又有App的话,推荐抓取App,大多数情况下基本上只是一些JSON数据的API了。那么App的数据该如何抓取呢?通用的方法就是抓包,基本的做法就是电脑安装抓包软件,配置好端口,然后记下ip,手机端和电脑在同一个局域网里面,然后在手机的网络连接里面设置好代理,这个时候打开App进行一些操作,如果有网络数据请求,则都会被抓包软件记下,就如上Chrome分析网络请求一样,你可以看到所有的请求情况,可以模拟请求操作。这里Mac上我推荐软件Charles,Windows推荐Fiddler2。

具体如何使用,之后我再做详述,可能会涉及到HTTPS证书的问题。

三、了解网络请求

刚刚一直在宽泛的提到一些我们需要找到请求,进行请求,对于请求只是一笔带过,但请求是很重要的一部分,包括如何绕过限制,如何发送正确地数据,都需要对的请求,这里就要详细的展开说下请求,以及如何模拟请求。

我们常说爬虫其实就是一堆的HTTP请求,找到待爬取的链接,不管是网页链接还是App抓包得到的API链接,然后发送一个请求包,得到一个返回包(也有HTTP长连接,或者Streaming的情况,这里不考虑),所以核心的几个要素就是:

  1. URL
  2. 请求方法(POST, GET)
  3. 请求包headers
  4. 请求包内容
  5. 返回包headers

在用Chrome进行网络请求捕获或者用抓包工具分析请求时,最重要的是弄清楚URL,请求方法,然后headers里面的字段,大多数出问题就出在headers里面,最常限制的几个字段就是User-Agent, Referer,Cookie 另外Base Auth也是在headers里面加了Autheration的字段。

请求内容也就是post时需要发送的数据,一般都是将Key-Value进行urlencode返回包headers大多数会被人忽视,可能只得到内容就可以了,但是其实很多时候,很多人会发现明明url,请求方法还有请求包的内容都对了,为什么没有返回内容,或者发现请求被限制,其实这里大概有两个原因:

  • 一个是返回包的内容是空的,但是在返回包的headers的字段里面有个Location,这个Location字段就是告诉浏览器重定向,所以有时候代码没有自动跟踪,自然就没有内容了;
  • 另外一个就是很多人会头疼的Cookie问题,简单说就是浏览器为什么知道你的请求合法的,例如已登录等等,其实就是可能你之前某个请求的返回包的headers里面有个字段叫Set-Cookie,Cookie存在本地,一旦设置后,除非过期,一般都会自动加在请求字段上,所以Set-Cookie里面的内容就会告诉浏览器存多久,存的是什么内容,在哪个路径下有用,Cookie都是在指定域下,一般都不跨域,域就是你请求的链接host。

所以分析请求时,一定要注意前四个,在模拟时保持一致,同时观察第五个返回时是不是有限制或者有重定向。

优化博客网页内容时,将js和css指定到static.151051.cn域名下,没想到其中css使用的字体文件无法加载,提示错误信息如下:

Font from origin 'http://static.151051.cn' has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.151051.cn' is therefore not allowed access.

好吧,字面上的意思是,字体被禁止调用,原因头信息中并不包含Access-Control-Allow-Origin,没有授权给www.151051.cn使用,原谅我蹩脚的英文。随手百度了一下Access-Control-Allow-Origin这货,原来这货是用来定义允许哪个域使用资源,可以有效解决字体远程调用的问题。一不做二不休,开搞。

如果是php文件,可以在php文件中定义<?php header("Access-Control-Allow-Origin: http://www.151051.cn");?> 注意,这里网上有很多文章是用*代替域名,这样做比较"呵呵",所以还是指定域名比较好,安全性高一些。

像我现在这种需求,在static.151051.cn授权给www.151051.cn使用,而且static并不想支持php,那肿么办呢?

呵呵,好办,直接在nginx里加入到头信息中,一劳永逸。如下:
location ~ .*\.(js|css|woff|ttf|svg|eot|oft)?$
{
add_header Access-Control-Allow-Origin http://www.151051.cn;
expires 2h;
}

好了,解决!

http://www.webkaka.com/blog/archives/how-to-set-gzip-for-js-in-Nginx.html

Nginx启用gzip很简单,只需要设置一下配置文件即可完成,可以参考文章Nginx如何配置Gzip压缩功能。不过,在群里常有人提到,他们的网站Gzip压缩虽然成功了,但检测到JS仍然没有压缩成功,这是为什么呢?经过我的检查发现,原来是他们的gzip_types设置不对造成的,本文就为遇到同样情况的人解决这一问题。

Nginx启用Gzip压缩js无效

某群友在群里提到,他启用了网站的Gzip压缩,通过站长工具Gzip压缩检测检测到启用成功了,想着其他文件如CSS、JS等也都压缩成功了,但是通过进一步检测各种类型的压缩情况,发现JS文件并没有启用Gzip压缩,这令他非常纳闷,不知何故。

Nginx启用Gzip压缩<b class=js无效" />

图1:Nginx启用Gzip压缩js无效

转:http://blog.jobbole.com/48769/

一些我更愿意在开始就知道东西

利用 Node.js 开发是一个非常有趣,和令人满足的过程, 它有3万多个模块可以选择使用,并且所有的模块可以非常容易的集成入现有的应用之中。

无论如何,对于一些刚开始使用Node.js 开发的的人来说, 很容易碰壁,在这个文章中,我会提到在你学习过程中遇到的问题。

贴士 1: 在开发环境使用 nodemon, 在生产环境使用pm2

当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样。 当我第一次开发的node app时候,这个让我感到异常挫败和痛苦, 尤其是每当我修改很小东西的时候需要control+c

幸运的是我发现了一个非常棒的工具Nodemon。 你可以利用以下的命令来安装

1
npm install -g nodemon

Nodemon 是一个令人惊叹的工具, 当你全局安装它以后, 可以通过 nodemon [file].js 来启动你的node.js scripts,它会告诉nodemon来监视你的script和scripts的所有变化, 这样的Node.js开发方式非常震撼以及让大大提高开发速度。

那么,生产环境又如何, 除非你用了herokuNodejitsu或者其它一些好的 Node.js 平台(也许它们有类似的功能), 但是碰巧你用了EC2 或者一些其它的云平台来运行你的Node.js app, 你如何能然保证这是一个始终运行的Node.js app

案就是PM2, PM2 是一个类似于Nodemon的工具,不同之处在于它用于生产环境, 和Nodemon相似的地方在于它会监控你的app的任何修改或者重新部署,但是有更好的一面, PM2 在遭遇到崩溃的时候,它会正确重启你的app。

PM2的优胜之处在于当你要将app需要多核处理的时候,PM2内部集成的负载均衡可以让你很容易的去指定运行多少个实例。

1
pm2 start app.js -i max

-i参数目的是指定运行多少个实例,在这个例子中 PM2 使用了一个常量max来扩展你的app运转到你最大的核数,不要忘记Node 平时只会运行在单核!

http://npm.taobao.org/

淘宝 NPM 镜像

这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。

  • 当前 registry.npm.taobao.org 是从 js.org/">registry.npmjs.org 进行全量同步的.
  • 当前 npm.taobao.org 运行版本是: cnpmjs.org@2.0.0-beta3
  • 本系统运行在 js.org/">Node.js@v0.11.14 上.
  • nodejs.org/dist 镜像: npm.taobao.org/dist
  • js/downloads">phantomjs downloads 镜像: js/">phantomjs mirror
  • Node.js 文档镜像: Node.js Document
113,488 个模块 615,221 个模块版本 7 次删除
22,867 次本日下载 474,895 次本周下载 1,792,093 次本月下载
68,299 次昨日下载 488,804 次上周下载 2,211,639 次上月下载

同步状态

This registry will sync all packages from official registry.

上次同步完成时间: Fri Nov 28 2014 13:55:10 GMT+0800 (中国标准时间)