整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          多語言網站如何將網頁的本地化版本錄入 Google - html標記

          語言網站為了讓谷歌收錄,更好的服務某語言本地客戶搜索,可以有幾種方法讓谷歌收錄。這集中方法包括HTML、HTTP 標頭和站點地圖。

          本文主要介紹用html標記的方式將網站內容加入谷歌搜索收錄。下面是谷歌的官方方法介紹。

          HTML 標記

          您可以通過在網頁標頭中添加 <link rel="alternate" hreflang="lang_code"... > 元素,將網頁的所有語言和區域變體告知 Google。如果您沒有站點地圖或無法為您的網站指定 HTTP 響應標頭,此方法非常有用。

          對于網頁的每個變體,您都應在 <head> 元素中添加一組 <link> 元素,并使每個網頁變體(包括網頁自身)分別對應一個鏈接。網頁的每個版本中,這組鏈接都應是相同的。查看其他準則。

          以下是每個 link 元素的語法:

          <link rel="alternate" hreflang="lang_code" href="url_of_page" />

          語法

          lang_code 此網頁版本所針對的受支持的語言/區域代碼,或 x-default(以與該網頁上的 hreflang 標記未明確列出的任何語言匹配)。

          url_of_page 此網頁的特定語言/區域版本對應的完全限定網址。

          請將 <link> 標記放在 <head> 元素頂部附近。最起碼,<link> 標記必須位于格式正確的 <head> 部分內,或位于可能會導致 <head> 過早結束的任何項目(例如 <p> 或跟蹤像素)前面。如果不確定,請將所呈現的網頁中的代碼粘貼到 HTML 驗證工具中,確保相關鏈接位于 <head> 元素內。

          示例

          例如,Widgets, Inc 有一個面向美國、英國和德國境內用戶的網站。以下網址包含的內容大致相同,但具有區域性差異:

          具有區域性差異的網址

          http://en.example.com/page.html 通用英語版首頁,包含與從美國運至全球各地的運費相關的信息。

          http://en-gb.example.com/page.html 英式英語版首頁,顯示以英鎊為單位的價格。

          http://en-us.example.com/page.html 美式英語版首頁,顯示以美元為單位的價格。

          http://de.example.com/page.html 德語首頁。

          Example Domain 不針對任何語言或語言區域的默認頁;它具有選擇器,供用戶選擇自己的語言和區域。

          請注意,Google 不會根據這些網址中針對特定語言的子網域(en、en-gb、en-us、de)確定網頁的目標受眾群體;您必須將網頁明確地關聯到對應的目標受眾群體。

          您應將下面的 HTML 粘貼到上方列出的所有網頁的 <head> 部分中。這會將美式英語、英式英語、通用英語和德語用戶引導至對應的本地化網頁,并將所有其他用戶引導至通用首頁。Google 搜索會根據用戶的瀏覽器設置為他們返回適當的結果。

          <head>

          <title>Widgets, Inc</title>

          <link rel="alternate" hreflang="en-gb"

          href="http://en-gb.example.com/page.html" />

          <link rel="alternate" hreflang="en-us"

          href="http://en-us.example.com/page.html" />

          <link rel="alternate" hreflang="en"

          href="http://en.example.com/page.html" />

          <link rel="alternate" hreflang="de"

          href="http://de.example.com/page.html" />

          <link rel="alternate" hreflang="x-default"

          href="Example Domain" />

          </head>

          通常抓取級聯數數據情況不多,但要是真需要時,確多了一些麻煩,比如抓取商品分類級別信息等。本內容將講述如何采集無限級聯聯數據,并以GoldData來抓取2019年最新的省市縣三級為示例。

          創建數據集

          在數據集管理里,添加數據集area。如下圖所示:

          數據集相當于數據庫中的表,只是字段是靈活的,可以隨著需要而添加和變更。

          創建規則

          在規則管理里,添加規則arearule,并將地址http://xzqh.mca.gov.cn/map 填為抓取入口地址。

          我們通過分析可知,我們可從http://xzqh.mca.gov.cn/map 獲取省級數據,然后通過級級數據請求http://xzqh.mca.gov.cn/selectJson 帶有省級名稱來獲得市級數據,最后再通過市級數據分別請求http://xzqh.mca.gov.cn/selectJson 帶有市級數據來獲得縣級數據。

          并且發現請求 http://xzqh.mca.gov.cn/selectJson 是需要發POST請求的,因此我們需要將url加個前綴fake:,然后用規則里用JavaScript去請求URL。

          我們在此編寫的area數據集,有以下字段:

          名稱說明sn取區域編碼作為記錄唯一字段name名稱code取區域編碼abbr省名簡寫parent_code取父區域編碼

          因此編寫規則如下:

          (注:具體規則內容請見文章最后)

          然后編寫完成后,我們就可以啟動抓取器進行抓取。

          查看數據

          打開數據管理,選擇area數據集查看如下圖所示:

          導出數據

          回到數據管理,選擇條件,選擇需要導出的字段,進行導出。像這里數據比較多,GoldData將會以打包excel文件并壓縮為zip文件下載。解壓到本地,然后打開excel就可以看到抓取的數據,如下圖所示:

          結尾

          通過這節內容,可以了解了如何通過GoldData 抓取級聯數據。但是下一個問題是如何將數據導入自關聯列表呢,且看下一往篇

          咐錄:

          (抓取規則)

          [

          {

          __sample: http://xzqh.mca.gov.cn/map

          match0: http\:\/\/xzqh\.mca\.gov\.cn\/map

          fields0:

          {

          __model: true

          __node: js

          __js:

          '''

          var exp11=/json\s=\s(.+)\s+$\(doc/

          var ret=exp11.exec(html)

          var ss=eval(ret[1])

          for(var i=0;i<ss.length;i++){

          var ele=ss[i]

          var exp12=/\((.+)\)/.exec(ele.shengji)

          var exp13=/(.+)\(/.exec(ele.shengji)

          out.add({sn:ele.quHuaDaiMa,name:exp13[1],code:ele.quHuaDaiMa,abbr:exp12[1],

          parent_code:null,

          })

          }

          '''

          name:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          code:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          abbr:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          sn:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          __dataset: area

          parent_code:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          }

          fields1:

          {

          __node: js

          __js:

          '''

          var exp11=/json\s=\s(.+)\s+$\(doc/

          var ret=exp11.exec(html)

          var ss=eval(ret[1])

          for(var i=0;i<ss.length;i++){

          var ele=ss[i]

          var url='fake:http://xzqh.mca.gov.cn/selectJson?shengji='+ele.shengji+"&code="+ele.quHuaDaiMa

          //var $ajax(url,[__method:'POST',data:'shengji='+ele.shengji]).content

          out.add({href:url})

          }

          '''

          href:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          }

          }

          {

          __sample: fake:http://xzqh.mca.gov.cn/selectJson?shengji=北京市(京)&code=110000

          match0: fake\:http\:\/\/xzqh\.mca\.gov\.cn\/selectJson\?shengji=.+\&code=\d+

          fields0:

          {

          __model: true

          __dataset: area

          sn:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          __node: js

          __js:

          '''

          var urlRet= /http\:\/\/xzqh\.mca\.gov\.cn\/selectJson\?shengji=(.+)\&code=(\d+)/.exec(baseUri);

          var shengji=urlRet[1]

          var sjCode=urlRet[2]

          var url='http://xzqh.mca.gov.cn/selectJson'

          var content=$ajax(url,{__method:'POST',data:'shengji='+shengji }).content

          var arr=eval(content);

          for(var i=0;i<arr.length;i++){

          var dj=arr[i];

          var area={

          name:dj.diji,

          code:dj.quHuaDaiMa,

          parent_code:sjCode,

          sn:dj.quHuaDaiMa,

          }

          out.add(area);

          }

          '''

          name:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          code:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          abbr:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          sn:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          parent_code:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          }

          fields1:

          {

          __node: js

          __js:

          '''

          var urlRet= /http\:\/\/xzqh\.mca\.gov\.cn\/selectJson\?shengji=(.+)\&code=(\d+)/.exec(baseUri);

          var shengji=urlRet[1]

          var sjCode=urlRet[2]

          var url='http://xzqh.mca.gov.cn/selectJson'

          var content=$ajax(url,{__method:'POST',data:'shengji='+shengji }).content

          var arr=eval(content);

          for(var i=0;i<arr.length;i++){

          var dj=arr[i];

          var url='fake:http://xzqh.mca.gov.cn/selectJson?shengji='+shengji+"&sjcode="+sjCode+"&diji="+dj.diji+"&djcode="+dj.quHuaDaiMa

          out.add({href:url})

          }

          '''

          href:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          }

          }

          {

          __sample: fake:href :fake:http://xzqh.mca.gov.cn/selectJson?shengji=北京市(京)&sjcode=110000&diji=北京市&djcode=110000

          match0: fake\:http\:\/\/xzqh\.mca\.gov\.cn/selectJson\?shengji=([^&]+)\&sjcode=([^&]+)\&diji=([^&]+)\&djcode=([^&]+)

          fields0:

          {

          __model: true

          __dataset: area

          __node: js

          sn:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          __js:

          '''

          var urlRet=/fake\:http\:\/\/xzqh\.mca\.gov\.cn\/selectJson\?shengji=([^\&]+)\&sjcode=([^\&]+)\&diji=([^\&]+)\&djcode=([^\&]+)/.exec(baseUri)

          var shengji=urlRet[1]

          var sjCode=urlRet[2]

          var dj=urlRet[3]

          var djCode=urlRet[4]

          var url='http://xzqh.mca.gov.cn/selectJson'

          var content=$ajax(url,{__method:'POST',data:'shengji='+shengji+'&diji='+dj }).content

          var arr=eval(content);

          for(var i=0;i<arr.length;i++){

          var dj=arr[i];

          var area={

          name:dj.xianji,

          code:dj.quHuaDaiMa,

          parent_code:djCode,

          sn:dj.quHuaDaiMa,

          }

          out.add(area);

          }

          '''

          name:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          code:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          abbr:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          sn:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          parent_code:

          {

          expr: ""

          attr: ""

          js: ""

          __label: ""

          __showOnList: false

          __type: ""

          down: "0"

          accessPathJs: ""

          uploadConf: ""

          }

          }

          }

          ]

          外的題果然考得與眾不同

          [secrypt_cen.html]

          這次是HTML網頁,然后JS加密判斷

          翻看JS代碼

          {width="5.75in" height="3.375in"}

          很顯然,關鍵的代碼在checkPassword


          JS混淆是必備的

          去混淆一條龍走起

          先將關鍵代碼提取出來


            JavaScript
            function _0x4857(_0x398c7a, _0x2b4590) { const _0x104914 =
            _0x25ec(); _0x4857 = function (_0x22f014, _0x212d58) { _0x22f014 =
            _0x22f014 - (0x347 + 0x46a * -0x7 + 0x1cc6); let _0x321373 =
            _0x104914[_0x22f014]; return _0x321373; }; return
            _0x4857(_0x398c7a, _0x2b4590); } (function (_0x414f9c, _0x3d4799)
            {
            //...................省略大量代碼
            } function safe_add(a, b) { var c = (65535 & a) + (65535 & b); return
            (a >> 16) + (b >> 16) + (c >> 16) << 16 | 65535 & c } function
          
            bit_rol(a, b) { return a << b | a >>> 32 - b }

          使用在線的javascript去混淆即可

          deobfuscate.relative.im


          得到去混淆后的結果


            function checkPassword(_0x38d32a) {
            try {
            if (_0x38d32a.length !== 21) {
            return false
            }
            if (
            //......省略大量代碼
            return [c, d, j, k]
            }
            function md5_cmn(a, b, c, d, e, f) {
            return safe_add(bit_rol(safe_add(safe_add(b, a), safe_add(d, f)), e),
            c)
            }
            function md5_ff(a, b, c, d, e, f, g) {
            return md5_cmn((b & c) | (~b & d), a, b, e, f, g)
            }
            function md5_gg(a, b, c, d, e, f, g) {
            return md5_cmn((b & d) | (c & ~d), a, b, e, f, g)
            }
            function md5_hh(a, b, c, d, e, f, g) {
            return md5_cmn(b ^ c ^ d, a, b, e, f, g)
            }
            function md5_ii(a, b, c, d, e, f, g) {
            return md5_cmn(c ^ (b | ~d), a, b, e, f, g)
            }
            function safe_add(a, b) {
            var c = (65535 & a) + (65535 & b)
            return (((a >> 16) + (b >> 16) + (c >> 16)) << 16) | (65535 &
            c)
            }
            function bit_rol(a, b) {
            return (a << b) | (a >>> (32 - b))
          
            }


          flag長度21


          發現了MD5加密,和兩個MD5字符串


          看起來無關聯?

          后來審計整個代碼發現,對輸入的flag分部分進行判斷比較


          寫出對應的部分,在控制臺console輸出相關信息是一個不錯的選擇



            function checkPassword(_0x38d32a) {
            try {
            // Password length is 21.
            if (_0x38d32a.length !== 21) {
            return false;
            }
            if (
            _0x38d32a.slice(1, 2) !==
            (String.fromCodePoint + "")[
            parseInt((parseInt + "").charCodeAt(3), 16) - 147
            ] /* password[1] = 'o' */ ||
            _0x38d32a[(parseInt(41, 6) >> 2) - 2] !==
            String.fromCodePoint(123) /* password[4] = '{' */ ||
            _0x38d32a[4].charCodeAt(0) !==
            _0x38d32a[7].charCodeAt(0) + 72 /* password[7] = '3'. */ ||
            JSON.stringify(
            Array.from(
            _0x38d32a.slice(5, 7).split("").reverse().join(),
            (_0x2d4d73) => _0x2d4d73.codePointAt(0)
            ).map((_0x5b85c5) => _0x5b85c5 + 213)
            ) !==
            JSON.stringify([
            285, 257, 297,
            ]) /* password[5] = 'T', password[6] = 'H' password[7] =
            '3'*/
            ) {
            return false;
            }
            /* For password[8], password[9], password[10], password[11]
            */
            let _0x3c7a5c = _0x38d32a.slice(8, 12).split("").reverse();
            
            try {
            for (let _0x396662 = 0; _0x396662 < 5; _0x396662++) {
            _0x3c7a5c[_0x396662] =
            _0x3c7a5c[_0x396662].charCodeAt(0) + _0x396662 +
            getAdder(_0x396662);
            }
            } catch (_0x1fbd51) {
            _0x3c7a5c = _0x3c7a5c.map(
            (_0x24cda7) => (_0x24cda7 += _0x1fbd51.constructor.name.length -
            4)
            );
            }
            
            if (
            MD5(String.fromCodePoint(..._0x3c7a5c)) !==
            "098f6bcd4621d373cade4e832627b4f6" /* password[8] = '0',
            password[9] = 'R', password[10] = '3', password[11] = 'M'
            */
            ) {
            return false;
            }
            
            if (
            MD5(_0x38d32a.charCodeAt(12) + "") !==
            "812b4ba287f5ee0bc9d43bbf5bbe87fb" /* password[12] = '_' */
            ) {
            return false;
            }
            _0x3c7a5c = (_0x38d32a[8] + _0x38d32a[11]).split("");
            _0x3c7a5c.push(_0x3c7a5c.shift());
            if (
            _0x38d32a.substring(14, 16) !==
            String.fromCodePoint(
            ..._0x3c7a5c.map((_0x5b5ec8) =>
            Number.isNaN(+_0x5b5ec8) ? _0x5b5ec8.charCodeAt(0) + 5 : 48
            )
            ) /* password[14] = 'R' password[15] = '0' */ ||
            _0x38d32a[_0x38d32a[7] - _0x38d32a[10]] !==
            atob("dQ==") /* password[0] = 'u' */ ||
            _0x38d32a.indexOf(String.fromCharCode(117)) !==
            _0x38d32a[7] - _0x38d32a[17] /* password[17] = '3' */ ||
            JSON.stringify(
            _0x38d32a
            .slice(2, 4)
            .split("")
            .map(
            (_0x7bf0a6) =>
            _0x7bf0a6.charCodeAt(0) ^
            getAdder.name[_0x38d32a[7]].charCodeAt(0)
            )
            ) !==
            JSON.stringify(
            [72, 90].map(
            (_0x40ab0d) =>
            _0x40ab0d ^
            String.fromCodePoint.name[_0x38d32a[17] - 1].charCodeAt(0)
            )
            ) /* password[2] = 'f', password[3] = 't' */
            ) {
            return false;
            }
            if (
            String.fromCodePoint(
            ..._0x38d32a
            .split("")
            .filter(
            (_0x5edfac, _0x2965d2) => _0x2965d2 > 15 && _0x2965d2 % 2 == 0
            )
            .map(
            (_0x2ffa6d) =>
            _0x2ffa6d.charCodeAt(0) ^ (_0x38d32a.length + _0x38d32a[7])
            )
            ) !==
            atob(
            "g5Go"
            ) /* password[16] = 'V', password[18] = 'D', password[20] =
            '}' */
            ) {
            return false;
            }
            if (
            _0x38d32a[_0x38d32a.length - 2] !==
            String.fromCharCode(Math.floor((({} + "").charCodeAt(0) + 9) / 3))
            ||
            _0x38d32a[1 + _0x38d32a[7]] !== giggity()[5] /* password[19]
            = ! */
            ) {
            return false;
            }
            return true;
            } catch (_0x4d4983) {
            return false;
            }
            }
            function getAdder(_0x430c9d) {
            switch (_0x430c9d) {
            case 0:
            return 34;
            case 1:
            return 44;
            case 2:
            return 26;
            case 3:
            return 60;
            }
            return 101;
            }
            function giggity() {
            return giggity.caller.name;
          
            }

          得到flag

          uoft{TH30R3M_PR0V3D!}


          主站蜘蛛池模板: 精品无码av一区二区三区| 夜夜嗨AV一区二区三区 | 无码人妻一区二区三区在线| 亚洲乱码国产一区网址| 国产在线精品一区二区不卡| 无码少妇A片一区二区三区| 一区二区三区四区在线视频| 在线观看亚洲一区二区| 亚洲日本中文字幕一区二区三区| 精品女同一区二区三区免费站| 无码精品人妻一区| 人妻少妇精品视频一区二区三区| 亚洲日本一区二区一本一道| 性色AV一区二区三区天美传媒| 国产午夜精品免费一区二区三区| 日韩精品国产一区| 亚洲精品精华液一区二区| 无码AV天堂一区二区三区| 久久一区二区免费播放| 国产人妖在线观看一区二区| 精品国产福利一区二区| 亚洲日韩精品一区二区三区无码| 一区二区三区精品高清视频免费在线播放 | 亚洲国产综合无码一区二区二三区 | 日产一区日产2区| 日本一区高清视频| 国产精品久久一区二区三区| 国产精品视频一区二区三区无码| 一区二区三区四区精品| 国产精品538一区二区在线| 成人免费观看一区二区| 亚洲av日韩综合一区在线观看| 国产高清在线精品一区二区三区| 亚洲色偷精品一区二区三区| 精品女同一区二区三区免费站| 日韩精品无码一区二区三区免费| 国产午夜精品一区二区三区| 免费看一区二区三区四区| 久久精品无码一区二区三区日韩| 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 | 无码喷水一区二区浪潮AV|