辽阳剐什教育咨询有限公司

技術(shù)學(xué)院

12-19
2017
小程序發(fā)布后搜索不到是怎么回事
      隨著小程序商城的熱度不減,更多的電商大佬紛紛使用小程序,如今已建立起2萬(wàn)開(kāi)發(fā)者、1.2億用戶日活的小程序生態(tài)。微信對(duì)小程序的大力支持,也讓無(wú)數(shù)的開(kāi)發(fā)者和商戶看到了微信小程序的無(wú)限發(fā)展?jié)摿Α5?,身邊有很多朋友都?huì)遇到一些問(wèn)題,常見(jiàn)的就是在發(fā)布完的小程序后,自己的小程序在微信里搜不到的情況,這讓很多企業(yè)商戶摸不到頭腦,那么出現(xiàn)這種狀況的原因是什么呢?一、需登錄小程序平臺(tái)      在大家遇到小程序發(fā)布后搜索不到的情況時(shí),首先需要登錄自己的小程序平臺(tái),由于小程序?qū)徍送ㄟ^(guò)后,還需要登錄微信小程序平臺(tái)“點(diǎn)擊發(fā)布”這一項(xiàng),在發(fā)布后的兩小時(shí)內(nèi)才可以搜索到自己的小程序,可以首先嘗試一下此方法。二、小程序關(guān)鍵詞排名規(guī)則      當(dāng)你在微信中搜索小程序后,還是沒(méi)有發(fā)現(xiàn)自己的小程序。很有可能是在小程序商城中小程序的關(guān)鍵詞排名因素導(dǎo)致的。那么如何讓自己的小程序關(guān)鍵詞排名靠前呢?小編就和大家介紹一下小程序關(guān)鍵詞的排名規(guī)則:1、小程序上線時(shí)間越早,排名就會(huì)越靠前。2、微信小程序用戶使用的數(shù)量越多,排名就會(huì)越靠前。3、完全匹配出現(xiàn)關(guān)鍵詞次數(shù)越多,排名就會(huì)越靠前。4、小程序的名稱作為核心關(guān)鍵詞語(yǔ),排名就會(huì)越靠前。5、小程序中的關(guān)鍵詞出現(xiàn)1次,并且整體標(biāo)題的字?jǐn)?shù)越短的話,排名就會(huì)越靠前。當(dāng)大家遇到自己的小程序發(fā)布后在微信中搜索不到的情況時(shí),可以通過(guò)以上提到的方法進(jìn)行調(diào)整。隨著微信對(duì)微信小程序商城的大力優(yōu)化和扶持,越來(lái)越多的優(yōu)勢(shì)被大眾所熟知,加之微信小程序正處于紅利期,因此微信小程序的爆紅也就不無(wú)道理了。
12-06
2018
微信小程序獲取用戶頭像+昵稱+openid,小程序登錄!小程序發(fā)送模板消息
<view class="container">   <view class="userinfo">     <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 獲取頭像昵稱 </button>     <block wx:else>       <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>       <text class="userinfo-nickname">{{userInfo.nickName}}</text>     </block>   </view>   <view class="usermotto">     <text class="user-motto">{{motto}}</text>   </view>//獲取應(yīng)用實(shí)例 const app = getApp()   Page({   data: {     motto: 'Hello World',     userInfo: {},     hasUserInfo: false,     canIUse: wx.canIUse('button.open-type.getUserInfo')   },     onLoad: function () {     if (app.globalData.userInfo) {       this.setData({         userInfo: app.globalData.userInfo,         hasUserInfo: true       })     } else if (this.data.canIUse){       // 由于 getUserInfo 是網(wǎng)絡(luò)請(qǐng)求,可能會(huì)在 Page.onLoad 之后才返回       // 所以此處加入 callback 以防止這種情況       app.userInfoReadyCallback = res => {         this.setData({           userInfo: res.userInfo,           hasUserInfo: true         })       }     } else {       // 在沒(méi)有 open-type=getUserInfo 版本的兼容處理       wx.getUserInfo({         success: res => {           app.globalData.userInfo = res.userInfo           this.setData({             userInfo: res.userInfo,             hasUserInfo: true           })         }       })     }   },   getUserInfo: function(e) {     console.log(e)     app.globalData.userInfo = e.detail.userInfo       //獲取openid     wx.login({       success: function (res) {         console.log(res.code)         //發(fā)送請(qǐng)求獲取openid         wx.request({           url: '你的域名/openid.php?code=code', //接口地址           data: { code: res.code },           header: {             'content-type': 'application/json' //默認(rèn)值           },           success: function (res) {             //返回openid             console.log(res.data.openid)             //向數(shù)據(jù)庫(kù)注冊(cè)用戶,驗(yàn)證用戶             var that = this;             wx.request({               url: '你的域名/server.php?nickname=' + e.detail.userInfo.nickName + '&avatarUrl=' + e.detail.userInfo.avatarUrl + '&openid=' + res.data.openid,               data: {                 },               header: {                 'content-type': 'application/json'               },               success: function (res) {                 //打印用戶信息                 console.log(res.data)               }             })           }         })       }     })             this.setData({       userInfo: e.detail.userInfo,       hasUserInfo: true,     })   } })<?php //聲明CODE,獲取小程序傳過(guò)來(lái)的CODE $code = $_GET["code"]; //配置appid $appid = "你的小程序APPID"; //配置appscret $secret = "你的小程序APPSRCRET"; //api接口 $api = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code"; //獲取GET請(qǐng)求 function httpGet($url){     $curl = curl_init();     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);     curl_setopt($curl, CURLOPT_TIMEOUT, 500);     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);     curl_setopt($curl, CURLOPT_URL, $url);     $res = curl_exec($curl);     curl_close($curl);     return $res; } //發(fā)送 $str = httpGet($api); echo $str; ?><?php header("Content-type:text/html;charset=utf8"); $nickname = $_GET["nickname"]; $avatarUrl = $_GET["avatarUrl"]; $openid = $_GET["openid"]; $con = mysql_connect("數(shù)據(jù)庫(kù)地址","數(shù)據(jù)庫(kù)賬號(hào)","數(shù)據(jù)庫(kù)密碼"); mysql_select_db("數(shù)據(jù)庫(kù)名", $con); mysql_query("INSERT INTO 表名 (nickname, avatarUrl, openid) VALUES ('$nickname', '$avatarUrl', '$openid')"); echo "注冊(cè)成功!"; mysql_close($con); ?>微信模板消息<form bindsubmit="submit" report-submit='true' >   <input type='text' value='填寫openid' name="openid"></input>   <input type='text' value='填寫ACCESS_TOKEN' name="token"></input>   <input type='text' value='填寫模板ID' name="template"></input>   <input type='text' value='模板的第1個(gè)關(guān)鍵詞' name="keyword1"></input>   <input type='text' value='模板的第2個(gè)關(guān)鍵詞' name="keyword2"></input>   <input type='text' value='模板的第3個(gè)關(guān)鍵詞' name="keyword3"></input>   <input type='text' value='模板的第4個(gè)關(guān)鍵詞' name="keyword4"></input>   <input type='text' value='模板的第5個(gè)關(guān)鍵詞' name="keyword5"></input>   <button form-type="submit" type="default">推送</button> </form>Page({   data: {          },      submit: function (e) {     var openid = e.detail.value.openid;     var access = e.detail.value.token;     var template = e.detail.value.template;     var keyword1 = e.detail.value.keyword1;     var keyword2 = e.detail.value.keyword2;     var keyword3 = e.detail.value.keyword3;     var keyword4 = e.detail.value.keyword4;     var keyword5 = e.detail.value.keyword5;     var that = this;     wx.request({       url: '域名/muban.php?openid=' + e.detail.value.openid + '&token=' + e.detail.value.token + '&template=' + e.detail.value.template + '&formid=' + e.detail.formId + '&keyword1=' + e.detail.value.keyword1 + '&keyword2=' + e.detail.value.keyword2 + '&keyword3=' + e.detail.value.keyword3 + '&keyword4=' + e.detail.value.keyword4 + '&keyword5=' + e.detail.value.keyword5, //接口地址,我學(xué)習(xí)就用get,建議用post       data: {         open_id: openid,         tok_en: access,         temp_late: template,         form_id: e.detail.formId,         keyword_1: keyword1,         keyword_2: keyword2,         keyword_3: keyword3,         keyword_4: keyword4,         keyword_5: keyword5       },       success: function (res) {                // console.log(e.detail.formId);       // console.log(res.data);       }     })   } })//后端 <?php     //GET參數(shù)     $access_token=$_GET['token'];     $openid=$_GET['openid'];     $templateid=$_GET['template'];     $formid=$_GET['formid'];     $keyword1=$_GET['keyword1'];     $keyword2=$_GET['keyword2'];     $keyword3=$_GET['keyword3'];     $keyword4=$_GET['keyword4'];     $keyword5=$_GET['keyword5'];     echo $keywordd1;     //此處開(kāi)始處理數(shù)據(jù)     $dataa=array(         "keyword1"=>array(                             "value"=>$keyword1,                             "color"=>"#9b9b9b"),         "keyword2"=>array(                             "value"=>$keyword2,                             "color"=>"#9b9b9b"),         "keyword3"=>array(                             "value"=>$keyword3,                             "color"=>"#9b9b9b"),         "keyword4"=>array(                             "value"=>$keyword4,                             "color"=>"#9b9b9b"),         "keyword5"=>array(                             "value"=>$keyword5,                             "color"=>"#9b9b9b")                 );         $data=array();     $data['touser']=$openid;     $data['template_id']=$templateid;     $data['form_id']=$formid;     $data['data']=$dataa;             $url = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$access_token;       $type="json";         if($type=='json'){//json $_POST=json_decode(file_get_contents('php://input'), TRUE);             $headers = array("Content-type: application/json;charset=UTF-8","Accept: application/json","Cache-Control: no-cache", "Pragma: no-cache");             $data=json_encode($data);         }         $curl = curl_init();         curl_setopt($curl, CURLOPT_URL, $url);         curl_setopt($curl, CURLOPT_POST, 1); // 發(fā)送一個(gè)常規(guī)的Post請(qǐng)求         curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);         curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);         if (!empty($data)){             curl_setopt($curl, CURLOPT_POST, 1);             curl_setopt($curl, CURLOPT_POSTFIELDS,$data);         }         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);         curl_setopt($curl, CURLOPT_HTTPHEADER, $headers );         $output = curl_exec($curl);         if (curl_errno($curl)) {             echo 'Errno'.curl_error($curl);//捕抓異常         }         curl_close($curl);         echo $output; ?>
10-23
2018
熊掌號(hào)與SEO
什么是百度官方號(hào)相信不少站長(zhǎng)在百度站長(zhǎng)平臺(tái)收到了站內(nèi)消息:百度站長(zhǎng)平臺(tái)的原創(chuàng)保護(hù)功能遷移到百度官方號(hào),百度官方號(hào)正在內(nèi)測(cè),收到邀請(qǐng)的站長(zhǎng)建議趕緊嘗試。雖然我首批收到內(nèi)測(cè)邀請(qǐng),然并卵,目前百度官方號(hào)注冊(cè)是通過(guò)百家號(hào)系統(tǒng)的,而百家號(hào)是需要國(guó)內(nèi)身份證、電話等認(rèn)證的,所以和我的博客不能備案、主機(jī)不能搬到國(guó)內(nèi),我也不能開(kāi)通微信公眾號(hào)一樣,我現(xiàn)在也無(wú)法開(kāi)通百度官方號(hào)。甚至前些天發(fā)現(xiàn)我的微信號(hào)不但不能向別人轉(zhuǎn)賬,連別人轉(zhuǎn)賬或發(fā)紅包給我都不行了,也是因?yàn)闆](méi)有實(shí)名認(rèn)證,而我又沒(méi)有國(guó)內(nèi)身份證,無(wú)法認(rèn)證,所以很多國(guó)內(nèi)方便、流行的東西我用不了。所以百度官方號(hào)后臺(tái)是什么樣子,這里暫時(shí)無(wú)法分享了。百度官方號(hào)到底是什么可以到百度官方號(hào)說(shuō)明頁(yè)面看一下,摘抄幾句重要的:官方號(hào)是幫助互聯(lián)網(wǎng)上所有內(nèi)容和服務(wù)提供者實(shí)現(xiàn)搜索用戶留存,并且為其賦予用戶運(yùn)營(yíng)能力,提供多樣的用戶運(yùn)營(yíng)途徑,從而實(shí)現(xiàn)網(wǎng)站的多元化變現(xiàn)。(Zac插一句話:這貌似是個(gè)病句?)網(wǎng)站開(kāi)通官方號(hào)后,每一個(gè)網(wǎng)站將在百度建立一個(gè)官方號(hào)頁(yè)面,新用戶在首次瀏覽網(wǎng)站信息后,可以關(guān)注官方號(hào)稱為官方號(hào)粉絲;老用戶下一次可以通過(guò)百度首頁(yè)、搜索結(jié)果頁(yè)或者多重用戶運(yùn)營(yíng)入口直接進(jìn)入網(wǎng)站官方號(hào)頁(yè)面,瀏覽內(nèi)容或者消費(fèi)服務(wù)。通過(guò)官方號(hào)提交入口的鏈接,經(jīng)過(guò)質(zhì)量校驗(yàn)后可以享受快速收錄的特權(quán),對(duì)于符合質(zhì)量標(biāo)準(zhǔn)的頁(yè)面,會(huì)同時(shí)在搜索結(jié)果頁(yè)和官方號(hào)主頁(yè)中展現(xiàn),再配合官方號(hào)的運(yùn)營(yíng)給站點(diǎn)提供更多收益。所以這是一個(gè):用戶可以關(guān)注的號(hào),所以能留存搜索用戶。以后用戶想找你,在“我的關(guān)注”就能找到。搜索用戶在搜索結(jié)果頁(yè)面上就可以關(guān)注你的官方號(hào),也就是說(shuō),有官方號(hào)的頁(yè)面在搜索結(jié)果中的展現(xiàn)方式必然是不一樣的,至少得多一個(gè)關(guān)注按鈕。有官方號(hào)的頁(yè)面有快速收錄的特權(quán)。與百度工程師的交流表明,有官方號(hào)的頁(yè)面也有排名的優(yōu)勢(shì)。是否能實(shí)現(xiàn)收錄、排名的特權(quán),頁(yè)面是需要經(jīng)過(guò)質(zhì)量校驗(yàn)的。這是一個(gè)人工+程序的混合過(guò)程。所以,SEO們不得不關(guān)注百度官方號(hào),進(jìn)入官方號(hào)系統(tǒng)的頁(yè)面在收錄、排名、展現(xiàn)上都將有優(yōu)勢(shì)。百度官方號(hào)實(shí)例比如搜索“紅燒肉”,最上面的輪轉(zhuǎn)圖大部分是有官方號(hào)的頁(yè)面:結(jié)果下面列出了網(wǎng)站名稱和一個(gè)挺顯眼的網(wǎng)站圖標(biāo)。這些結(jié)果也大部分是百度MIP頁(yè)面,點(diǎn)擊結(jié)果,會(huì)進(jìn)入MIP頁(yè)面:可以看到右上角有個(gè)“關(guān)注”按鈕,用戶可以關(guān)注,成為粉絲。點(diǎn)擊關(guān)注右側(cè)的下拉菜單,可以看到訪問(wèn)官方號(hào)的選項(xiàng):官方號(hào)頁(yè)面是這個(gè)樣子:(11月6號(hào)注:最后確定的熊掌號(hào)有的時(shí)候還在關(guān)注按鈕下面還顯示百度認(rèn)證信息)官方號(hào)是在author.baidu.com這個(gè)子域名下,站長(zhǎng)可以在官方號(hào)中發(fā)表文章,與微信公眾號(hào)挺相似。官方號(hào)頁(yè)面即使不是MIP頁(yè)面,也在展現(xiàn)上與普通頁(yè)面有很大差別,而且似乎更為顯著,比如這個(gè):(11月6號(hào)注:里面的“官方號(hào)”字樣改為了“熊掌號(hào)”,其它倒沒(méi)有什么大變化。)這么明顯的圖標(biāo)、關(guān)注按鈕,相信對(duì)點(diǎn)擊率、用戶留存率都有相當(dāng)大的影響。關(guān)于百度官方號(hào)的一些內(nèi)部信息通過(guò)和譚待他們的交流,還了解到一些百度官方號(hào)還沒(méi)公布、其它地方看不到的信息。官方號(hào)平臺(tái)可以直接發(fā)布文章,用戶可以關(guān)注,類似微信公眾號(hào),不過(guò)百度官方號(hào)帶來(lái)了用戶、移動(dòng)搜索和網(wǎng)站內(nèi)容的聯(lián)通,似乎比公眾號(hào)更為開(kāi)放?,F(xiàn)在能看到的官方號(hào)頁(yè)面顯示的都是百度百家號(hào)的文章,以后百家號(hào)應(yīng)該是直接合并到官方號(hào)。對(duì)SEO更有意義的是,官方號(hào)也會(huì)和網(wǎng)站頁(yè)面產(chǎn)生關(guān)聯(lián)。站長(zhǎng)可以通過(guò)官方號(hào)以類似sitemap的形式提交頁(yè)面,頁(yè)面上也可以加上一個(gè)標(biāo)簽,聲明這個(gè)頁(yè)面屬于某個(gè)官方號(hào)。這樣的頁(yè)面經(jīng)過(guò)質(zhì)量校驗(yàn)后,在收錄、排名、展現(xiàn)上都比普通頁(yè)面有優(yōu)勢(shì)。前面提到,原來(lái)的原創(chuàng)保護(hù)即將轉(zhuǎn)移到百度官方號(hào),所以提交的頁(yè)面要求是比較高的,很可能需要是原創(chuàng)的。質(zhì)量校驗(yàn)的第一關(guān)顯然就是開(kāi)通賬號(hào)時(shí)的人工審核。其后通過(guò)官方號(hào)提交的頁(yè)面很可能是巨量的,質(zhì)量上也是參差不齊的,肯定要由算法檢驗(yàn)質(zhì)量。為了讓站長(zhǎng)了解自己提交的頁(yè)面質(zhì)量是否符合標(biāo)準(zhǔn),提高透明度,官方號(hào)有可能在后臺(tái)顯示一個(gè)大致的頁(yè)面質(zhì)量評(píng)級(jí),甚至更多信息,如果提交的頁(yè)面并沒(méi)有獲得收錄、排名、展現(xiàn)等方面的優(yōu)勢(shì),站長(zhǎng)也可以查看一下質(zhì)量評(píng)級(jí),心里大概明白是為什么。(11月6號(hào)注:這個(gè)指數(shù)現(xiàn)在命名為熊掌號(hào)搜索指數(shù):是由您發(fā)布的內(nèi)容質(zhì)量、用戶喜愛(ài)、原創(chuàng)能力、活躍表現(xiàn)、領(lǐng)域?qū)W⑽鍌€(gè)維度的計(jì)算而得出的客觀評(píng)分結(jié)果。)即使目標(biāo)關(guān)鍵詞沒(méi)有獲得好的質(zhì)量評(píng)級(jí),因此沒(méi)有排名和特殊展現(xiàn),在搜索品牌詞、公司名,或者直接搜索URL時(shí),通常還是會(huì)得到官方號(hào)的展現(xiàn),這對(duì)很多企業(yè)老板也是挺管用的。站長(zhǎng)通過(guò)官方號(hào)提交網(wǎng)址時(shí),雖然可以自己選擇提交哪些頁(yè)面,但也要謹(jǐn)慎,質(zhì)量不夠就不要提交了,如果提交的頁(yè)面大量存在質(zhì)量問(wèn)題,官方號(hào)等級(jí)可能會(huì)下降。                           
10-23
2018
百度算法更新大全
盤點(diǎn)一下百度官方公布過(guò)的算法更新,數(shù)量不少,信息散落在百度資源平臺(tái)各處,集中在這里,省得以后記不住,其實(shí)現(xiàn)在已經(jīng)記不住了,讀者們也可以做個(gè)參考。以后有百度官方命名的更新,會(huì)更新在這個(gè)頁(yè)面上。有一些可疑的算法名稱,如所謂瑞麗算法等,我沒(méi)有看到任何官方說(shuō)法,不知道出處,沒(méi)有列出來(lái)。從算法名稱看,百度是從植物系列轉(zhuǎn)向了天氣預(yù)報(bào)系列。百度綠籮算法上線時(shí)間:2013年2月19號(hào)打擊對(duì)象:買賣鏈接的行為,包括超鏈中介、出賣鏈接的網(wǎng)站、購(gòu)買鏈接的網(wǎng)站。綠籮算法影響了10W+低質(zhì)站點(diǎn)。百度石榴算法上線時(shí)間:2013年5月17號(hào)打擊對(duì)象:大量妨礙用戶正常瀏覽的惡劣廣告的頁(yè)面、低質(zhì)量?jī)?nèi)容頁(yè)面石榴算法針對(duì)的尤其以彈出大量低質(zhì)彈窗廣告、混淆頁(yè)面主體內(nèi)容的垃圾廣告頁(yè)面為代表。綠籮算法2.0上線時(shí)間:2013年7月1號(hào)打擊對(duì)象:軟文中的外鏈及懲罰發(fā)軟文的站點(diǎn)。百度冰桶算法1.0上線時(shí)間:2014年8月30號(hào)打擊對(duì)象:移動(dòng)端影響用戶體驗(yàn)的落地頁(yè)。冰桶1.0主要打擊對(duì)象包括強(qiáng)行彈窗app下載、用戶登錄、大面積廣告等影響用戶正常瀏覽體驗(yàn)的頁(yè)面,尤其以必須下載app才能正常使用的站點(diǎn)為代表。冰桶算法2.0上線時(shí)間:打擊對(duì)象:全屏下載、在狹小的手機(jī)頁(yè)面布設(shè)大面積廣告遮擋主體內(nèi)容、強(qiáng)制用戶登錄才可以使用等。冰桶算法3.0上線時(shí)間:2016年7月7號(hào)公布,7月15號(hào)上線打擊對(duì)象:打斷用戶完整搜索路徑的行為。所謂打斷用戶完整搜索路徑,主要指的是用戶訪問(wèn)移動(dòng)頁(yè)面時(shí),被強(qiáng)迫打開(kāi)、下載該網(wǎng)站的APP才能繼續(xù)瀏覽或使用,但這些APP又不一定是必要或者常用的,簡(jiǎn)單獲取信息的行為被強(qiáng)行變成復(fù)雜或高成本的下載行為。百度移動(dòng)搜索會(huì)大幅降低這類頁(yè)面在移動(dòng)搜索中的評(píng)價(jià)。百度天網(wǎng)算法上線時(shí)間:2016年8月10號(hào)公布打擊對(duì)象:盜取用戶隱私的網(wǎng)站。盜取用戶隱私主要表現(xiàn)為網(wǎng)頁(yè)嵌惡意代碼,用于盜取網(wǎng)民的QQ號(hào)、手機(jī)號(hào)等。被檢測(cè)處罰的網(wǎng)站經(jīng)過(guò)整改,達(dá)到標(biāo)準(zhǔn),會(huì)解除處罰。冰桶算法4.0上線時(shí)間:2016年9月19號(hào)公布打擊對(duì)象:廣告過(guò)多、影響用戶體驗(yàn)的移動(dòng)頁(yè)面。SEO需要優(yōu)化頁(yè)面廣告布局,控制每屏廣告的比例,保障用戶瀏覽體驗(yàn),以免被算法策略命中,影響網(wǎng)站排名和流量。冰桶算法4.5上線時(shí)間:2016年10月26號(hào)公布打擊對(duì)象:發(fā)布惡劣誘導(dǎo)類廣告的頁(yè)面。所謂惡劣誘導(dǎo)類廣告,指的是通過(guò)色情動(dòng)圖、色情導(dǎo)航、露骨文本、賭博等等吸引眼球的形態(tài)誘導(dǎo)用戶點(diǎn)擊非法廣告。就我所見(jiàn),目前這種頁(yè)面依然很多,但排名能保持的很少。百度藍(lán)天算法上線時(shí)間:2016年11月21號(hào)公布打擊對(duì)象:打擊新聞源售賣軟文、目錄行為。觸發(fā)“藍(lán)天算法”問(wèn)題網(wǎng)站將被清理出新聞源,同時(shí)降低其在百度搜索系統(tǒng)中的評(píng)價(jià)。百度烽火計(jì)劃上線時(shí)間:2017年2月23號(hào)公布打擊對(duì)象:百度移動(dòng)搜索頁(yè)面劫持。所謂移動(dòng)搜索頁(yè)面劫持,指的是用戶瀏覽完這類作弊頁(yè)面后返回搜索結(jié)果時(shí),沒(méi)有返回到真正的百度搜索結(jié)果頁(yè)面,而是進(jìn)入到一個(gè)假的百度移動(dòng)搜索結(jié)果頁(yè),該頁(yè)面模擬了百度搜索結(jié)果首頁(yè),但實(shí)際上是一個(gè)虛假的高風(fēng)險(xiǎn)站點(diǎn),用戶訪問(wèn)存在極大的安全隱患。百度沒(méi)有具體說(shuō)明這種劫持是怎樣實(shí)現(xiàn)的。我猜想的一個(gè)可能方式是連續(xù)跳轉(zhuǎn)加上檢測(cè)瀏覽器referrer(看懂就看懂,看不懂不解釋),以前在唯一的一次網(wǎng)上SEO培訓(xùn)中提到過(guò)這種方法在搜索廣告中的使用,不知道是不是有心人受到了啟發(fā)?百度颶風(fēng)算法上線時(shí)間:2017年7月4號(hào)公布打擊對(duì)象:嚴(yán)厲打擊以惡劣采集為內(nèi)容主要來(lái)源的網(wǎng)站。百度搜索對(duì)惡劣采集零容忍,惡劣采集的頁(yè)面將從索引庫(kù)中被徹底清除,給優(yōu)質(zhì)原創(chuàng)內(nèi)容提供更多展示機(jī)會(huì)。颶風(fēng)算法會(huì)例行產(chǎn)出懲罰數(shù)據(jù),同時(shí)會(huì)根據(jù)情況隨時(shí)調(diào)整迭代。貌似是線下預(yù)處理數(shù)據(jù),計(jì)算后集中上線。優(yōu)質(zhì)原創(chuàng)站點(diǎn)如果發(fā)現(xiàn)索引量大幅減少且流量大幅下滑現(xiàn)象,可以在反饋中心進(jìn)行反饋。所以,算法是有可能誤判的。至少到目前為止,采集、轉(zhuǎn)載的內(nèi)容排名比原創(chuàng)好是很常見(jiàn)的,颶風(fēng)算法并沒(méi)有充分發(fā)揮作用。百度蜘蛛升級(jí)https抓取上線時(shí)間:2017年8月30號(hào)公布,8月期間已上線主要影響:升級(jí)了對(duì)HTTPS數(shù)據(jù)的抓取力度,HTTPS數(shù)據(jù)將更快被Spider抓取到。除了抓取,百度表示過(guò),https頁(yè)面在權(quán)重上也有加分,百度的原話是“網(wǎng)站評(píng)價(jià)高、落地頁(yè)評(píng)價(jià)高、搜索展示等收益優(yōu)待?!盙oogle幾年前就開(kāi)始對(duì)https頁(yè)面提權(quán)。HTTPS是大勢(shì)所趨,主要還是為了安全,搜索引擎對(duì)https頁(yè)面在抓取、排名上也會(huì)有更多優(yōu)待。建議站長(zhǎng)盡快把網(wǎng)站從http轉(zhuǎn)移到https,早晚要轉(zhuǎn),不如早轉(zhuǎn)。百度清風(fēng)算法上線時(shí)間:2017年9月14號(hào)公布,9月底上線打擊對(duì)象:提過(guò)頁(yè)面標(biāo)題作弊,欺騙用戶獲得點(diǎn)擊的行為。標(biāo)題作弊主要指標(biāo)題內(nèi)容虛假(諸如標(biāo)題黨,假官方網(wǎng)站,假下載頁(yè)面,假在線觀看等),或在標(biāo)題中故意堆砌關(guān)鍵詞等行為。百度閃電算法上線時(shí)間:2017年10月19號(hào)公布,10月初已上線主要影響:移動(dòng)頁(yè)面首屏加載時(shí)間將影響搜索排名移動(dòng)網(wǎng)頁(yè)首屏在2秒之內(nèi)完成打開(kāi)的,在移動(dòng)搜索排名中獲得一定提權(quán)和流量?jī)A斜,移動(dòng)頁(yè)面首屏加載非常慢(3秒及以上),將會(huì)被降權(quán)。2-3秒之間的,不升不降。以前就提過(guò),頁(yè)面速度是移動(dòng)SEO的重要內(nèi)容。提高頁(yè)面打開(kāi)速度牽扯到很多東西,包括但不限于:服務(wù)器位置、帶寬、性能,數(shù)據(jù)庫(kù)優(yōu)化,HTML代碼、圖片優(yōu)化、壓縮,減少請(qǐng)求次數(shù),CDN和緩存使用等等。有時(shí)間再單獨(dú)說(shuō)。像我的博客這樣備案困難的網(wǎng)站,想把服務(wù)器轉(zhuǎn)移到國(guó)內(nèi)而不可得,速度上就先吃虧了。我在國(guó)內(nèi)的幾個(gè)城市試過(guò),大部分情況下3秒是打不開(kāi)頁(yè)面的,所以我的SEO每天一貼已經(jīng)被處罰過(guò)了?百度驚雷算法上線時(shí)間:2017年11月20號(hào)公布,2017年11月底上線打擊對(duì)象:通過(guò)刷點(diǎn)擊提高百度排名的行為,也就是近兩年頗為流行的百度快速排名,簡(jiǎn)稱快排。摘自百度官方關(guān)于驚雷算法的說(shuō)明:驚雷算法會(huì)例行產(chǎn)出懲罰數(shù)據(jù),對(duì)存在點(diǎn)擊流量作弊的行為進(jìn)行懲罰,另對(duì)有判罰紀(jì)錄的網(wǎng)站加以嚴(yán)懲,嚴(yán)重者將長(zhǎng)期封禁。既然是刷排名,就可以給競(jìng)爭(zhēng)對(duì)手刷,為了防止別人陷害,驚雷算法會(huì)綜合考慮網(wǎng)站質(zhì)量、歷史數(shù)據(jù)等多維度特征,不可能僅僅看點(diǎn)擊數(shù)據(jù),不然太容易陷害競(jìng)爭(zhēng)對(duì)手了。有兩個(gè)值得注意的對(duì)方。一是,即使有防范措施,有沒(méi)有可能誤傷無(wú)辜網(wǎng)站?應(yīng)該是有可能,所以官方特意加了一句:在此期間如有流量異常,可以到反饋中心投訴。二是,從百度官方的語(yǔ)氣看,驚雷算法是追溯既往的。百度清風(fēng)算法2.0上線時(shí)間:2018年5月上旬打擊對(duì)象:欺騙下載,欺騙用戶下載的網(wǎng)站永久封禁所謂欺騙下載包括:實(shí)際下載資源與用戶需求不符,下載資源無(wú)效,利用無(wú)關(guān)內(nèi)容誘導(dǎo)用戶下載。百度季風(fēng)算法上線時(shí)間:2018年6月中旬打擊對(duì)象:領(lǐng)域和內(nèi)容嚴(yán)重不匹配的熊掌號(hào)領(lǐng)域與內(nèi)容嚴(yán)重不匹配主要指的是兩個(gè)領(lǐng)域:注冊(cè)領(lǐng)域不是健康領(lǐng)域,也沒(méi)有醫(yī)療資質(zhì),卻發(fā)布醫(yī)療內(nèi)容;不是財(cái)經(jīng)領(lǐng)域,沒(méi)有財(cái)經(jīng)專業(yè)資質(zhì),卻發(fā)布財(cái)經(jīng)類內(nèi)容。百度細(xì)雨算法上線時(shí)間:2018年6月28號(hào)公布,7月中旬上線打擊對(duì)象:頁(yè)面標(biāo)題、正文作弊的供求、黃頁(yè)類B2B網(wǎng)站標(biāo)題作弊包括:冒出官網(wǎng),堆積關(guān)鍵詞,穿插火星文或特殊符號(hào)意圖吸引眼球,穿插受益方式如聯(lián)系電話。正文作弊包括:無(wú)價(jià)值內(nèi)容的采集、拼接或內(nèi)容不完整,各種方式(英文、諧音、圖片等)穿插聯(lián)系方式。    
02-01
2018
div css布局中CSS圖片大小自動(dòng)按比例等比例縮小圖片不變形解決技巧
div css布局中對(duì)于圖片列表或圖片排版時(shí),圖片不是固定寬度高度大小,但圖片占位是固定寬度高度,這個(gè)時(shí)候如果使用CSS固定死圖片大?。▽挾?高度),這個(gè)時(shí)候如果圖片相對(duì)于這個(gè)位置不是等比例大小,那么這張圖片就會(huì)變形,讓圖片變的不清晰,這個(gè)時(shí)候想讓圖片不變形又按比例縮放,如何解決?CSS圖片縮小不變形,圖片自動(dòng)縮小,圖片按比例等比例縮小不變形解決。解決方法有兩種:第一種,讓圖片和布局寬度高度成等比例,這樣CSS設(shè)置死寬度和高度,圖片也是等比例縮小,圖片也不會(huì)變形。比如淘寶,要求店鋪主上傳產(chǎn)品封面圖片是正方形的,為什么,因?yàn)閳D片寶貝展示列表都是正方形的排版布局,這樣要求上傳合適正方形寶貝封面圖片,也是讓圖片不變形。所以有條件的情況下,大家將首頁(yè)、圖片列表頁(yè)的布局寬度高度保持一致,上傳圖片時(shí)候?qū)D片先進(jìn)行處理為布局寬度高度時(shí)等比例放大尺寸的。第二種,使用CSS max-width和max-height實(shí)現(xiàn)圖片自動(dòng)等比例縮小很簡(jiǎn)單我們要使用到max-width和max-height,這樣即可設(shè)置對(duì)象圖片最大寬度和最大高度,這樣圖片就會(huì)等比例縮放圖片,然圖片相對(duì)不變形清晰。以下通過(guò)實(shí)例對(duì)比方法讓大家掌握CSS控制圖片縮小不變形技巧。一、原始描述 這里有個(gè)div,CSS寬度和CSS高度方便為300px和100px同時(shí)設(shè)置1px黑色邊框,里面放了一張圖片(圖片原始寬度650px為高度為406px)。并通過(guò)CSS固定死圖片寬度高度。1、HTML源代碼:<!DOCTYPE html>  <html>  <head>  <meta charset="utf-8" />  <title>圖片縮小不變形實(shí)例 www.divcss.com</title>  <style>  .divcss{ border:1px solid #000; width:300px; height:100px}  .divcss img{width:300px; height:100px}  </style>  </head>    <body>  <div class="divcss">  <img src="img.jpg" />  </div>  </body>  </html>2、CSS固定死圖片寬度高度實(shí)例截圖原始圖片展示:原始圖片截圖css固定寬度高度后變形的圖片截圖3、小結(jié),通過(guò)CSS固定對(duì)象內(nèi)圖片高度寬度,這樣圖片如果不是等比例縮小,那么圖片就變形了。二、CSS解決圖片縮小不變形實(shí)例使用max-width:300px或max-height:100px,即可解決圖片比例縮小。但這樣存在一個(gè)問(wèn)題,如果按照寬度縮放,但圖片過(guò)高會(huì)超出溢出盒子,這個(gè)時(shí)候需要對(duì)父級(jí)使用overflow:hidden隱藏超出圖片內(nèi)容。但是使用max-width或max-height,IE6不支持,我們需要設(shè)置個(gè)width:expression(this.width > 300 ? "300px" : this.width);或者h(yuǎn)eight:e-xpression(this.height>100?"100px":this.height);。解決IE6支持max-heightdiv css解決IE6支持max-width一般情況下只需要設(shè)置好寬度限制,比如這里只設(shè)置最大寬度為300px(max-width:300px),然后對(duì)父級(jí)使用overflow:hidden隱藏溢出圖片,同時(shí)為了兼容IE6我們?cè)O(shè)置個(gè)width:expression(this.width > 300 ? "300px" : this.width);解決即可。1、具體解決DIV+CSS實(shí)例代碼如下:<!DOCTYPE html>  <html>  <head>  <meta charset="utf-8" />  <title>圖片縮小不變形實(shí)例 www.divcss.com</title>  <style>  .divcss{ border:1px solid #000; width:300px; height:100px;overflow:hidden}  .divcss img{max-width:300px;_width:expression(this.width > 300 ? "300px" : this.width);}  </style>  </head>    <body>  <div class="divcss">  <img src="img.jpg" />  </div>  </body>  </html>2、瀏覽器測(cè)試效果截圖css圖片縮小等比例縮小后不變形截圖3、缺點(diǎn)介紹,如果使用此方法,兼容各大瀏覽器不變形,但圖片不是完整顯示的。
01-31
2018
盤點(diǎn)那些曾經(jīng)讓程序員目瞪口呆的Bug都有什么?
盤點(diǎn)那些曾經(jīng)讓程序員目瞪口呆的Bug都有什么?程序員一生與bug奮戰(zhàn),可謂是殺敵無(wú)數(shù),見(jiàn)怪不怪了!在某知識(shí)社交平臺(tái)中,一個(gè)“有哪些讓程序員目瞪口呆的bug”的話題引來(lái)了6700多萬(wàn)的閱讀,可見(jiàn)程序員們對(duì)這個(gè)話題的敏感度有多高。本文,筆者特意精選了部分優(yōu)質(zhì)答案供廣大程序員參考!作者:佚名來(lái)源:IT168程序員一生與bug奮戰(zhàn),可謂是殺敵無(wú)數(shù),見(jiàn)怪不怪了!在某知識(shí)社交平臺(tái)中,一個(gè)“有哪些讓程序員目瞪口呆的bug”的話題引來(lái)了6700多萬(wàn)的閱讀,可見(jiàn)程序員們對(duì)這個(gè)話題的敏感度有多高。本文,筆者特意精選了部分優(yōu)質(zhì)答案供廣大程序員參考!1、麻省理工“只能發(fā)500英里的郵件”該bug發(fā)生于麻省理工,當(dāng)時(shí)其系統(tǒng)管理員接到統(tǒng)計(jì)系主任的求助電話,主任在電話中說(shuō):“咱們的郵件系統(tǒng)無(wú)法發(fā)送距離500英里以外的地方,準(zhǔn)確地說(shuō)好像是520英里?!贝藭r(shí)的系統(tǒng)管理員內(nèi)心是“毫無(wú)波瀾”的,嗯!然后,他開(kāi)始了漫長(zhǎng)且苦逼的測(cè)試,最后發(fā)現(xiàn)郵件服務(wù)器操作系統(tǒng)(SunOS)被人更新了,因?yàn)椴僮飨到y(tǒng)發(fā)行版往往配備舊軟件,因此郵件軟件實(shí)際上是被降級(jí)了(Sendmail 8 -> Sendmail 5) ,最后的結(jié)果是:Sendmail 5試圖解析Sendmail 8的配置文件。所以,為什么一定是500英里呢?且看大神講解:2、int mian()這其實(shí)是一個(gè)書寫上的錯(cuò)誤,之所以會(huì)放在本文中,是因?yàn)楹芏喑绦騿T的職業(yè)生涯中都有過(guò)寫!錯(cuò)!的經(jīng)歷!main和mian傻傻看不出來(lái)!3、醫(yī)院急診科的程序bug一位程序員為醫(yī)院急診科設(shè)計(jì)了一套應(yīng)用程序,畢竟是為急診病人服務(wù),所以程序員在實(shí)驗(yàn)室內(nèi)認(rèn)真地測(cè)試無(wú)數(shù)遍,直至確定沒(méi)有問(wèn)題,才讓醫(yī)院部署使用。但是,醫(yī)院方面卻總是出現(xiàn)問(wèn)題,一拿到實(shí)驗(yàn)室就沒(méi)問(wèn)題。該名程序員于是深入醫(yī)院調(diào)查,最后發(fā)現(xiàn)是醫(yī)院的X光射線導(dǎo)致電腦內(nèi)存丟失了幾個(gè)bit信息,進(jìn)而讓程序出現(xiàn)問(wèn)題!4、谷歌的 Google Arts & Culture APP谷歌推出的Google Arts&Culture APP是一個(gè)可以將普通人的照片與藝術(shù)照進(jìn)行對(duì)比,匹配出與用戶上傳的照片最相像的一張藝術(shù)畫,運(yùn)行效果是這樣的:圖片上也會(huì)給出匹配度,但偏偏有些人的照片上傳后,給出來(lái)的藝術(shù)畫讓人哭笑不得,比如:5、硬件開(kāi)光的必要性某數(shù)據(jù)中心的火災(zāi)報(bào)警器因損壞,而在沒(méi)有發(fā)生火災(zāi)的情況下響起。詭異的是,數(shù)據(jù)中心內(nèi)確實(shí)出現(xiàn)了大面積的磁盤損壞和讀寫性能下降!經(jīng)排查,因?yàn)閳?bào)警器聲音太大影響了磁頭的運(yùn)動(dòng)!網(wǎng)友吐槽:看來(lái)給硬盤開(kāi)光很有必要??!6、某外資通信設(shè)備商的逆天bug(實(shí)在太長(zhǎng),給各位上圖)7、足以讓數(shù)據(jù)庫(kù)瞬間崩潰的bug愿望:在百萬(wàn)量級(jí)的數(shù)據(jù)庫(kù)里實(shí)現(xiàn)快速自我交叉匹配查詢。手段:建立臨時(shí)表提速。Bug:條件里忘記添加”a.id=b.prio”結(jié)果:臨時(shí)表從預(yù)計(jì)的幾千條達(dá)到了上億條,數(shù)據(jù)庫(kù)崩潰!?。?!8、足以讓系統(tǒng)癱瘓的bug9、程序員都能看懂的bug(反正筆者沒(méi)看懂,看懂的麻煩解釋一下)if (object == null) {object.doSomething();} else {object.doSomethingElse();}10、據(jù)傳,iPhone手機(jī)日歷上的bug11、購(gòu)買微軟Office套件visio不可使用outlook郵箱注冊(cè)網(wǎng)友爆料,自己在購(gòu)買正版Office套件visio時(shí),當(dāng)他在注冊(cè)頁(yè)面輸入微軟的outlook郵箱,系統(tǒng)居然提示系統(tǒng)中沒(méi)有outlook.com!12、集群宿主機(jī)已售內(nèi)存為負(fù)值?13、比較弱智的bug某網(wǎng)友:讓我目瞪口呆的BUG是update不加where...14、人類歷史上第一個(gè)程序BUG
01-31
2018
成為Java頂尖程序員 ,看這11本書就夠了
以下是我推薦給Java開(kāi)發(fā)者們的一些值得一看的好書。但是這些書里面并沒(méi)有Java基礎(chǔ)、Java教程之類的書,不是我不推薦,而是離我自己學(xué)習(xí) Java基礎(chǔ)技術(shù)也過(guò)去好幾年了,我學(xué)習(xí)的時(shí)候看的什么也忘了,所以我不能不負(fù)責(zé)任地推薦一些我自己都沒(méi)有看過(guò)的書給大家?!皩W(xué)習(xí)的最好途徑就是看書“,這是我自己學(xué)習(xí)并且小有了一定的積累之后的第一體會(huì)。個(gè)人認(rèn)為看書有兩點(diǎn)好處:1.能出版出來(lái)的書一定是經(jīng)過(guò)反復(fù)的思考、雕琢和審核的,因此從專業(yè)性的角度來(lái)說(shuō),一本好書的價(jià)值遠(yuǎn)超其他資料2.對(duì)著書上的代碼自己敲的時(shí)候方便“看完書之后再次提升自我的最好途徑是看一些相關(guān)的好博文“,我個(gè)人認(rèn)為這是學(xué)習(xí)的第二步,因?yàn)橐槐緯泻脦装夙?yè),好的博文是自己看書學(xué)習(xí)之后的一些總結(jié)和提煉,對(duì)于梳理學(xué)習(xí)的內(nèi)容很有好處,當(dāng)然這里不是說(shuō)自己的學(xué)習(xí)方法,就不再扯下去了。很多程序員們往往有看書的沖動(dòng),但不知道看哪些書,下面我就給各位Java程序猿們推薦一些好書(每本書的作者會(huì)加粗標(biāo)紅),其中絕大多數(shù)都是我自己平時(shí)在看的書,也算是我對(duì)于平時(shí)讀的書做一個(gè)小總結(jié)和讀后感吧。首先推薦的不是一本書,而是一個(gè)博客,也是我們博客園另外一位博友java_my_life。目前市面上講解設(shè)計(jì)模式的書很多,雖然我前面講了看書是最好的,但是對(duì)設(shè)計(jì)模式感興趣的朋友們,我推薦的是這個(gè)博客。這位博友的設(shè)計(jì)模式講得非常非常好,我認(rèn)為90%的內(nèi)容都是沒(méi)有問(wèn)題且很值得學(xué)習(xí)的,其講解設(shè)計(jì)模式的大體路線是:1、隨便開(kāi)篇點(diǎn)明該設(shè)計(jì)模式的定義2、圖文并茂講解該設(shè)計(jì)模式中的結(jié)構(gòu)3、以詳細(xì)的代碼形式寫一下該種設(shè)計(jì)模式的實(shí)現(xiàn)4、補(bǔ)充內(nèi)容5、講解該設(shè)計(jì)模式的優(yōu)缺點(diǎn)對(duì)于一個(gè)設(shè)計(jì)模式我們關(guān)注、學(xué)習(xí)的知識(shí)點(diǎn),不就是上面這些嗎?不 過(guò)我要重點(diǎn)提醒一下網(wǎng)友們,同一種設(shè)計(jì)模式的寫法有多種,并不是說(shuō)只有按某種寫法來(lái)寫才是這種設(shè)計(jì)模式。比方說(shuō)適配器模式,我們關(guān)注適配器模式一定要關(guān)注 的是什么是適配器模式不是怎么寫適配器模式,不要認(rèn)為某段代碼不是按照適配器模式的寫法寫下來(lái)的它就不是適配器模式了,記住這一點(diǎn),你在學(xué)習(xí)設(shè)計(jì)模式的時(shí) 候一定會(huì)對(duì)代碼中用到的設(shè)計(jì)模式有更深入的理解?!渡钊肜斫釰ava虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》如果你不滿足于做一個(gè)只會(huì)寫if…else…的Java程序員,而是希望更進(jìn)一步,我隨便舉幾個(gè)例子吧:1、了解Java代碼的底層運(yùn)行機(jī)制2、定位性能問(wèn)題3、對(duì)整個(gè)系統(tǒng)進(jìn)行性能調(diào)優(yōu)4、解決各種奇奇怪怪的線上線下問(wèn)題5、更加高級(jí)別的,為自己的項(xiàng)目量身定做一款適合自己項(xiàng)目的虛擬機(jī)那 么Java虛擬機(jī)是你必學(xué)的一門技術(shù)?!渡钊肜斫釰ava虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》作者是周志明,這本書可以說(shuō)是國(guó)內(nèi)寫得最好的有關(guān)Java虛 擬機(jī)的書籍,近半年,前前后后這本書我起碼看了有5遍。國(guó)內(nèi)寫虛擬機(jī)的書除了這本,其實(shí)還有一些其他的,我也買過(guò),不過(guò)粗略看下來(lái),很多內(nèi)容也是《深入理 解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》此書里面的。另外值得一提的是,《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》這本 書,有電子版的,網(wǎng)上搜一下就能下載到了。不過(guò)建議有興趣的朋友還是去買書看,電子版本下載到的一般是比較老的版本,相比最新修訂版的《深入理解Java 虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》,有很多作者新補(bǔ)充的知識(shí)點(diǎn)是沒(méi)有的。《HotSpot實(shí)戰(zhàn)》所有的Java虛擬機(jī)都是遵循著Java虛擬機(jī)規(guī)范來(lái)的,市面上的Java虛擬機(jī)幾十款,《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》一書里面講的虛擬機(jī)并不針對(duì)某種特定的虛擬機(jī),而是從Java虛擬機(jī)規(guī)范的角度來(lái)講解Java虛擬機(jī)。我們平時(shí)使用的乃至商用的大多數(shù)Java虛擬機(jī)都是Sun公司的HotSpot,大家cmd進(jìn)入命令行,使用”java -version”命令就可以看到了。如果希望在Java虛擬機(jī)規(guī)范的基礎(chǔ)上更加深入地去理解虛擬機(jī)的一些細(xì)節(jié)是怎么實(shí)現(xiàn)的,就可以看一下《HotSpot實(shí)戰(zhàn)》一書,作者是陳濤。不過(guò)由于HotSpot的源碼都是C/C++寫的,所以要求讀者有非常好的C/C++基礎(chǔ),如果對(duì)這兩門語(yǔ)言不是很熟悉的朋友,看這本書可能對(duì)你幫助不是很大。最后提一句,如果有興趣的朋友,不妨先去網(wǎng)上下載一個(gè)openJDK,HotSpot的源碼就在里面?!禞ava并發(fā)編程實(shí)戰(zhàn)》這本書常常被列入Java程序員必讀十大書籍排行榜前幾位,不過(guò)個(gè)人不是很推薦這本書?!禞ava并發(fā)編程實(shí)戰(zhàn)》作者是Brian Goetz,怎么說(shuō)呢,這本書前前后后我也看了兩遍左右,個(gè)人感受是:1、文字多代碼少2、講解多實(shí)踐少我 覺(jué)得這可能就是老外寫書的特點(diǎn)吧,因?yàn)镴ava是北美國(guó)家(加拿大、美國(guó))開(kāi)發(fā)和維護(hù)的,所以老外對(duì)Java方方面面的理論知識(shí)體系都掌握得是非常清楚和 透徹的。翻開(kāi)這本書看,多線程什么用、什么是死鎖、什么是競(jìng)爭(zhēng)、什么是線程安全等等,方方面面的知識(shí)點(diǎn)都用大量的文字篇幅講解,不免讓人感覺(jué)十分枯燥,也 難讓讀者有實(shí)質(zhì)性的進(jìn)步。我這本書看了兩遍也屬于一目十行意思,有興趣的地方就重點(diǎn)看一下。無(wú)論如何,作為一本常常位于Jva程序員必讀十大書籍排行榜前幾名的書,還是一定要推薦給大家的?!秊ava多線程編程核心技術(shù)》《Java多線程編程核心技術(shù)》作者高洪巖。想要學(xué)習(xí)多線程的朋友,這本書是我大力推薦的,我的個(gè)人博客里面二十多篇的多線程博文都是基于此書,并且在這本書的基礎(chǔ)上進(jìn)行提煉和總結(jié)而寫出來(lái)的。此書和《Java并發(fā)編程實(shí)戰(zhàn)》 相反,這本書的特點(diǎn)是大篇幅的代碼+小篇幅的精講解,可能這和中國(guó)人寫的書比較偏向?qū)嵱弥髁x的風(fēng)格有關(guān)。本書關(guān)于線程安全、synchronized、 Reentrant、Timer等等都用詳細(xì)的代碼進(jìn)行了講解,而且每個(gè)大知識(shí)點(diǎn)下的多個(gè)小知識(shí)點(diǎn)都會(huì)詳細(xì)講解到,非常有實(shí)踐價(jià)值。有興趣的朋友們,我相信只要你們跟著這本書里面的代碼敲、運(yùn)行、思考,三步走,對(duì)于多線程的使用與理解一定會(huì)進(jìn)幾大步。不 過(guò)這本書的缺點(diǎn)就是對(duì)于Java并發(fā)包下的一些類像CountDownLatch、Semphore、CyclicBarrier、Future、 Callable等都沒(méi)有講到,重點(diǎn)的CAS和AQS也沒(méi)有觸及,重點(diǎn)類的實(shí)現(xiàn)原理也沒(méi)有提。當(dāng)然,這很深入了,在學(xué)習(xí)了這本書之后如果能再去對(duì)這些知識(shí) 進(jìn)行一些學(xué)習(xí)、研究的話,你一定會(huì)慢慢成長(zhǎng)為一個(gè)很厲害的多線程高手?!禘ffective Java中文版》這是唯一一本我沒(méi)有買的書。初識(shí)這本書,是在我的博文Java代碼優(yōu)化(長(zhǎng)期更新)里面,底下評(píng)論的時(shí)候有朋友提到了這本書,當(dāng)時(shí)我說(shuō)要去買,不過(guò)這兩個(gè)月一直都沒(méi)時(shí)間去逛書店,甚是遺憾,之后肯定會(huì)找時(shí)間去買這本書的。《Effective  Java中文版》的作者是Joshua   Bloch,這個(gè)人就很厲害了,他是谷歌的首席架構(gòu)師,屬于超級(jí)技術(shù)大牛級(jí)別了吧,呵呵。由于沒(méi)有看過(guò)這本書,所以我不好發(fā)表評(píng)論,但是從這本書的知名度 以及其作者的來(lái)頭來(lái)看(多提一句,這本書也是Java之父James Gosling博士推崇的一本書),我相信這一定是一本值得一看的好書。好 的代碼是每個(gè)Java程序員都應(yīng)該去追求的,不是說(shuō)我今天寫一段好代碼相比寫一段爛代碼對(duì)性能會(huì)有多大的提升,更多的應(yīng)該是提升了代碼的可讀性以及可以規(guī) 避許多潛在的、未知的問(wèn)題,避免代碼上線之后出問(wèn)題而花時(shí)間去維護(hù)—-無(wú)論從時(shí)間成本、人力成本還是風(fēng)險(xiǎn)成本來(lái)說(shuō),這都是非常高的?!渡钊敕治鯦ava Web技術(shù)內(nèi)幕》《深入分析Java Web技術(shù)內(nèi)幕》,作者許令波,淘寶工程師。這本書我用一個(gè)字概括就是:全。真的非常全,HTTP、DNS、CDN、靜態(tài)化、Jetty、Tomcat、Servlet、Spring、MyBatis等等,什么都有,涉及知識(shí)面非常廣,但又不像專門精講某個(gè)知識(shí)點(diǎn)的書籍一樣講得非常深入,感覺(jué)這本書就是盡量去用短的篇幅講清楚一些Java Web使用到的技術(shù)的內(nèi)幕,讓讀者對(duì)這些知識(shí)點(diǎn)的技術(shù)內(nèi)幕有一個(gè)理性的認(rèn)識(shí)。不過(guò),盡管每個(gè)知識(shí)點(diǎn)的篇幅都不多,但是重點(diǎn)都基本講到了,是一本讓人真正有收獲的書。如果想進(jìn)一步了解這些技術(shù)的技術(shù)內(nèi)幕,就要自己去買相關(guān)書籍或者自己上網(wǎng)查資料了,有種拋磚引玉,或者說(shuō)師傅領(lǐng)進(jìn)門、修行在個(gè)人的感覺(jué)。《大型網(wǎng)站技術(shù)架構(gòu) 核心原理與案例分析》一個(gè)字評(píng)價(jià)這本書,屌;兩個(gè)字評(píng)價(jià)這本書,很屌;三個(gè)字評(píng)價(jià)這本書,非常屌。呵呵,好了,再說(shuō)下去可能別人以為我是水軍了?!洞笮途W(wǎng)站技術(shù)架構(gòu) 核心原理與案例分析》的作者是李智慧,原阿里巴巴技術(shù)專家。Java 的大多數(shù)應(yīng)用都是用在Web上的,現(xiàn)在只要稍微大型一點(diǎn)的Web應(yīng)用,都一定是一個(gè)分布式系統(tǒng),那么一個(gè)分布式系統(tǒng)用到了哪些技術(shù)?一個(gè)大型網(wǎng)站是如何從 一個(gè)小型網(wǎng)站成長(zhǎng)起來(lái)的?如何保證你的網(wǎng)站安全?分布式系統(tǒng)使用到了緩存,有哪些緩存?緩存的使用有哪些值得注意的事項(xiàng)?關(guān) 于分布式的知識(shí)點(diǎn),都在這本書里面有體現(xiàn),只有你想不到,沒(méi)有他寫不到,而且寫得非常易懂,基本屬于看一兩遍,再記一些筆記就知道是怎么一回事兒了。多看 幾遍,對(duì)分布式的理解一定會(huì)加深不少。而且里面不僅僅是分布式的知識(shí),還非常接地氣地寫了如何做一個(gè)好的架構(gòu)師,其實(shí)我認(rèn)為這不僅僅是寫給想做架構(gòu)師的讀 者看的,就是給讀者一些建議,如何更好地提出意見(jiàn)、如何更讓別人關(guān)注你的聲音、如何看到他人的優(yōu)點(diǎn),入木三分,讓人獲益匪淺?!洞笮途W(wǎng)站系統(tǒng)與Java中間件實(shí)踐》《大型網(wǎng)站系統(tǒng)與Java中間件實(shí)踐》作者曾憲杰,是淘寶的技術(shù)總監(jiān),算起來(lái)應(yīng)該在阿里有至少P8的級(jí)別了吧。這本書的部分內(nèi)容和上面一本李智慧的《大型網(wǎng)站技術(shù)架構(gòu) 核心原理與案例分析》有所重合,像分布式系統(tǒng)的演化、CDN、CAP理論和BASE理論等等,這也更說(shuō)明這些都是分布式系統(tǒng)或者說(shuō)是一個(gè)大型網(wǎng)站重點(diǎn)關(guān)注的內(nèi)容,當(dāng)作一次再學(xué)習(xí)也不錯(cuò)。本書要突出的重點(diǎn)是中間件三個(gè)字,中間件是分布式系統(tǒng)中一個(gè)非常重要的東西,其最重要的作用應(yīng)該就是解耦,降低模塊與模塊之間的強(qiáng)依賴,不同的模塊之間的依賴度降低,便可以各自獨(dú)立地開(kāi)發(fā)自己的功能,這也可以說(shuō)是軟件工程發(fā)展的目標(biāo)和驅(qū)動(dòng)力。因此,本書有一部分的內(nèi)容就是基于中間件,詳細(xì)講解了中間件與JMS的各種知識(shí),適合對(duì)分布式系統(tǒng)比較熟悉并且想要往中間件方面有一定研究的讀者?!稄腜axos到ZooKeeper 分布式一致性原理與實(shí)踐》《從Paxos到ZooKeeper 分布式一致性原理與實(shí)踐》,作者倪超,阿里巴巴工程師。這本書是我最近在研讀的一本書,和上面的《大型網(wǎng)站系統(tǒng)與Java中間件實(shí)踐》一樣,屬于分布式組件的范疇,屬于有些深入的內(nèi)容,當(dāng)然也是我自己的個(gè)人興趣。當(dāng)然,如果有志向做一個(gè)出色的大型網(wǎng)站架構(gòu)師、公司的技術(shù)總監(jiān)之類,這些知識(shí)當(dāng)然是必須掌握的。本書從分布式系統(tǒng)基本理論開(kāi)始講起,講到Paxos算法,最后慢慢引入到Zookeeper,循序漸進(jìn)。當(dāng)然,更多的我目前還不方便發(fā)表什么看法,因?yàn)檫@本書的第二張Paxos算法我都還沒(méi)有弄懂(Paxos算法確實(shí)有些難以理解和不太易懂),接下來(lái)的章節(jié)還沒(méi)有看下去。如果網(wǎng)友們所在的公司在使用Zookeeper,并且你又對(duì)Zookeeper感興趣想要研究一下它的原理的,這本書將是不二之選?!禡ySQL5.6從零開(kāi)始學(xué)》《MySQL5.6從零開(kāi)始學(xué)》,作者劉增杰和李坤。作為一名Java程序員,我認(rèn)為我們千萬(wàn)不要覺(jué)得數(shù)據(jù)庫(kù)是DBA的事情,數(shù)據(jù)庫(kù)對(duì)一個(gè)Java程序員來(lái)說(shuō)也是必須掌握的一門知識(shí),豐富的數(shù)據(jù)庫(kù)性能優(yōu)化經(jīng)驗(yàn)是一個(gè)頂尖程序員必備技能。目前主流的數(shù)據(jù)庫(kù)有Oracle和MySQL,當(dāng)然推薦大家的是MySQL,主要原因我認(rèn)為有兩點(diǎn):1、MySQL相比Oracle更輕量級(jí)、更小、安裝和卸載更方便,SQL其實(shí)都是差不多的,如果想學(xué)數(shù)據(jù)庫(kù),學(xué)MySQL就可以了,在家里面可以自己方便地研究,如果你的公司使用Oracle,只要再用對(duì)比學(xué)習(xí)法,關(guān)注一下Oracle和MySQL的差別即可2、隨著2009年阿里巴巴去IOE的運(yùn)動(dòng)的進(jìn)行,目前國(guó)內(nèi)的很多互聯(lián)網(wǎng)公司都會(huì)選擇MySQL作為它們使用的數(shù)據(jù)庫(kù),因?yàn)镸ySQL免費(fèi),所以既省錢又不需要出了問(wèn)題就依賴甲骨文公司MySQL學(xué)習(xí)我推薦的是這本我自己學(xué)習(xí)看的《MySQL5.6從零開(kāi)始學(xué)》,我是覺(jué)得挺好的這本書,書里面的知識(shí)點(diǎn)很細(xì)致、很全面,讀者選擇書籍的標(biāo)準(zhǔn)大多不就是這兩點(diǎn)嗎?《Spring源碼深度解析》《Spring源碼深度解析》,作者郝佳。Spring 這個(gè)框架做得太好了,功能太強(qiáng)大了,以至于很多開(kāi)發(fā)者都只知Spring,不知什么是工廠、什么是單例、什么是代理(我面試別人的真實(shí)體會(huì))。這種功能強(qiáng) 大的框架內(nèi)部一定是很復(fù)雜的實(shí)現(xiàn),這就導(dǎo)致一旦你的程序使用Spring,出了問(wèn)題,可能是Error、可能是Exception、可能是程序運(yùn)行結(jié)果不 是你的預(yù)期的,出現(xiàn)諸如此類問(wèn)題的時(shí)候,將會(huì)讓你感到困惑,除了上網(wǎng)查資料或者問(wèn)別人似乎沒(méi)有更好的解決辦法。研讀Spring的源代碼不失為一種很好的學(xué)習(xí)方法,我個(gè)人認(rèn)為這有很多好處:1、理解框架內(nèi)部的實(shí)現(xiàn)之后,可以主動(dòng)去解決問(wèn)題,而不需要依賴別人2、Spring框架內(nèi)部實(shí)現(xiàn)用到了很多設(shè)計(jì)模式,很好的代碼設(shè)計(jì)思路,這將會(huì)對(duì)你寫代碼、對(duì)你理解設(shè)計(jì)模式有很大的提高3、研究Spring框架將會(huì)大大增強(qiáng)你讀代碼的能力,我相信只要你能研究清楚Spring內(nèi)部是如何實(shí)現(xiàn)的,其他任何一個(gè)框架的源代碼都難不倒你總而言之,我認(rèn)為讀代碼的能力是一個(gè)普通的程序員和一個(gè)好的程序員之間最大的差別之一,前者只會(huì)把別人寫好的東西拿來(lái)用,后者不僅能用好,還清楚知道別人寫好的東西底層是如何實(shí)現(xiàn)的,在出現(xiàn)問(wèn)題的時(shí)候可以輕松解決。Spring源代碼,個(gè)人推薦《Spring源碼深度解析》一書,真要研究透并且寫清楚Spring源代碼,恐怕三四本書都不夠,作者在近400頁(yè)的篇幅中盡量去講解Spring源代碼是如何實(shí)現(xiàn)的,殊為不易,盡管無(wú)法講得完全,但是相信作者的講解配合上讀者自己的研究,一定可以對(duì)Spring的實(shí)現(xiàn)有更深度的理解。后記以 上就是我推薦給Java開(kāi)發(fā)者們的一些值得一看的好書。但是這些書里面并沒(méi)有Java基礎(chǔ)、Java教程之類的書,不是我不推薦,而是離我自己學(xué)習(xí) Java基礎(chǔ)技術(shù)也過(guò)去好幾年了,我學(xué)習(xí)的時(shí)候看的什么也忘了,所以我不能不負(fù)責(zé)任地推薦一些我自己都沒(méi)有看過(guò)的書給大家。對(duì)于Java基礎(chǔ)知識(shí)的學(xué)習(xí), 我提兩點(diǎn)建議吧:1、多寫多敲代碼,好的代碼與扎實(shí)的基礎(chǔ)知識(shí)一定是實(shí)踐出來(lái)的2、可以去尚學(xué)堂下載一下馬士兵的視頻來(lái)學(xué)習(xí)一下Java基礎(chǔ),還挺不錯(cuò)的,如果尚學(xué)堂官網(wǎng)上下載不了可以底下回復(fù),我的電腦里有最后,每一位讀到這里的網(wǎng)友,感謝你們能耐心地看完。希望在成為一名更優(yōu)秀的Java程序員的道路上,我們可以一起學(xué)習(xí)、一起進(jìn)步。
01-29
2018
爬蟲需謹(jǐn)慎,你不知道的爬蟲與反爬蟲套路!
面試的時(shí)候,因?yàn)殡p方爬蟲理念或者反爬蟲理念不同,也很可能互不認(rèn)可,影響自己的求職之路。本來(lái)程序員就有“文人相輕”的傾向,何況理念真的大不同。爬蟲與反爬蟲,是一個(gè)很不陽(yáng)光的行業(yè)。這里說(shuō)的不陽(yáng)光,有兩個(gè)含義。第一是,這個(gè)行業(yè)是隱藏在地下的,一般很少被曝光出來(lái)。很多公司對(duì)外都不會(huì)宣稱自己有爬蟲團(tuán)隊(duì),甚至隱瞞自己有反爬蟲團(tuán)隊(duì)的事實(shí)。這可能是出于公司戰(zhàn)略角度來(lái)看的,與技術(shù)無(wú)關(guān)。第二是,這個(gè)行業(yè)并不是一個(gè)很積極向上的行業(yè)。很多人在這個(gè)行業(yè)摸爬滾打了多年,積攢了大量的經(jīng)驗(yàn),但是悲哀的發(fā)現(xiàn),這些經(jīng)驗(yàn)很難兌換成閃光的簡(jiǎn)歷。面試的時(shí)候,因?yàn)殡p方爬蟲理念或者反爬蟲理念不同,也很可能互不認(rèn)可,影響自己的求職之路。本來(lái)程序員就有“文人相輕”的傾向,何況理念真的大不同。然而這就是程序員的宿命。不管這個(gè)行業(yè)有多么的不陽(yáng)光,依然無(wú)法阻擋大量的人進(jìn)入這個(gè)行業(yè),因?yàn)橛泄镜男枨?。那么,公司到底有什么樣的需求,?dǎo)致了我們真的需要爬蟲/反爬蟲呢?反爬蟲很好理解,有了爬蟲我們自然要反爬蟲。對(duì)于程序員來(lái)說(shuō),哪怕僅僅是出于“我就是要證明我技術(shù)比你好”的目的,也會(huì)去做。對(duì)于公司來(lái)說(shuō),意義更加重大,最少,也能降低服務(wù)器負(fù)載,光憑這一點(diǎn),反爬蟲就有充足的生存價(jià)值。那么爬蟲呢?最早的爬蟲起源于搜索引擎。搜索引擎是善意的爬蟲,可以檢索你的一切信息,并提供給其他用戶訪問(wèn)。為此他們還專門定義了 robots.txt 文件,作為君子協(xié)定,這是一個(gè)雙贏的局面。然而事情很快被一些人破壞了,爬蟲很快就變的不再“君子”了。后來(lái)有了“大數(shù)據(jù)”,無(wú)數(shù)的媒體鼓吹大數(shù)據(jù)是未來(lái)的趨勢(shì),吸引了一批又一批的炮灰去創(chuàng)辦大數(shù)據(jù)公司。這些人手頭根本沒(méi)有大數(shù)據(jù),他們的數(shù)據(jù)只要用一個(gè) U 盤就可以裝的下,怎么好意思叫大數(shù)據(jù)呢?這么點(diǎn)數(shù)據(jù)根本忽悠不了投資者,于是他們開(kāi)始寫爬蟲,拼命地爬取各個(gè)公司的數(shù)據(jù)。很快他們的數(shù)據(jù),就無(wú)法用一個(gè) U 盤裝下了。這個(gè)時(shí)候終于可以休息休息,然后出去吹噓融資啦。然而可悲的是,大容量 U 盤不斷地在發(fā)布,他們總是在拼命地追趕存儲(chǔ)增加的速度。以上是爬蟲與反爬蟲的歷史,下面通過(guò)四個(gè)方面深入談下爬蟲與反爬蟲:爬蟲反爬蟲運(yùn)行現(xiàn)狀爬蟲反爬蟲技術(shù)現(xiàn)狀爬蟲反爬蟲套路現(xiàn)狀爬蟲反爬蟲的未來(lái)爬蟲反爬蟲運(yùn)行現(xiàn)狀電子商務(wù)行業(yè)的爬蟲與反爬蟲更有趣一些,最初的爬蟲需求來(lái)源于比價(jià)。這是某些電商網(wǎng)站的核心業(yè)務(wù),大家買商品的時(shí)候,是一個(gè)價(jià)格敏感型用戶的話,很可能用過(guò)網(wǎng)上的比價(jià)功能(真心很好用啊)。毫無(wú)懸念,他們會(huì)使用爬蟲技術(shù)來(lái)爬取所有相關(guān)電商的價(jià)格。他們的爬蟲還是比較溫柔的,對(duì)大家的服務(wù)器不會(huì)造成太大的壓力。然而,這并不意味著大家喜歡被他爬取,畢竟這對(duì)其他電商是不利的,于是需要通過(guò)技術(shù)手段來(lái)做反爬蟲。按照技術(shù)人員的想法,對(duì)方用技術(shù)懟過(guò)來(lái),我們就要用技術(shù)懟回去,不能慫啊。這個(gè)想法是很好的,但是實(shí)際應(yīng)用起來(lái)根本不是這么回事。誠(chéng)然,技術(shù)是很重要的,但是實(shí)際操作上,更重要的是套路。誰(shuí)的套路更深,誰(shuí)就能玩弄對(duì)方于鼓掌之中。誰(shuí)的套路不行,有再好的技術(shù),也只能被耍的團(tuán)團(tuán)轉(zhuǎn)。這個(gè)雖然有點(diǎn)傷技術(shù)人員的自尊,然而,我們也不是第一天被傷自尊了。大家應(yīng)該早就習(xí)慣了吧。真實(shí)世界的爬蟲比例大家應(yīng)該聽(tīng)過(guò)一句話吧,大概意思是說(shuō),整個(gè)互聯(lián)網(wǎng)上大概有 50% 以上的流量其實(shí)是爬蟲。第一次聽(tīng)這句話的時(shí)候,我還不是很相信,我覺(jué)得這個(gè)說(shuō)法實(shí)在是太夸張了。怎么可能爬蟲比人還多呢? 爬蟲畢竟只是個(gè)輔助而已。現(xiàn)在做了這么久的反爬蟲,我依然覺(jué)得這句話太夸張了。50%?你在逗我?就這么少的量?舉個(gè)例子,某公司,某個(gè)頁(yè)面的接口,每分鐘訪問(wèn)量是 1.2 萬(wàn)左右,這里面有多少是正常用戶呢?50%?60%?還是?正確答案是:500 以下。也就是說(shuō),一個(gè)單獨(dú)的頁(yè)面,12000 的訪問(wèn)量里,有 500 是正常用戶,其余是爬蟲。注意,統(tǒng)計(jì)爬蟲的時(shí)候,考慮到你不可能識(shí)別出所有的爬蟲,因此,這 500 個(gè)用戶里面,其實(shí)還隱藏著一些爬蟲。那么爬蟲率大概是:(12000-500)/12000=95.8%。這個(gè)數(shù)字你猜到了嗎?這么大的爬蟲量,這么少的用戶量,大家到底是在干什么?是什么原因?qū)е铝嗣髅魇前偃思?jí)別的生意,卻需要萬(wàn)級(jí)別的爬蟲來(lái)做輔助? 95% 以上,19 保 1?答案可能會(huì)相當(dāng)令人噴飯,這些爬蟲大部分是由于決策失誤導(dǎo)致的??扌Σ坏玫臎Q策思路舉個(gè)例子,這個(gè)世界存在 3 家公司,售賣相同的電商產(chǎn)品,三家公司的名字分別是 A,B,C。這個(gè)時(shí)候,客戶去 A 公司查詢了下某商品的價(jià)格,看了下發(fā)現(xiàn)價(jià)格不好,于是他不打算買了,他對(duì)整個(gè)行業(yè)的訂單貢獻(xiàn)為 0。然而 A 公司的后臺(tái)會(huì)檢測(cè)到,我們有個(gè)客戶流失了,原因是他來(lái)查詢了一個(gè)商品,這個(gè)商品我們的價(jià)格不好,沒(méi)關(guān)系,我去爬爬別人試試。于是他分別爬取了 B 公司和 C 公司,B 公司的后臺(tái)檢測(cè)到有人來(lái)查詢價(jià)格,但是呢,最終沒(méi)有下單。他會(huì)認(rèn)為,嗯,我們流失了一個(gè)客戶。怎么辦呢?我可以爬爬看,別人什么價(jià)格。于是他爬取了 A 和 C,C 公司的后臺(tái)檢測(cè)到有人來(lái)查詢價(jià)格。。。。。過(guò)了一段時(shí)間,三家公司的服務(wù)器分別報(bào)警,訪問(wèn)量過(guò)高。三家公司的 CTO 也很納悶,沒(méi)有生成任何訂單啊,怎么訪問(wèn)量這么高?一定是其他兩家禽獸寫的爬蟲沒(méi)有限制好頻率。媽的,老子要報(bào)仇!于是分別做反爬蟲,不讓對(duì)方抓自己的數(shù)據(jù)。然后進(jìn)一步強(qiáng)化自己的爬蟲團(tuán)隊(duì)抓別人的數(shù)據(jù)。一定要做到:寧叫我抓天下人,休叫天下人抓我。然后,做反爬蟲的就要加班天天研究如何攔截爬蟲,做爬蟲的被攔截了,就要天天研究如何破解反爬蟲策略。大家就這么把資源全都浪費(fèi)在沒(méi)用的地方了,直到大家合并了,才會(huì)心平氣和的坐下來(lái)談?wù)?,都少抓點(diǎn)。最近國(guó)內(nèi)的公司有大量的合并,我猜這種“心平氣和”應(yīng)該不少吧?爬蟲反爬蟲技術(shù)現(xiàn)狀下面我們談?wù)?,爬蟲和反爬蟲分別都是怎么做的。為 Python 平反首先是爬蟲,爬蟲教程你到處都可以搜的到,大部分是 Python 寫的。我曾經(jīng)在一篇文章提到過(guò):用 Python 寫的爬蟲是最薄弱的,因?yàn)樘焐⒉贿m合破解反爬蟲邏輯,因?yàn)榉磁老x都是用 JavaScript 來(lái)處理。然而慢慢的,我發(fā)現(xiàn)這個(gè)理解有點(diǎn)問(wèn)題(當(dāng)然我如果說(shuō)我當(dāng)時(shí)是出于工作需要而有意黑 Python,你們信嗎。。。)。Python 的確不適合寫反爬蟲邏輯,但是 Python 是一門膠水語(yǔ)言,他適合捆綁任何一種框架。而反爬蟲策略經(jīng)常會(huì)變化的翻天覆地,需要對(duì)代碼進(jìn)行大刀闊斧的重構(gòu),甚至重寫。這種情況下,Python 不失為一種合適的解決方案?!∨e個(gè)例子,你之前是用 selenium 爬取對(duì)方的站點(diǎn),后來(lái)你發(fā)現(xiàn)自己被封了,而且封鎖方式十分隱蔽,完全搞不清到底是如何封的,你會(huì)怎么辦?你會(huì)跟蹤 selenium 的源碼來(lái)找到出錯(cuò)的地方嗎?你不會(huì),你只會(huì)換個(gè)框架,用另一種方式來(lái)爬取,然后你就把兩個(gè)框架都淺嘗輒止地用了下,一個(gè)都沒(méi)有深入研究過(guò)。因?yàn)闆](méi)等你研究好,也許人家又換方式了,你不得不再找個(gè)框架來(lái)爬取。畢竟,老板等著明天早上開(kāi)會(huì)要數(shù)據(jù)呢。老板一般都是早上八九點(diǎn)開(kāi)會(huì),所以你七點(diǎn)之前必須搞定。等你厭倦了,打算換個(gè)工作的時(shí)候,簡(jiǎn)歷上又只能寫“了解 n 個(gè)框架的使用”,僅此而已?!∵@就是爬蟲工程師的宿命,爬蟲工程師比外包還可憐。外包雖然不容易積累技術(shù),但是好歹有正常上下班時(shí)間,爬蟲工程師連這個(gè)權(quán)利都沒(méi)有。 然而反爬蟲工程師就不可憐了嗎?也不是的,反爬蟲有個(gè)天生的死穴,就是:誤傷率?!o(wú)法繞開(kāi)的誤傷率我們首先談?wù)?,面?duì)對(duì)方的爬蟲,你的第一反應(yīng)是什么?如果限定時(shí)間的話,大部分人給我的答案都是:封殺對(duì)方的 IP。然而,問(wèn)題就出在,IP 不是每人一個(gè)的,大的公司有出口 IP,ISP 有的時(shí)候會(huì)劫持流量讓你們走代理,有的人天生喜歡掛代理,有的人為了翻墻 24 小時(shí)掛 VPN。最坑的是,現(xiàn)在是移動(dòng)互聯(lián)網(wǎng)時(shí)代,你如果封了一個(gè) IP?不好意思,這是中國(guó)聯(lián)通的 4G 網(wǎng)絡(luò),5 分鐘之前還是別人,5 分鐘之后就換人了哦!因此,封 IP 的誤傷指數(shù)最高,并且,效果又是最差的,因?yàn)楝F(xiàn)在即使是最菜的新手,也知道用代理池了。你們可以去淘寶看下,幾十萬(wàn)的代理價(jià)值多少錢?我們就不談到處都有的免費(fèi)代理了。也有人說(shuō):我可以掃描對(duì)方端口,如果開(kāi)放了代理端口,那就意味著是個(gè)代理,我就可以封殺了呀?!∈聦?shí)是殘酷的,我曾經(jīng)封殺過(guò)一個(gè) IP,因?yàn)樗_(kāi)放了一個(gè)代理端口,而且是個(gè)很小眾的代理端口。不出一天就有人來(lái)報(bào)事件,說(shuō)我們一個(gè)分公司被攔截了,我一查 IP,還真是我封的 IP。我就很郁悶地問(wèn)他們 IT,開(kāi)這個(gè)端口干什么?他說(shuō)做郵件服務(wù)器啊。我說(shuō)為啥要用這么奇怪的端口?他說(shuō),這不是怕別人猜出來(lái)么?我就隨便取了個(gè)。掃描端口的進(jìn)階版,還有一種方式,就是去訂單庫(kù)查找這個(gè) IP 是否下過(guò)訂單,如果沒(méi)有,那么就是安全的;如果有,那就不安全,有很多網(wǎng)站會(huì)使用這個(gè)方法。然而這只是一種自欺欺人的辦法而已,只需要下一單,就可以永久洗白自己的 IP,天下還有比這更便宜的生意嗎?因此,封 IP,以及封 IP 的進(jìn)階版:掃描端口再封 IP,都是沒(méi)用的。根本不要考慮從 IP 下手,因?yàn)閷?duì)手會(huì)用大量的時(shí)間考慮如何躲避 IP 封鎖,你干嘛和人家硬碰呢?這沒(méi)有任何意義。那么,下一步你會(huì)考慮到什么?很多站點(diǎn)的工程師會(huì)考慮:既然沒(méi)辦法阻止對(duì)方,那我就讓它變的不可讀吧。我會(huì)用圖片來(lái)渲染關(guān)鍵信息,比如價(jià)格。這樣,人眼可見(jiàn),機(jī)器識(shí)別不出來(lái)?!∵@個(gè)想法曾經(jīng)是正確的,然而,坑爹的技術(shù)發(fā)展,帶給我們一個(gè)坑爹的技術(shù),叫機(jī)器學(xué)習(xí)。順便帶動(dòng)了一個(gè)行業(yè)的迅猛發(fā)展,叫 OCR。很快,識(shí)別圖像就不再是任何難題了,甚至連人眼都很難識(shí)別的驗(yàn)證碼,有的 OCR 都能搞定,比我肉眼識(shí)別率都高。更何況,現(xiàn)在有了打碼平臺(tái),用資本都可以搞定,都不需要技術(shù)。那么,下一步你會(huì)考慮什么?這個(gè)時(shí)候,后端工程師已經(jīng)沒(méi)有太多的辦法可以搞了?!〔贿^(guò)后端搞不定的事情,一般都推給前端啊,前端從來(lái)都是后端搞不定問(wèn)題時(shí)的背鍋俠。多少年來(lái)我們都是這么過(guò)來(lái)的,前端工程師這個(gè)時(shí)候就要勇敢地站出來(lái)了:“都不要得瑟了,來(lái)比比誰(shuí)的前端知識(shí)牛逼,你牛逼我就讓你爬。”我不知道這篇文章的讀者里有多少前端工程師,我只是想順便提一下:你們以后將會(huì)是更加搶手的人才。前端工程師的逆襲我們知道,一個(gè)數(shù)據(jù)要顯示到前端,不僅僅是后端輸出就完事了,前端要做大量的事情,比如取到 json 之后,至少要用 template 轉(zhuǎn)成 html 吧?這已經(jīng)是步驟最少最簡(jiǎn)單的了,然后你總要用 css 渲染下吧? 這也不是什么難事。等等,你還記得自己第一次做這個(gè)事情的時(shí)候的經(jīng)歷嗎?真的,不是什么難事嗎?有沒(méi)有經(jīng)歷過(guò),一個(gè) html 標(biāo)簽拼錯(cuò),或者沒(méi)有閉合,導(dǎo)致頁(yè)面錯(cuò)亂?一個(gè) css 沒(méi)弄好,導(dǎo)致整個(gè)頁(yè)面都不知道飄到哪去了?這些事情,你是不是很想讓別人再經(jīng)歷一次?這件事情充分說(shuō)明了:讓一個(gè)資深的前端工程師來(lái)把事情搞復(fù)雜一點(diǎn),對(duì)方如果配備了資深前端工程師來(lái)破解,也需要耗費(fèi) 3 倍以上的時(shí)間。畢竟是讀別人的代碼,別人寫代碼用了一分鐘,你總是要讀兩分鐘,然后罵一分鐘吧?這已經(jīng)算很少的了。如果對(duì)方?jīng)]有配備前端工程師。。。那么經(jīng)過(guò)一段時(shí)間,他們會(huì)成長(zhǎng)為前端工程師。之后,由于前端工程師的待遇比爬蟲工程師稍好一些,他們很快會(huì)離職做前端,既緩解了前端人才缺口,又可以讓對(duì)方缺人,重招。而他們一般是招后端做爬蟲,這些人需要再接受一次折磨,再次成長(zhǎng)為前端工程師,這不是很好的事情嗎?所以,如果你手下的爬蟲工程師離職率很高,請(qǐng)仔細(xì)思考下,是不是自己的招聘方向有問(wèn)題。那么前端最坑爹的技術(shù)是什么呢?前端最坑爹的,也是最強(qiáng)大的,就是我們的:JavaScript。JavaScript 有大量的花樣可以玩,毫不夸張的說(shuō),一周換一個(gè) feature(Bug)給對(duì)方學(xué)習(xí),一年不帶重樣的。這個(gè)時(shí)候你就相當(dāng)于一個(gè)面試官,對(duì)方要通過(guò)你的面試才行。舉個(gè)例子,在 Array.prototyp e里,有沒(méi)有 map 啊?什么時(shí)候有啊?你說(shuō)你是 xx 瀏覽器,那你這個(gè)應(yīng)該是有還是應(yīng)該沒(méi)有???你說(shuō)這個(gè)可以有???可是這個(gè)真沒(méi)有啊。那[]能不能在 string 里面獲取字符???哪個(gè)瀏覽器可以哪個(gè)不行啊?咦!你為什么支持 WebKit 前綴啊?等等,剛剛你還支持怎么現(xiàn)在不支持了???你聲明的不對(duì)啊。這些對(duì)于前端都是簡(jiǎn)單的知識(shí),已經(jīng)習(xí)以為常了,但是對(duì)于后端來(lái)說(shuō)簡(jiǎn)直就是噩夢(mèng)。然而,前端人員自己作死,研究出了一個(gè)東西,叫:Nodejs?;?V8,秒殺所有的 js 運(yùn)行。不過(guò) Nodejs 實(shí)現(xiàn)了大量的 feature,都是瀏覽器不存在的,你隨隨便便訪問(wèn)一些東西(比如你為什么會(huì)支持 process.exit),都會(huì)把 node 坑的好慘好慘。而且瀏覽器里的 js,你拉到后臺(tái)用 Nodejs 跑,你是不是想到了什么安全漏洞?這個(gè)是不是叫,代碼與數(shù)據(jù)混合?如果他在 js 里跑點(diǎn)惡心的代碼,瀏覽器不支持但是 node 支持怎么辦?還好,爬蟲工程師還有 phantomjs。但是,你怎么沒(méi)有定位??? 哈哈,你終于模擬出了定位。但是不對(duì)啊,根據(jù)我當(dāng)前設(shè)置的安全策略你現(xiàn)在不應(yīng)該能定位啊?你是怎么定出來(lái)的?連 phantomjs 的作者自己都維護(hù)不下去了,你真的愿意繼續(xù)用嗎?當(dāng)然了,最終,所有的反爬蟲策略都逃不脫被破解的命運(yùn)。但是這需要時(shí)間,反爬蟲需要做的就是頻繁發(fā)布,拖垮對(duì)方。如果對(duì)方兩天可以破解你的系統(tǒng),你就一天一發(fā)布,那么你就是安全的。這個(gè)系統(tǒng)甚至可以改名叫做“每天一道反爬題,輕輕松松學(xué)前端”。誤傷,還是誤傷這又回到了我們開(kāi)始提到的“誤傷率”的問(wèn)題了。我們知道,發(fā)布越頻繁,出問(wèn)題的概率越高。那么,如何在頻繁發(fā)布的情況下,還能做到少出問(wèn)題呢?此外還有一個(gè)問(wèn)題,我們寫了大量的“不可讀代碼”給對(duì)方,的確能給對(duì)方造成大量的壓力,但是,這些代碼我們自己也要維護(hù)啊。如果有一天忽然說(shuō),沒(méi)人爬我們了,你們把代碼下線掉吧。這個(gè)時(shí)候?qū)懘a的人已經(jīng)不在了,你們?cè)趺粗廊绾蜗戮€這些代碼呢?這兩個(gè)問(wèn)題我暫時(shí)不能公布我們的做法,但是大家都是聰明人,應(yīng)該都是有自己的方案的,軟件行業(yè)之所以忙的不得了,無(wú)非就是在折騰兩件事,一個(gè)是如何將代碼拆分開(kāi),一個(gè)是如何將代碼合并起來(lái)。關(guān)于誤傷率,我只提一個(gè)小的 tip:你可以只開(kāi)啟反爬蟲,但是不攔截,先放著,發(fā)統(tǒng)計(jì)信息給自己,相當(dāng)于模擬演練。等統(tǒng)計(jì)的差不多了,發(fā)現(xiàn)真的開(kāi)啟了也不會(huì)有什么問(wèn)題,那就開(kāi)啟攔截或者開(kāi)啟造假。這里就引發(fā)了一個(gè)問(wèn)題,往往一個(gè)公司的各個(gè)頻道,爬取難度是不一樣的。原因就是,誤傷檢測(cè)這種東西與業(yè)務(wù)相關(guān),公司的基礎(chǔ)部門很難做出通用的,只能各個(gè)部門自己做,甚至有的部門做了有的沒(méi)做。因此引發(fā)了爬蟲界一個(gè)奇葩的通用做法:如果 PC 頁(yè)面爬不到,就去 H5 試試,如果 H5 很麻煩,就去 PC 碰碰運(yùn)氣。爬蟲反爬蟲套路現(xiàn)狀那么一旦有發(fā)現(xiàn)對(duì)方數(shù)據(jù)造假怎么辦?早期的時(shí)候,大家都是要抽查數(shù)據(jù),通過(guò)數(shù)據(jù)來(lái)檢測(cè)對(duì)方是否有造假,這個(gè)需要人工核對(duì),成本非常高。可是那已經(jīng)是洪荒時(shí)代的事情了。如果你們公司還在通過(guò)這種方式來(lái)檢測(cè),說(shuō)明你們的技術(shù)還比較落伍。之前我們的競(jìng)爭(zhēng)對(duì)手是這么干的:他們會(huì)抓取我們兩次,一次是他們解密出來(lái) key 之后,用正經(jīng)方式來(lái)抓取,這次的結(jié)果定為 A。一次是不帶 key,直接來(lái)抓,這次的結(jié)果定為 B。根據(jù)前文描述,我們可以知道,B 一定是錯(cuò)誤的。那么如果 A 與 B 相等,說(shuō)明自己中招了,這個(gè)時(shí)候會(huì)停掉爬蟲,重新破解。不要回應(yīng)所以之前有一篇關(guān)于爬蟲的文章,說(shuō)如何破解我們的。一直有人要我回復(fù)下,我一直覺(jué)得沒(méi)什么可以回復(fù)的。第一,反爬蟲被破解了是正常的。這個(gè)世界上有個(gè)萬(wàn)能的爬蟲手段,叫“人肉爬蟲”。假設(shè)我們就是有錢,在印度開(kāi)個(gè)分公司,每天雇便宜的勞動(dòng)力用鼠標(biāo)直接來(lái)點(diǎn),你能拿我怎么辦?第二,我們真正關(guān)心的是后續(xù)的這些套路。而我讀了那篇文章,發(fā)現(xiàn)只是調(diào)用了selenium并且拿到了結(jié)果,就認(rèn)為自己成功了。我相信你讀到這里,應(yīng)該已經(jīng)明白為什么我不愿意回復(fù)了。我們最重要的是工作,而不是誰(shuí)打誰(shuí)的臉。大家如果經(jīng)常混技術(shù)社區(qū)就會(huì)發(fā)現(xiàn),每天熱衷于打別人臉的,一般技術(shù)都不是很好。當(dāng)然這并不代表我們技術(shù)天下第一什么的,我們每天面對(duì)大量的爬蟲,還是遇到過(guò)很多高手的。就如同武俠小說(shuō)里一樣,高手一般都比較低調(diào),他們默默地拿走數(shù)據(jù),很難被發(fā)現(xiàn),而且頻率極低,不會(huì)影響我們的考評(píng)。你們應(yīng)該明白,這是智商與情商兼具的高手了。我們還碰到拉走我們 js,砍掉無(wú)用的部分直接解出 key,相當(dāng)高效不拖泥帶水的爬蟲,一點(diǎn)廢請(qǐng)求都沒(méi)有(相比某些爬蟲教程,總是教你多訪問(wèn),寫沒(méi)用的 url 免得被發(fā)現(xiàn),真的不知道高到哪里去了。這樣做除了會(huì)導(dǎo)致機(jī)器報(bào)警,導(dǎo)致對(duì)方加班封鎖以外,對(duì)你自己沒(méi)有任何好處)。而我們能發(fā)現(xiàn)這一點(diǎn)僅僅是是因?yàn)樗驼{(diào)地寫了一篇博客,通篇只介紹技術(shù),沒(méi)有提任何沒(méi)用的東西。這里我只是順便發(fā)了點(diǎn)小牢騷,就是希望后續(xù)不要總是有人讓我回應(yīng)一些關(guān)于爬蟲的文章。線下我認(rèn)識(shí)很多爬蟲工程師,水平真的很好,也真的很低調(diào)(不然你以為我是怎么知道如何對(duì)付爬蟲的。。。),大家都是一起混的,不會(huì)產(chǎn)生“一定要互相打臉”的情緒。進(jìn)化早期我們和競(jìng)爭(zhēng)對(duì)手打的時(shí)候,雙方的技術(shù)都比較初級(jí)。后來(lái)慢慢的,爬蟲在升級(jí),反爬蟲也在升級(jí),這個(gè)我們稱為“進(jìn)化”。我們?cè)?jīng)給對(duì)方放過(guò)水,來(lái)試圖拖慢他們的進(jìn)化速度,然而,效果不是特別理想。爬蟲是否進(jìn)化,取決于爬蟲工程師自己的 KPI,而不是反爬蟲的進(jìn)化速度。后期打到白熱化的時(shí)候,用的技術(shù)越來(lái)越匪夷所思。舉個(gè)例子,很多人會(huì)提,做反爬蟲會(huì)用到 canvas 指紋,并認(rèn)為是最高境界。其實(shí)這個(gè)對(duì)于反爬蟲來(lái)說(shuō)也只是個(gè)輔助,canvas 指紋的含義是,因?yàn)椴煌布?duì) canvas 支持不同,因此你只要畫一個(gè)很復(fù)雜的 canvas,那么得出的 image,總是存在像素級(jí)別的誤差。考慮到爬蟲代碼都是統(tǒng)一的,就算起 selenium,也是 Ghost 的,因此指紋一般都是一致的,因此繞過(guò)幾率非常低。但是!這個(gè)東西天生有兩個(gè)缺陷。第一是,無(wú)法驗(yàn)證合法性。當(dāng)然了,你可以用非對(duì)稱加密來(lái)保證合法,但是這個(gè)并不靠譜。其次,canvas 的沖突概率非常高,遠(yuǎn)遠(yuǎn)不是作者宣稱的那樣,沖突率極低。也許在國(guó)外沖突是比較低,因?yàn)閲?guó)外的語(yǔ)言比較多。但是國(guó)內(nèi)公司通常是 IT 統(tǒng)一裝機(jī),無(wú)論是軟件還是硬件都驚人的一致。我們測(cè)試 canvas 指紋的時(shí)候,在攜程內(nèi)部隨便找了 20 多臺(tái)機(jī)器,得出的指紋都完全一樣,一丁點(diǎn)差別都沒(méi)有。因此,有些“高級(jí)技巧”一點(diǎn)都不實(shí)用。法律途徑此外就是大家可能都考慮過(guò)的:爬蟲違法嗎?能起訴對(duì)方讓對(duì)方不爬嗎?法務(wù)給的答案到是很干脆,可以,前提是證據(jù)。遺憾的是,這個(gè)世界上大部分的爬蟲爬取數(shù)據(jù)是不會(huì)公布到自己網(wǎng)站的,只是用于自己的數(shù)據(jù)分析。因此,即使有一些關(guān)于爬蟲的官司做為先例,并且已經(jīng)打完了,依然對(duì)我們沒(méi)有任何幫助。反爬蟲,在對(duì)方足夠低調(diào)的情況下,注定還是個(gè)技術(shù)活。搞事情,立 Flag到了后來(lái),我們已經(jīng)不再局限于打打技術(shù)了,反爬蟲的代碼里我們經(jīng)常埋點(diǎn)小彩蛋給對(duì)方,比如寫點(diǎn)注釋給對(duì)方。雙方通過(guò)互相交戰(zhàn),頻繁發(fā)布,居然聊的挺 high 的。比如問(wèn)問(wèn)對(duì)方,北京房?jī)r(jià)是不是很高啊?對(duì)方回應(yīng),歐巴,我可是憑本事吃飯哦。繼續(xù)問(wèn),搖到號(hào)了嗎?諸如此類等等。這樣的事情你來(lái)我往的,很容易動(dòng)搖對(duì)方的軍心,還是很有作用的。試想一下,如果你的爬蟲工程師在大年三十還苦逼加班的時(shí)候,看到對(duì)方留言說(shuō)自己拿到了 n 個(gè)月的年終獎(jiǎng),你覺(jué)得你的工程師,離辭職還遠(yuǎn)嗎?最后,我們終于搞出了大動(dòng)作,覺(jué)得一定可以坑對(duì)方很久了。我們還特意去一家小火鍋店吃了一頓,慶祝一下,準(zhǔn)備明天上線。大家都知道,一般立 Flag 的下場(chǎng)都比較慘的,兩個(gè)小時(shí)的自助火鍋,我們剛吃五分鐘,就得到了我們投資競(jìng)爭(zhēng)對(duì)手的消息。后面的一個(gè)多小時(shí),團(tuán)隊(duì)氣氛都很尷尬,誰(shuí)也說(shuō)不出什么話。我們組有個(gè)實(shí)習(xí)生,后來(lái)鼓足勇氣問(wèn)了我一個(gè)問(wèn)題:“我還能留下來(lái)嗎?”畢竟,大部分情況下,技術(shù)還是要屈服于資本的力量。爬蟲反爬蟲的未來(lái)與競(jìng)爭(zhēng)對(duì)手和解之后,我們?nèi)グ菰L對(duì)方,大家坐在了一起。之前網(wǎng)上自稱妹子的,一個(gè)個(gè)都是五大三粗的漢子,這讓我們相當(dāng)絕望。在場(chǎng)唯一的一個(gè)妹子還是我們自己帶過(guò)去的(就是上面提到的實(shí)習(xí)生),感覺(jué)套路了這么久,最終還是被對(duì)方套路了。好在,吃的喝的都很好,大家玩的還是比較 high 的。后續(xù)就是和平年代啦,大家不打仗了,反爬蟲的邏輯扔在那做個(gè)防御,然后就開(kāi)放白名單允許對(duì)方爬取了。群里經(jīng)常叫的就是:xxx 你怎么頻率這么高,xxx 你為什么這個(gè)接口沒(méi)給我開(kāi)放,為什么我爬的東西不對(duì)我靠你是不是把我封了啊,諸如此類的。和平年代的反爬蟲比戰(zhàn)爭(zhēng)年代還難做,因?yàn)閼?zhàn)爭(zhēng)年代,誤傷率只要不是太高,公司就可以接受。和平年代大家不能搞事情,誤傷率稍稍多一點(diǎn),就會(huì)有人叫:好好的不賺錢,瞎搞什么搞。此外,戰(zhàn)爭(zhēng)年代只要不攔截用戶,就不算誤傷。和平年代還要考慮白名單,攔截了合作伙伴也是誤傷,因此各方面會(huì)更保守一些。不過(guò),總體來(lái)說(shuō)還是和平年代比較 happy,畢竟,誰(shuí)會(huì)喜歡沒(méi)事加班玩呢。然而和平持續(xù)的不是很久,很快就有了新的競(jìng)爭(zhēng)對(duì)手選擇爬蟲來(lái)與我們打,畢竟,這是一個(gè)利益驅(qū)使的世界。只要有大量的利潤(rùn),資本家就會(huì)殺人放火,這不是我們這些技術(shù)人員可以決定的,我們希望天下無(wú)蟲,但是我們又有什么權(quán)利呢。好在,這樣可以催生更多的職位,順便提高大家的身價(jià),也算是個(gè)好事情吧。
01-31
2018
webrtc中rtcp反饋與碼率控制模塊分析
0. 參考文檔1 google congestion control1. 簡(jiǎn)介webrtc的帶寬估計(jì)分為兩部分,一部分為發(fā)送端根據(jù)rtcp反饋信息進(jìn)行反饋,另一部分為接收端根據(jù)收到的rtp數(shù)據(jù)進(jìn)行相應(yīng)的碼率估計(jì)[1]。 本文先分析發(fā)送端根據(jù)rtcp反饋信息進(jìn)行碼率調(diào)整的部分代碼。具體計(jì)算公式: 2. 代碼結(jié)構(gòu)2.1 類關(guān)系rtp_stream_receiver中有一個(gè)繼承自抽象類RtpRtcp的ModuleRtpRtcpImpl,ModuleRtpRtcpImpl中有一個(gè)rtcp_receiver。當(dāng)有RTCP包到來(lái)時(shí),逐層處理至rtcp_receiver,當(dāng)包是rtcp receiver report包,則會(huì)將包解析,然后在ModuleRtpRtcpImpl中再次調(diào)用rtcp_receiver中的TriggerCallbacksFromRTCPPacket函數(shù),觸發(fā)對(duì)應(yīng)rtcp的一些事件,反饋觸發(fā)的主要是_cbRtcpBandwidthObserver的觀察者(RtcpBandwidthObserverImpl),這個(gè)觀察者收到對(duì)應(yīng)的report block之后會(huì)計(jì)算成帶寬估計(jì)所需要的參數(shù),并調(diào)用屬主bitratecontrolImpl類對(duì)帶寬進(jìn)行估計(jì),這里會(huì)調(diào)用SendSideBandwidthEstimation中的UpdateReceiverBlock進(jìn)行實(shí)際的帶寬評(píng)估。2.2 調(diào)用關(guān)系圖3. 代碼分析3.1 HandleReportBlock這個(gè)函數(shù)中最主要的部分就是RTT的計(jì)算,webrtc中對(duì)于RTT平滑的因子是一個(gè)線性增長(zhǎng)的因子。/* 這個(gè)函數(shù)根據(jù)對(duì)應(yīng)的report block生成了一個(gè)新的RTCPReportBlockInformation結(jié)構(gòu)體,  * 并計(jì)算出對(duì)應(yīng)的RTT,多report block在調(diào)用點(diǎn)處執(zhí)行循環(huán)。  */ void RTCPReceiver::HandleReportBlock(     const RTCPUtility::RTCPPacket& rtcpPacket,     RTCPPacketInformation& rtcpPacketInformation,     uint32_t remoteSSRC)     EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) {   // This will be called once per report block in the RTCP packet.   // We filter out all report blocks that are not for us.   // Each packet has max 31 RR blocks.   //   // We can calc RTT if we send a send report and get a report block back.   // |rtcpPacket.ReportBlockItem.SSRC| is the SSRC identifier of the source to   // which the information in this reception report block pertains.   // Filter out all report blocks that are not for us.   if (registered_ssrcs_.find(rtcpPacket.ReportBlockItem.SSRC) ==       registered_ssrcs_.end()) {     // This block is not for us ignore it.     return;   }   RTCPReportBlockInformation* reportBlock =       CreateOrGetReportBlockInformation(remoteSSRC,                                         rtcpPacket.ReportBlockItem.SSRC);   if (reportBlock == NULL) {     LOG(LS_WARNING) << "Failed to CreateReportBlockInformation("                     << remoteSSRC << ")";     return;   }   // 用于RTCP超時(shí)的計(jì)算。   _lastReceivedRrMs = _clock->TimeInMilliseconds();   // 其他字段的拷貝。   const RTCPPacketReportBlockItem& rb = rtcpPacket.ReportBlockItem;   reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC;   reportBlock->remoteReceiveBlock.sourceSSRC = rb.SSRC;   reportBlock->remoteReceiveBlock.fractionLost = rb.FractionLost;   reportBlock->remoteReceiveBlock.cumulativeLost =       rb.CumulativeNumOfPacketsLost;   if (rb.ExtendedHighestSequenceNumber >       reportBlock->remoteReceiveBlock.extendedHighSeqNum) {     // We have successfully delivered new RTP packets to the remote side after     // the last RR was sent from the remote side.     _lastIncreasedSequenceNumberMs = _lastReceivedRrMs;   }   reportBlock->remoteReceiveBlock.extendedHighSeqNum =       rb.ExtendedHighestSequenceNumber;   reportBlock->remoteReceiveBlock.jitter = rb.Jitter;   reportBlock->remoteReceiveBlock.delaySinceLastSR = rb.DelayLastSR;   reportBlock->remoteReceiveBlock.lastSR = rb.LastSR;   if (rtcpPacket.ReportBlockItem.Jitter > reportBlock->remoteMaxJitter) {     reportBlock->remoteMaxJitter = rtcpPacket.ReportBlockItem.Jitter;   }   int64_t rtt = 0;   uint32_t send_time = rtcpPacket.ReportBlockItem.LastSR;   // RFC3550, section 6.4.1, LSR field discription states:   // If no SR has been received yet, the field is set to zero.   // Receiver rtp_rtcp module is not expected to calculate rtt using   // Sender Reports even if it accidentally can.   if (!receiver_only_ && send_time != 0) {     // 當(dāng)RR在SR之前發(fā)送,send_time為0.     // delay計(jì)算:     // Send SR                                                       Receive RR     //  |                          delay in RR                           |     //  |                        ||                         |     //  ||             ||     //     // RTT = total_time - delay_in_RR     //     = receiver_rr_time - send_sr_time - delay_in_RR     // 即使中間幾個(gè)SR丟包,但是如果RTT本身是平滑的,那么RTT不會(huì)受到這幾個(gè)丟包的影響     // 因?yàn)镾R->RR之間的delay可以精確計(jì)算。     uint32_t delay = rtcpPacket.ReportBlockItem.DelayLastSR;     // Local NTP time.     uint32_t receive_time = CompactNtp(NtpTime(*_clock));     // RTT in 1/(2^16) seconds.     uint32_t rtt_ntp = receive_time - delay - send_time;     // Convert to 1/1000 seconds (milliseconds).     rtt = CompactNtpRttToMs(rtt_ntp);     if (rtt > reportBlock->maxRTT) {       // Store max RTT.       reportBlock->maxRTT = rtt;     }     if (reportBlock->minRTT == 0) {       // First RTT.       reportBlock->minRTT = rtt;     } else if (rtt < reportBlock->minRTT) {       // Store min RTT.       reportBlock->minRTT = rtt;     }     // Store last RTT.     reportBlock->RTT = rtt;     // store average RTT     // RTT的平滑計(jì)算。     // 如果這個(gè)塊是在CreateOrGetReportBlockInformation新生成的,     // 則權(quán)重會(huì)從0開(kāi)始隨著受到的report逐漸遞增。     // srtt(i) = i/(i+1)*srtt(i-1) + 1/(i+1)*rtt + 0.5     if (reportBlock->numAverageCalcs != 0) {       float ac = static_cast(reportBlock->numAverageCalcs);       float newAverage =           ((ac / (ac + 1)) * reportBlock->avgRTT) + ((1 / (ac + 1)) * rtt);       reportBlock->avgRTT = static_cast(newAverage + 0.5f);     } else {       // First RTT.       reportBlock->avgRTT = rtt;     }     reportBlock->numAverageCalcs++;   }   TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR_RTT", rb.SSRC,                     rtt);   // 添加回rtcpPacketInformation,在ModuleRtpRtcpImpl中會(huì)使用這個(gè)進(jìn)行事件回調(diào)。   rtcpPacketInformation.AddReportInfo(*reportBlock); }3.2 UpdateMinHistory這個(gè)函數(shù)主要用于更新變量min_bitrate_history_,這個(gè)變量將會(huì)作用于上升區(qū)間,用來(lái)作為基數(shù),這里簡(jiǎn)單描述下。// Updates history of min bitrates. // After this method returns min_bitrate_history_.front().second contains the // min bitrate used during last kBweIncreaseIntervalMs. // 主要結(jié)合這個(gè)函數(shù)解釋下變量min_bitrate_history_ // 這個(gè)變量的兩個(gè)維度,front記錄的是離當(dāng)前最遠(yuǎn)的時(shí)間, // 每個(gè)速率都是按照時(shí)間先后順序逐漸push到尾部。 // 因此更新的時(shí)候,需要先將超時(shí)的元素從列表頭剔除。 // 后一個(gè)維度是最小速率值, // 在相同的時(shí)間區(qū)間內(nèi),保留最小的速率值。 // |-------Interval 1---------|----------Interval 2------| // |                          |                          | // |--t1 < t2 < t3 < t4 < t5--|--t1 < t2 < t3 < t4 < t5--| // 這樣的操作較為簡(jiǎn)單,不用在每次插入元素時(shí)去判斷對(duì)應(yīng)的時(shí)間區(qū)域,再找到對(duì)應(yīng)時(shí)間區(qū)間的最小值,用部分冗余的內(nèi)存換取操作的快捷。 void SendSideBandwidthEstimation::UpdateMinHistory(int64_t now_ms) {   // Remove old data points from history.   // Since history precision is in ms, add one so it is able to increase   // bitrate if it is off by as little as 0.5ms.   while (!min_bitrate_history_.empty() &&          now_ms - min_bitrate_history_.front().first + 1 >              kBweIncreaseIntervalMs) {     min_bitrate_history_.pop_front();   }   // Typical minimum sliding-window algorithm: Pop values higher than current   // bitrate before pushing it.   while (!min_bitrate_history_.empty() &&          bitrate_ <= min_bitrate_history_.back().second) {     min_bitrate_history_.pop_back();   }   min_bitrate_history_.push_back(std::make_pair(now_ms, bitrate_)); }3.3 UpdateEstimate函數(shù)UpdateReceiverBlock會(huì)根據(jù)當(dāng)前的report block對(duì)當(dāng)前帶寬估計(jì)的一些變量進(jìn)行相應(yīng)的賦值,此外,只有當(dāng)傳輸包的數(shù)量達(dá)到一定數(shù)量才會(huì)再次觸發(fā)帶寬估計(jì)的調(diào)整。函數(shù)UpdateEstimate是主要用于帶寬估計(jì)的函數(shù)。void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) {   // We trust the REMB and/or delay-based estimate during the first 2 seconds if   // we haven't had any packet loss reported, to allow startup bitrate probing.   if (last_fraction_loss_ == 0 && IsInStartPhase(now_ms)) {     uint32_t prev_bitrate = bitrate_;     // bwe_incoming_是remb更新的值,如果當(dāng)前無(wú)丟包且在啟動(dòng)階段,直接使用remb的值。     if (bwe_incoming_ > bitrate_)       bitrate_ = CapBitrateToThresholds(now_ms, bwe_incoming_);       ...     }   }   UpdateMinHistory(now_ms);   // Only start updating bitrate when receiving receiver blocks.   // TODO(pbos): Handle the case when no receiver report is received for a very   // long time.   if (time_last_receiver_block_ms_ != -1) {     if (last_fraction_loss_ <= 5) {       // Loss < 2%: Increase rate by 8% of the min bitrate in the last       // kBweIncreaseIntervalMs.       // Note that by remembering the bitrate over the last second one can       // rampup up one second faster than if only allowed to start ramping       // at 8% per second rate now. E.g.:       //   If sending a constant 100kbps it can rampup immediatly to 108kbps       //   whenever a receiver report is received with lower packet loss.       //   If instead one would do: bitrate_ *= 1.08^(delta time), it would       //   take over one second since the lower packet loss to achieve 108kbps.         //TODO:tjl       // 這里與公式有一定不同:       // 1. 系數(shù)不同,且附帶一定的修正值(向上取整加1kbps)       // 2. 取的是上一個(gè)時(shí)間間隔之內(nèi)最小值,比較平滑。       bitrate_ = static_cast(           min_bitrate_history_.front().second * 1.08 + 0.5);       // Add 1 kbps extra, just to make sure that we do not get stuck       // (gives a little extra increase at low rates, negligible at higher       // rates).       bitrate_ += 1000;       event_log_->LogBwePacketLossEvent(           bitrate_, last_fraction_loss_,           expected_packets_since_last_loss_update_);     } else if (last_fraction_loss_  10%: Limit the rate decreases to once a kBweDecreaseIntervalMs +       // rtt.       if (!has_decreased_since_last_fraction_loss_ &&           (now_ms - time_last_decrease_ms_) >=               (kBweDecreaseIntervalMs + last_round_trip_time_ms_)) {         time_last_decrease_ms_ = now_ms;         // Reduce rate:         //   newRate = rate * (1 - 0.5*lossRate);         //   where packetLoss = 256*lossRate;           //TODO:tjl         // 當(dāng)從未開(kāi)始降低窗口值,且距離上一次衰減的時(shí)間差大于衰減周期加上rtt。         // 其實(shí)當(dāng)前貌似只有這個(gè)case下會(huì)對(duì)這兩個(gè)變量賦值。         // 這里的last_fraction_loss_是一次統(tǒng)計(jì)間隔(一定包數(shù))之間的總丟包率。         // 丟包率的單位是1/256,因此這里是(1 - 丟包率/2) * 當(dāng)前速率         // 與公式相同。         bitrate_ = static_cast(             (bitrate_ * static_cast(512 - last_fraction_loss_)) /             512.0);         has_decreased_since_last_fraction_loss_ = true;       }       event_log_->LogBwePacketLossEvent(           bitrate_, last_fraction_loss_,           expected_packets_since_last_loss_update_);     }   }   // 在有效范圍內(nèi)修正。   bitrate_ = CapBitrateToThresholds(now_ms, bitrate_); }
01-22
2018
常見(jiàn)SEO關(guān)鍵詞選擇誤區(qū)及選擇技巧
如果網(wǎng)站是一個(gè)企業(yè)的臉,然后關(guān)鍵詞是面部美容。只有當(dāng)化妝品用得好,會(huì)有更多的人記得你,知道你。當(dāng)我們?cè)谧鲫P(guān)鍵詞的排名,我們?cè)撊绾芜x擇關(guān)鍵詞?你不能陷入這些誤區(qū)!     一、關(guān)鍵詞是從來(lái)不使用的  有的伙伴為了讓網(wǎng)站很快又好的排名,會(huì)自創(chuàng)一些詞。誠(chéng)然這樣的詞會(huì)很快又好的排名。但是同時(shí)這樣的詞也沒(méi)有搜索量。即使排在首頁(yè)也沒(méi)有多大的效果?! 《?、不一定最熱門的關(guān)鍵詞就是最適合的  熱門的關(guān)鍵詞可以帶來(lái)大量的流量,但大多都沒(méi)有轉(zhuǎn)化,形成了流量的浪費(fèi),這個(gè)關(guān)鍵詞不一定是網(wǎng)站合適的。比如“SEO”這個(gè)詞每天的搜索量是很大,但是很多搜索SEO的人并不是想學(xué)習(xí)SEO,很可能是行業(yè)內(nèi)的人觀察排名的變化,也有可能是小白想對(duì)這個(gè)詞有些了解而已。所以熱的詞不一定就是好的。  三、在關(guān)鍵詞的選取上沒(méi)有考慮到用戶意圖  關(guān)鍵詞的選取時(shí),要考慮用戶的心理,以達(dá)到轉(zhuǎn)化促成銷售的關(guān)鍵詞為首選。在搜索中,往往產(chǎn)品的性能搜索是購(gòu)買前的比較選擇,而產(chǎn)品的名字搜索是消費(fèi)的選擇?! ∷摹⒅贿x通用詞而沒(méi)有選長(zhǎng)尾詞  對(duì)于網(wǎng)站選取關(guān)鍵詞來(lái)說(shuō),大多網(wǎng)站都重視了通用關(guān)鍵詞,沒(méi)有選擇長(zhǎng)尾關(guān)鍵詞。比如我們做祛痘的產(chǎn)品,往往主關(guān)鍵詞就是?! ∥?、關(guān)鍵詞的混亂  對(duì)有些關(guān)鍵詞來(lái)說(shuō),一個(gè)詞是兩個(gè)概念,它包含了兩個(gè)不同的意思,這樣會(huì)造成混亂,要選擇最精準(zhǔn)的關(guān)鍵詞。還有就是選擇與自己不相關(guān)的關(guān)鍵詞,雖然可以帶來(lái)流量,但是無(wú)轉(zhuǎn)化。seo關(guān)鍵詞選擇技巧一:關(guān)鍵詞收縮量越大越好很多人在選取關(guān)鍵詞時(shí)會(huì)通過(guò)工具查看這個(gè)關(guān)鍵詞的搜索量大小,然后就想當(dāng)然的認(rèn)為搜索量大的詞,就是好的關(guān)鍵詞,因?yàn)樗阉髁看螅f(shuō)明搜索的人多,那么展現(xiàn)的次數(shù)自然就多,這么像當(dāng)然無(wú)可厚非,但是并不是關(guān)鍵詞搜索量大就一定好。關(guān)鍵是精準(zhǔn)性。比如做做旅游行業(yè)的,旅游景點(diǎn)搜索量日均一萬(wàn)就比旅游團(tuán)搜索量日均三千大的多,但是旅游團(tuán)的精準(zhǔn)度卻高于旅游景點(diǎn)。二:核心關(guān)鍵詞越多越好很多人在設(shè)置核心關(guān)鍵詞的時(shí)候恨不得把自己所有產(chǎn)品都放在核心關(guān)鍵詞上,但其實(shí)并不是設(shè)置的核心越多越好,核心關(guān)鍵詞應(yīng)該以主營(yíng)產(chǎn)品為主,因?yàn)楹诵年P(guān)鍵詞太多,太分散就會(huì)分薄網(wǎng)站權(quán)重,所以并不建議設(shè)置太多核心關(guān)鍵詞,一般以5到6個(gè)為宜,以核心產(chǎn)品為主,如果真的有很多種產(chǎn)品都想做核心關(guān)鍵詞,那么可以選擇做站群。(至于站群的問(wèn)題這里就先不講了)我們平時(shí)所說(shuō)的關(guān)鍵詞分類是根據(jù)關(guān)鍵詞的競(jìng)爭(zhēng)度,搜索量這些來(lái)分的。 按照淘寶SEO,我們對(duì)關(guān)鍵詞的屬性可分為三個(gè)級(jí)別: 】1:頂級(jí)關(guān)鍵詞(一級(jí)詞) 一般由3個(gè)字組成,搜索量非常大,競(jìng)爭(zhēng)度非常大如, 新手很難通過(guò) 。頂級(jí)關(guān)鍵詞獲得穩(wěn)定的流量如:“手機(jī)”,“電腦”,“男裝”,“女裝”,“連衣裙” 2:二級(jí)關(guān)鍵詞(二級(jí)詞) 一般由4、5個(gè)字組成,競(jìng)爭(zhēng)度比較大,新手也比較難通過(guò)二極關(guān)鍵詞獲得 穩(wěn)定的流量。如“蘋果手機(jī)”,“商務(wù)男裝”,“韓版女裝”,“日式連衣裙”“新春女裝”3:長(zhǎng)尾關(guān)鍵詞 長(zhǎng)尾關(guān)鍵詞一般由 5個(gè)字或者更多關(guān)鍵詞組成,精準(zhǔn)度高,競(jìng)爭(zhēng)度不大,搜索量不大,很難用長(zhǎng)尾關(guān)鍵詞打造爆款寶貝,如:“蘋果手機(jī)第四代黑色” “日式碎花莫代爾長(zhǎng)連衣裙”“雪紡韓版女裝”“新款春季女裝”。
01-22
2018
網(wǎng)站長(zhǎng)尾關(guān)鍵詞部局方法
  長(zhǎng)尾關(guān)鍵詞布局非常重要---因?yàn)樯婕暗骄W(wǎng)站后期優(yōu)化效果。布局長(zhǎng)尾詞的第一點(diǎn)是挖掘和篩選長(zhǎng)尾詞,然后根據(jù)長(zhǎng)尾詞的競(jìng)爭(zhēng)度以及相關(guān)性布局在網(wǎng)站的欄目頁(yè)和內(nèi)頁(yè)。內(nèi)頁(yè)的長(zhǎng)尾詞圍繞欄目頁(yè)的競(jìng)爭(zhēng)度大一點(diǎn)的短詞來(lái)布局,不同欄目的長(zhǎng)尾詞不能互相交叉以及重疊。   挖掘長(zhǎng)尾關(guān)鍵詞:挖掘長(zhǎng)尾關(guān)鍵詞的方法是利用百度相關(guān)搜索、百度下拉框以及百度知道、搜搜問(wèn)問(wèn)這些工具尋找用戶經(jīng)常搜索的長(zhǎng)尾關(guān)鍵詞。也可以利用其它的一些工具,比如百度推廣助手,挖掘的長(zhǎng)尾詞會(huì)更加精確;觀其站長(zhǎng)工具、站長(zhǎng)工具等。   挖掘好的關(guān)鍵詞放在電子表格里面,去除重復(fù)的以及明顯刷的長(zhǎng)尾詞和不相關(guān)長(zhǎng)尾詞。比如攻絲機(jī)一類的詞出現(xiàn)鋼管舞相關(guān)的長(zhǎng)尾詞,那么公司級(jí)別相關(guān)的長(zhǎng)尾詞必須去除,這樣的詞和關(guān)鍵詞本身毫無(wú)相關(guān)。   欄目頁(yè)和內(nèi)頁(yè)布局:在篩選關(guān)鍵詞時(shí)有短詞和長(zhǎng)詞的區(qū)分、如果是短詞并且指數(shù)和競(jìng)爭(zhēng)度比較大就作為欄目頁(yè)的關(guān)鍵詞,而長(zhǎng)詞和指數(shù)小競(jìng)爭(zhēng)度小的關(guān)鍵詞作為內(nèi)頁(yè)長(zhǎng)尾詞排名。比如攻絲機(jī)廠家是一個(gè)長(zhǎng)尾詞,但指數(shù)和競(jìng)爭(zhēng)度相對(duì)比較大,所以作為欄目頁(yè)的長(zhǎng)尾詞布局,而臥室攻絲機(jī)廠家指數(shù)和競(jìng)爭(zhēng)度都比較小,所以作為內(nèi)頁(yè)長(zhǎng)尾詞布局。   攻絲機(jī)長(zhǎng)尾關(guān)鍵詞案例   攻絲機(jī)企業(yè)長(zhǎng)尾關(guān)鍵詞布局案例,可供參考   問(wèn):SEO如何布局長(zhǎng)尾關(guān)鍵詞?   請(qǐng)問(wèn)如何給網(wǎng)站做長(zhǎng)尾關(guān)鍵詞布局?關(guān)鍵詞可以挖掘出很多,但不知道怎么把這些關(guān)鍵詞使用上。   1、什么是長(zhǎng)尾關(guān)鍵詞?   2006年的時(shí)候,營(yíng)銷管理業(yè)界有一個(gè)新的理論,叫長(zhǎng)尾理論。長(zhǎng)尾理論不同于二八定律。長(zhǎng)尾理論一出現(xiàn),就首先得到了SEO業(yè)內(nèi)的高度認(rèn)同。直接借用了長(zhǎng)尾這個(gè)名詞來(lái)定義領(lǐng)域里面比較泛化而大量的關(guān)鍵詞,統(tǒng)稱為長(zhǎng)尾關(guān)鍵詞。   2、長(zhǎng)尾理論是互聯(lián)網(wǎng)時(shí)代的獨(dú)有現(xiàn)象   馬云之前有個(gè)理論,說(shuō)我的產(chǎn)品規(guī)模要翻幾倍,增加一些服務(wù)器就好了。沃爾瑪要再建多少多少店面。因?yàn)閮?nèi)容和產(chǎn)品的數(shù)字化后,信息存儲(chǔ)方便。搜索引擎的出現(xiàn),讓長(zhǎng)尾理論得以體現(xiàn)出來(lái)。所以,對(duì)網(wǎng)站來(lái)說(shuō)也是內(nèi)容越多越好。內(nèi)容多,就意味著總會(huì)有一些內(nèi)容適合這類需求的用戶。   3、長(zhǎng)尾關(guān)鍵詞等于做內(nèi)容   沒(méi)有內(nèi)容頁(yè)面來(lái)承載關(guān)鍵詞,那關(guān)鍵詞就無(wú)法部署,這是要解決關(guān)鍵詞落地的問(wèn)題。關(guān)鍵詞是無(wú)法脫離內(nèi)容來(lái)談的。所以,做長(zhǎng)尾關(guān)鍵詞,本質(zhì)上就是等于要做內(nèi)容。如果網(wǎng)站沒(méi)有幾個(gè)做內(nèi)容的策略方法,是很難把長(zhǎng)尾關(guān)鍵詞策略部署到站內(nèi)去的。   4、布局長(zhǎng)尾關(guān)鍵詞常見(jiàn)方法   做聚合,是做長(zhǎng)尾關(guān)鍵詞策略的常用方法。但聚合的頁(yè)面質(zhì)量不好的話,也會(huì)影響長(zhǎng)尾策略效果的發(fā)揮。長(zhǎng)尾關(guān)鍵詞因?yàn)殛P(guān)鍵詞量大的原因,所以只能考慮那種能夠產(chǎn)生大量?jī)?nèi)容的方法來(lái)布局長(zhǎng)尾關(guān)鍵詞。   5、長(zhǎng)尾關(guān)鍵詞的布局是SEO工作的核心   把長(zhǎng)尾關(guān)鍵詞布局得當(dāng),可以說(shuō)是SEO工作的最重要的核心一點(diǎn)之一了。這個(gè)問(wèn)題要解決并不簡(jiǎn)單。因?yàn)榻鉀Q的好,就等于網(wǎng)站能夠長(zhǎng)期生產(chǎn)出高質(zhì)量的內(nèi)容。所以,這個(gè)問(wèn)題如何解決的更好,是值得SEO人員好好思考的問(wèn)題。   ?   我的觀點(diǎn):不做長(zhǎng)尾策略,網(wǎng)站的SEO效果終歸有限。所以,如何部署長(zhǎng)尾關(guān)鍵詞策略,就是每個(gè)網(wǎng)站要發(fā)展起來(lái)過(guò)程中必須要解決的問(wèn)題:   篩選長(zhǎng)尾詞的作用是找出有價(jià)值的長(zhǎng)尾關(guān)鍵詞并且避免重復(fù),而做指數(shù)和競(jìng)爭(zhēng)度分析是為了避免重復(fù)內(nèi)容出現(xiàn)。   1、禁止出現(xiàn)完全不相干和刷出來(lái)的長(zhǎng)尾關(guān)鍵詞,有的SEO為了作弊會(huì)用工具刷長(zhǎng)尾關(guān)鍵詞   2、很多站長(zhǎng)舍不得意思相近的長(zhǎng)尾詞,便把兩個(gè)差不多的長(zhǎng)尾詞布局在站內(nèi),但是內(nèi)容還差不多,大量這樣的內(nèi)容會(huì)導(dǎo)致網(wǎng)站降權(quán)。因?yàn)樗阉饕娌粫?huì)把一個(gè)內(nèi)容重復(fù)的網(wǎng)站排名放在首頁(yè)的。   3、在做欄目分類時(shí),欄目下面內(nèi)頁(yè)的長(zhǎng)尾詞一定是欄目關(guān)鍵詞的擴(kuò)展詞或者是相關(guān)長(zhǎng)尾詞,站內(nèi)的長(zhǎng)尾詞不能交叉顯示在網(wǎng)站的其他欄目。
01-19
2018
提升網(wǎng)站點(diǎn)擊率的SEO標(biāo)題寫法
比如說(shuō)我們舉個(gè)例子,題目是:68歲老干媽,身價(jià)70億,開(kāi)勞斯萊斯ZF送AA8888牌照,她才是中國(guó)最任性的女神。這是我去年寫的一個(gè)80萬(wàn)加閱讀量的文章,30個(gè)字左右的標(biāo)題中用了三組數(shù)字,一組字母,所以他在朋友圈里肯定是屬于點(diǎn)開(kāi)率比較高的那種,特別吸引眼球。再舉個(gè)例子,坑了170名員工敗光500萬(wàn)CEO跑了,這只是創(chuàng)業(yè)公司倒閉潮中的一個(gè)樣本。這是我去年在資本寒冬的時(shí)候?qū)懙囊粋€(gè)公司倒閉的一個(gè)案例。這篇文章的閱讀量70萬(wàn)家應(yīng)該是這篇文章是30個(gè)字左右的標(biāo)題中利用了兩個(gè)數(shù)字,一組字母也是非常吸引眼球的,辨識(shí)度非常高,這是第一點(diǎn)。第二點(diǎn)為什么要用數(shù)字。數(shù)字能夠給人基本的預(yù)期,加速讀者的判斷時(shí)間。什么判斷時(shí)間,就是讀者判斷是否要打開(kāi)你這篇文章的時(shí)間。那數(shù)據(jù)能給人基本的預(yù)期,給人什么基本的預(yù)期呢?就是說(shuō)我們通過(guò)數(shù)字可以把整個(gè)文章的架構(gòu)和重點(diǎn)表現(xiàn)出來(lái)。舉個(gè)例子,任正飛新聞聯(lián)播講話:48秒230個(gè)字卻值得每個(gè)中國(guó)人反思。通過(guò)48秒230個(gè)字給讀者一個(gè)基本的預(yù)期,我進(jìn)來(lái)這篇文章主要是看任正非講的這230個(gè)字。再舉個(gè)例子,關(guān)于微信運(yùn)營(yíng)新手最容易犯的30個(gè)錯(cuò)誤,他用30這個(gè)數(shù)字給人一個(gè)基本的預(yù)期,就是說(shuō)我讀了這篇文章很可能就會(huì)能幫我避免以后犯這30個(gè)錯(cuò)誤,這是第二點(diǎn)。第三點(diǎn)就是數(shù)字的表達(dá),它天然就更具體更直觀。我們簡(jiǎn)單舉個(gè)例子,張一鳴,十年面世過(guò)2000人,混得好的年輕人都有這五種特質(zhì)。我想表達(dá)張一民特別會(huì)看人,看得特別準(zhǔn),我怎么表達(dá)他看過(guò)的人多,怎么個(gè)多法,十年面世過(guò)2000人,在表達(dá)一下就更具體更直觀了,所以這就是為什么要用數(shù)字。第一數(shù)字的辨識(shí)度高吸眼球。第二,數(shù)字能夠給人基本的預(yù)期。第三數(shù)字的表達(dá)天然更具體更直觀。這三點(diǎn)具體怎么做,一般要用到哪些數(shù)字,你寫完文章一般怎么操作呢?我的經(jīng)驗(yàn)是你寫完文章之后,把文章通讀一遍挨著讀一行一行的讀,只要帶數(shù)字的點(diǎn),你把它提煉出來(lái),你把它放在一塊,看看這篇文章中都是有哪些點(diǎn)哪些數(shù)字。然后看看用什么樣的邏輯結(jié)構(gòu)能盡可能多的多帶上幾組數(shù)字就是能用兩組數(shù)字就別用一組數(shù)字,能用三組就別用兩組。我總結(jié)了一共有四點(diǎn),也就是四個(gè)方法。第一點(diǎn)用人物的年齡數(shù)字,因?yàn)榇蠹覍懳恼潞芏喽际菍戇@個(gè)人物就有個(gè)年齡,我總結(jié)了一個(gè)套路。年齡小就是年輕有為,年齡大就是老當(dāng)益壯,年齡不大不小,去找別的角度。我們舉一個(gè)例子,98年的妹子創(chuàng)業(yè),五個(gè)投資大佬爭(zhēng)搶融資1500萬(wàn),90后大叔大媽咋想是吧?98年創(chuàng)業(yè),年輕有為。再舉個(gè)對(duì)立的例子,56歲才創(chuàng)業(yè),如今利潤(rùn)卻是華為的1.5倍,它是個(gè)讓對(duì)手發(fā)抖的人,老當(dāng)益壯。跟前面那個(gè)對(duì)比,我們?cè)倥e一個(gè)對(duì)比的例子,年輕有為的例子,17歲,它說(shuō)要把海洋清洗干凈,沒(méi)人相信。21歲,他做到。再舉個(gè)對(duì)立的例子,褚時(shí)健,年輕人太急了,我80歲還在摸爬滾打。老當(dāng)益壯,所以經(jīng)常能用到的是人物的年齡數(shù)字,我是能很高興大家。第二個(gè)經(jīng)常用的是表示時(shí)間的數(shù)字,這個(gè)怎么理解呢。就是一般寫故事,寫一個(gè)做一件什么事情的時(shí)候,經(jīng)常用到表示時(shí)間的數(shù)字。這個(gè)我也總結(jié)了一個(gè)套路叫:時(shí)間短,就是發(fā)展迅速,時(shí)間長(zhǎng),就是工匠精神,意志堅(jiān)定,時(shí)間不長(zhǎng)不短,找別的角度。我們舉個(gè)例子:一分鐘賣出3萬(wàn)件衣服,老板比比爾蓋茨還有錢,它靠一個(gè)字顛覆了整個(gè)零售業(yè),這個(gè)其實(shí)是寫的ZARA的老板。但是老板今年是在全球富豪榜上排名第二,去年的時(shí)候超過(guò)了比爾蓋茨,我們表達(dá)它發(fā)展迅速,就一分鐘賣出3萬(wàn)件衣服。再舉個(gè)例子,近年來(lái)發(fā)展最快的互聯(lián)網(wǎng)公司滴滴出行,我們給他起的題目是四年350億美金的背后滴滴,是這樣干掉30家競(jìng)爭(zhēng)對(duì)手的。用時(shí)間短來(lái)表達(dá)它的發(fā)展迅速,那時(shí)間長(zhǎng)就是工匠精神意志堅(jiān)定。這些題目例子更多,比如說(shuō)為女朋友連續(xù)做了900天不重樣的早餐。最會(huì)做飯的男人竟然是點(diǎn)點(diǎn)點(diǎn),意志堅(jiān)定。日本匠人捏了40年的面團(tuán),結(jié)果連馬卡龍大師都飛過(guò)半個(gè)地球來(lái)請(qǐng)教。40年工匠精神。因?yàn)槠拮拥囊痪湓?,他在九平米的拉面店待?6年,有人為了吃上一碗拉面,竟然等了九個(gè)小時(shí),工匠精神,46年,九個(gè)小時(shí),這是第二點(diǎn)經(jīng)常用的數(shù)字表示時(shí)間的數(shù)字。第三點(diǎn)這個(gè)是用的可能更多就是跟錢有關(guān)的數(shù)字。誰(shuí)跟錢有仇,看見(jiàn)錢就是看一下跟錢有關(guān)的數(shù)字比較多,比如說(shuō)工資,比如說(shuō)年薪,比如說(shuō)身價(jià),估值融資額,這些只要有你盡可能的放在標(biāo)題里。舉個(gè)例子,普通文案和優(yōu)秀文案的區(qū)別,這樣的標(biāo)題有人看,但很少人看改成什么樣的標(biāo)題跟錢有關(guān),月薪3000,與月薪3萬(wàn)的文案差別究竟在哪里?這是一篇在朋友圈刷屏的一個(gè)文章。再舉個(gè)例子,從月薪500的行政到執(zhí)掌750億美金。這名中學(xué)女教師用17年的堅(jiān)持逆襲人生,這個(gè)其實(shí)寫的是馬云背后的女人彭雷。月薪5000,執(zhí)掌750億美金,跟錢有關(guān)的數(shù)字,特別吸引眼球。第四點(diǎn)是什么意思呢?提煉你最想表達(dá)的東西,然后用數(shù)字來(lái)描述。什么意思呢?整篇文章你總有個(gè)想表達(dá)的東西,你表達(dá)窮還是表達(dá)富?你表達(dá)胖和瘦,你表達(dá)高和矮,大和小,長(zhǎng)和短,快和慢,遠(yuǎn)和近,你基本上你表達(dá)的所有東西都能找到數(shù)字來(lái)表達(dá)或者是強(qiáng)化。再舉個(gè)例子,關(guān)于新媒體編輯可能感冒的。如何通過(guò)爆款標(biāo)題達(dá)到10萬(wàn)加內(nèi)容。是不是看煩了,是不是不想點(diǎn)開(kāi)看了。但是修改后的標(biāo)題可以是這樣的,這10篇文章只改了下標(biāo)題,閱讀量就從1萬(wàn)加漲到了10萬(wàn)加。用數(shù)字來(lái)加強(qiáng)你要表達(dá)的東西,從1萬(wàn)加漲到10萬(wàn)加翻了十倍來(lái)表達(dá)爆款標(biāo)題有多厲害。所以整個(gè)是具體用哪些數(shù)字大概這四個(gè)方面。最后再給大家提一個(gè)注意事項(xiàng),第一點(diǎn),也就是大多數(shù)小編經(jīng)常犯的一個(gè)錯(cuò)誤,他用數(shù)字了,但他用的是中文數(shù)字。這個(gè)是個(gè)機(jī)會(huì),你把所有的中文數(shù)字都代替成阿拉伯?dāng)?shù)字,這樣就對(duì)了,這是第一點(diǎn)注意事項(xiàng)。第二點(diǎn)是數(shù)字靠前放,盡量靠前放,就是你最初推出來(lái)的時(shí)候推文的時(shí)候如果用戶沒(méi)有去點(diǎn)一下它。這個(gè)標(biāo)題是被折疊的。如果你是一個(gè)30次左右的標(biāo)題,后面20個(gè)字基本上就被折疊了,只顯示前十個(gè)字左右,但是中文它這個(gè)邏輯結(jié)構(gòu)其實(shí)可以你去調(diào)整的,你把它帶數(shù)字的那部分調(diào)在前面,這樣是比較好的。