整合營銷服務商

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

          免費咨詢熱線:

          使用JavaScript寫爬蟲

          比Python,JavaScript才是更適合寫爬蟲的語言。原因有如下三個方面:

          • JavaScript異步IO機制適用于爬蟲這種IO密集型任務。JavaScript中的回調非常自然,使用異步網絡請求能夠充分利用CPU。
          • JavaScript中的jQuery毫無疑問是最強悍的HTML解析工具,使用JavaScript寫爬蟲能夠減少學習負擔和記憶負擔。雖然Python中有PyQuery,但終究還是比不上jQuery自然。
          • 爬取結果多為JSON,JavaScript是最適合處理JSON的語言。

          一、任務:爬取用戶在Github上的repo信息

          通過實例的方式學習爬蟲是最好的方法,先定一個小目標:爬取github repo信息。入口URL如下,我們只需要一直點擊next按鈕就能夠遍歷到用戶的所有repo。

          https://github.com/{{username}}?tab=repositories

          獲取repo之后,可以做什么?

          • 統計用戶最常使用的語言,統計用戶語言使用分布情況統計用戶所獲取的star數,fork數

          二、爬蟲雙股劍:axios和jQuery

          axios是JavaScript中很常用的異步網絡請求庫,相比jQuery,它更輕量、更專業。既能夠用于瀏覽器端,也可以用于Node。它的語法風格是promise形式的。在本任務中,只需要了解如下用法就足夠了:

          axios.get(url).then((resp) => {
           請求成功,處理resp.data中的html數據
          }).catch((err) => {
           請求失敗,錯誤處理
          })
          

          請求之后需要處理回復結果,處理回復結果的庫當然是用jQuery。實際上,我們有更好的選擇:cheerio。

          在node下,使用jQuery,需要使用jsdom庫模擬一個window對象,這種方法效率較低,四個字形容就是:笨重穩妥。

          如下代碼使用jQuery解析haha.html文件

          fs = require("fs")
          jquery=require('jquery')
          jsdom=require('jsdom') //fs.readFileSync()返回結果是一個buffer,相當于byte[] 
          html = fs.readFileSync('haha.html').toString('utf8') 
          dom= new jsdom.JSDOM(html) 
          $=jquery(dom.window) console.log($('h1'))
          

          cheerio只實現了jQuery中的DOM部分,相當于jQuery的一個子集。cheerio的語法和jQuery完全一致,在使用cheerio時,幾乎感覺不到它和jQuery的差異。在解析HTML方面,毫無疑問,cheerio是更好的選擇。如下代碼使用cheerio解析haha.html文件。

          cheerio=require('cheerio')
          html=require('fs').readFileSync("haha.html").toString('utf8')
          $=cheerio.load(html)
          console.log($('h1'))
          

          只需20余行,便可實現簡單的github爬蟲,此爬蟲只爬取了一頁repo列表。

          var axios = require("axios")
          var cheerio = require("cheerio")
          axios.get("https://github.com/weiyinfu?tab=repositories").then(resp => {
           var $ = cheerio.load(resp.data)
           var lis = $("#user-repositories-list li")
           var repos = []
           for (var i = 0; i < lis.length; i++) {
           var li = lis.eq(i)
           var repo = {
           repoName: li.find("h3").text().trim(),
           repoUrl: li.find("h3 a").attr("href").trim(),
           repoDesc: li.find("p").text().trim(),
           language: li.find("[itemprop=programmingLanguage]").text().trim(),
           star: li.find(".muted-link.mr-3").eq(0).text().trim(),
           fork: li.find(".muted-link.mr-3").eq(1).text().trim(),
           forkedFrom: li.find(".f6.text-gray.mb-1 a").text().trim()
           }
           repos.push(repo)
           }
           console.log(repos)
          })
          

          三、更豐富的功能

          爬蟲不是目的,而是達成目的的一種手段。獲取數據也不是目的,從數據中提取統計信息并呈現給人才是最終目的。

          在github爬蟲的基礎上,我們可以擴展出更加豐富的功能:使用echarts等圖表展示結果。

          要想讓更多人使用此爬蟲工具獲取自己的github統計信息,就需要將做成一個網站的形式,通過搜索頁面輸入用戶名,啟動爬蟲立即爬取github信息,然后使用echarts進行統計展示。網站肯定也要用js作為后端,這樣才能和js爬蟲無縫銜接,不然還要考慮跨語言調用。js后端有兩大web框架express和koa,二者API非常相似,并無優劣之分,但express更加流行。

          如上設計有一處用戶體驗不佳的地方:當啟動爬蟲爬取github信息時,用戶可能需要等待好幾秒,這個過程不能讓用戶干等著。一種解決思路是:讓用戶看到爬蟲爬取的進度或者爬取過程。可以通過websocket向用戶推送爬取過程信息并在前端進行展示。展示時,使用類似控制臺的界面進行展示。

          如何存儲爬取到的數據呢?使用MongoDB或者文件都可以,最好實現兩種存儲方式,讓系統的存儲方式變得可配置。使用MongoDB時,用到js中的連接池框架generic-pool。

          整個項目用到的庫包括:

          • express:后端框架
          • cheerio+axios:爬蟲
          • ws:websocket展示爬取過程
          • webpack:打包工具
          • less:樣式語言
          • echarts:圖表展示
          • vue:模板渲染
          • jquery:DOM操作
          • mongodb:存儲數據
          • generic-pool:數據庫連接池

          試用地址:

          https://weiyinfu.cn/githubstatistic/search.html?

          案例地址:https://github.com/weiyinfu/GithubStatistic

          原文鏈接:https://zhuanlan.zhihu.com/p/53763115

          面的表格列出了所有用于處理 HTML 和 CSS 的 jQuery 方法。

          下面的方法適用于 HTML 和 XML 文檔。除了:html() 方法。

          方法描述
          addClass()向被選元素添加一個或多個類名
          after()在被選元素后插入內容
          append()在被選元素的結尾插入內容
          appendTo()在被選元素的結尾插入 HTML 元素
          attr()設置或返回被選元素的屬性/值
          before()在被選元素前插入內容
          clone()生成被選元素的副本
          css()為被選元素設置或返回一個或多個樣式屬性
          detach()移除被選元素(保留數據和事件)
          empty()從被選元素移除所有子節點和內容
          hasClass()檢查被選元素是否包含指定的 class 名稱
          height()設置或返回被選元素的高度
          html()設置或返回被選元素的內容
          innerHeight()返回元素的高度(包含 padding,不包含 border)
          innerWidth()返回元素的寬度(包含 padding,不包含 border)
          insertAfter()在被選元素后插入 HTML 元素
          insertBefore()在被選元素前插入 HTML 元素
          offset()設置或返回被選元素的偏移坐標(相對于文檔)
          offsetParent()返回第一個定位的祖先元素
          outerHeight()返回元素的高度(包含 padding 和 border)
          outerWidth()返回元素的寬度(包含 padding 和 border)
          position()返回元素的位置(相對于父元素)
          prepend()在被選元素的開頭插入內容
          prependTo()在被選元素的開頭插入 HTML 元素
          prop()設置或返回被選元素的屬性/值
          remove()移除被選元素(包含數據和事件)
          removeAttr()從被選元素移除一個或多個屬性
          removeClass()從被選元素移除一個或多個類
          removeProp()移除通過 prop() 方法設置的屬性
          replaceAll()把被選元素替換為新的 HTML 元素
          replaceWith()把被選元素替換為新的內容
          scrollLeft()設置或返回被選元素的水平滾動條位置
          scrollTop()設置或返回被選元素的垂直滾動條位置
          text()設置或返回被選元素的文本內容
          toggleClass()在被選元素中添加/移除一個或多個類之間切換
          unwrap()移除被選元素的父元素
          val()設置或返回被選元素的屬性值(針對表單元素)
          width()設置或返回被選元素的寬度
          wrap()在每個被選元素的周圍用 HTML 元素包裹起來
          wrapAll()在所有被選元素的周圍用 HTML 元素包裹起來
          wrapInner()在每個被選元素的內容周圍用 HTML 元素包裹起來
          $.escapeSelector()轉義CSS選擇器中有特殊意義的字符或字符串
          $.cssHooks提供了一種方法通過定義函數來獲取和設置特定的CSS值

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          Query是什么?

          jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之后又一個優秀的JavaScript代碼庫(或JavaScript框架)。

          jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝JavaScript常用的功能代碼,提供一種簡便的JavaScript設計模式,優化HTML文檔操作、事件處理、動畫設計和Ajax交互。

          jQuery的核心特性可以總結為:具有獨特的鏈式語法和短小清晰的多功能接口;具有高效靈活的css選擇器,并且可對CSS選擇器進行擴展;擁有便捷的插件擴展機制和豐富的插件。jQuery兼容各種主流瀏覽器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等

          搭配視頻效果更佳哦~~~

          jQuery從入門到精通

          https://www.ixigua.com/6846624275877593611

          開篇基礎

          jQuery 是一款跨主流瀏覽器的JavaScript 庫,封裝了JavaScript 相關方法調用,簡化JavaScript 對HTML DOM 操作

          官網地址: https://jquery.com/

          官網首頁jQuery 介紹:

          原文翻譯:

          jQuery 是一個快速,小巧,功能豐富的JavaScript 庫。 它通過易于使用的API 在大量瀏覽器中運行,使得HTML 文檔遍歷和操作,事件處理,動畫和Ajax 變得更加簡單。 通過多功能性和可擴展性的結合,jQuery 改變了數百萬人編寫JavaScript 的方式。

          為什么[why]使用 jQuery

          非常重要的理由就是:它能夠兼容市面上主流的瀏覽器, IE 和FireFox, Google 瀏覽器處理 AJAX,創建異步對象是不同的,而jQuery 能夠使用一種方式在不同的瀏覽器創建AJAX 異步對象。

          其他優點:

          (1) 寫少代碼,做多事情【write less do more】

          (2) 免費,開源且輕量級的js 庫,容量很小

          (3) 兼容市面上主流瀏覽器,例如 IE,Firefox,Chrome

          (4) 能夠處理HTML/JSP/XML、CSS、DOM、事件、實現動畫效果, 也能提供異步AJAX 功能

          (5) 文檔手冊很全,很詳細

          (6) 成熟的插件可供選擇,多種js 組件,例如日歷組件(點擊按鈕顯示下來日期)

          (7) 出錯后,有一定的提示信息

          (8) 不用再在html 里面通過<script>標簽插入一大堆 js 來調用命令了

          例如:使用JavaScript 定位DOM 對象常用的三種方式:

          (1) 通過ID 屬性:document.getElementById()

          (2) 通過 class 屬性:getElementsByClassName()

          (3) 通過標簽名:document.getElementsByTagName()

          上面代碼可以看出JavaScript 方法名太長了,大小寫的組合太多了,編寫代碼效率,容易出錯。jQuery 分別使用$(“#id”) , $(“.class 名”) , $(“標簽名) 封裝了上面的 js 方法。

          DOM 對象

          文檔對象模型(Document Object Model,簡稱 DOM),是 W3C 組織推薦的處理可擴展標志語言的標準編程接口。

          通過 DOM 對 HTML 頁面的解析,可以將頁面元素解析為元素節點、屬性節點和文本節點,這些解析出的節點對象,即 DOM 對象。DOM 對象可以使用 JavaScript 中的方法。

          獲取jQuery

          官網下載地址:https://jquery.com/download/

          jQuery 的不同版本中,2.xx 不再支持 IE6/7/8 瀏覽器。現階段IE6/7/8 已經是淘汰的,非主流。可以不用考慮兼容問題。

          對于每一個同一版本號的 jQuery,其庫又分為兩個。一個是未壓縮版,可查看源碼,開發時使用;一個是壓縮版,將注釋、空格均做了刪除,將變量字符數減少,產品上線時使用。

          牛刀小試

          編寫jQuery 的工具很多,能編寫HTML 的工具都支持jQuery. 例如記事本 ,EditPlus, webStorm, Visual Studio Code , HBuilder , HBuilderX , IDEA.

          單獨學習jQuery 庫使用,可以輕量的開發工具,例如EditPlus ,HBuilder,HbuilderX

          編寫項目可以使用集成開發工具,例如在IDEA, Eclipse ,MyEclipse ,WebStorm 等

          第一個例子完成:瀏覽器完全裝載html 頁面 DOM 后,顯示一個提示信息框

          實現步驟:

          1. 使用HBuilder 或HbuilderX, idea 都可以,以HbuilderX 為工具,創建一個項目(名稱:jquery-course),給項目選擇一個文件存放目錄。

          2. 在項目中再創建一個目錄

          右鍵項目名稱—新建—目錄,常用名稱為 js

          3. 拷貝下載的jQuery.js 文件到目錄

          4. 使用 jQuery,首先要將 jQuery 庫引入。使用如下語句:

          <script type="text/javascript" src="js/jquery-3.4.1.js"></script>

          5. $(document),將 DOM 對象 document 轉換為jQuery 對象。

          $(document).ready()函數是當 DOM 對象加載完畢后,馬上執行的函數。

          $(document).ready()與$()、jQuery()、window.jQuery()是等價的,所以

          $(document).ready()可以寫成 $(function() { alert(“Hello jQuery”) } );

          6. 完整代碼

          DOM 對象和jQuery 對象

          DOM 對象是用JavaScript 語法創建的對象,也看做是 js 對象。

          1. DOM 對象轉換jQuery 對象:

          使用$(DOM 對象) 方式,可以 DOM 對象轉換為 jQuery 對象, 轉換為jQuery 對象才可以使用jQuery 中的提供的方法,操作DOM 對象。一般情況下,在命名 jQuery 對象時,為了與 DOM 對象進行區分,習慣性的以$ 開頭,這不是必須的。

          例:新建html 頁面文件 domTojQuery.html

          1. 頁面加入按鈕 button

          2. 轉換 DOM 對象

          2. jQuery 對象轉為DOM 對象

          jQuery 對象本身為數組對象,該數組中的第 0 個元素即為該 jQuery 對象對應 的 DOM

          對象。所以有兩種方式可以獲取到 DOM 對象:get(0) 方式與下標[0]

          例:新建html 文件 jQueryToDom.html

          1. 頁面添加 text ,button

          2. jQuery 對象.get(0) 或 jQuery 對象[0] 均可完成 jQuery 對象轉 DOM對象

          選擇器

          選擇器: 就是定位條件;通知jquery 函數定位滿足條件的DOM 對象

          基本選擇器

          根據ID,class 屬性,標簽類型名定位HTML 元素,轉為jQuery 對象.

          1. id 選擇器

          語法:$(“#id”)

          2. class 選擇器

          語法:$(“.class 名稱”)

          3. 標簽選擇器

          語法:$(“標簽名”)

          例:新建selector.html

          1. 在頁面 head 部分加入 css

          2. 加入 jQuery 引用

          3.body 部分定義div

          4.創建 js 函數

          4. 所有選擇器

          語法:$(“*”) 選取頁面中所有DOM 對象。

          5. 組合選擇器

          組合選擇器是多個被選對象間使用逗號分隔后形成的選擇器,可以組合 id, class,標簽名等。

          語法:$(“#id, .class, 標簽名”)

          例:

          1. 上面的 selector.html 頁面中加入按鈕

          2. 增加 js 函數

          表單選擇器

          表單相關元素選擇器是指文本框、單選框、復選框、下拉列表等元素的選擇方式。該方法無論是否存在表單<form>,均可做出相應選擇。表單選擇器是為了能更加容易地操作表單,表單選擇器是根據元素類型來定義的

          <input type="text">

          <input type="password">

          <input type="radio">

          <input type="checkbox">

          <input type="button">

          <input type="file">

          <input type="submit">

          <input type="reset">

          $(":tr"): 不能用,tr 不是input 標簽語法: $(":type 屬性值")

          例如:

          $(":text")選取所有的單行文本框

          $(":password")選取所有的密碼框

          $(":radio")選取所有的單選框

          $(":checkbox")選取所有的多選框

          例:

          新建form.html 頁面定義元素:

          定義 js 函數:

          過濾器

          jQuery 對象中存儲的DOM對象順序與頁面標簽聲明位置關系

          <div>1</div> dom1

          <div>2</div> dom2

          <div>3</div> dom3

          $("div") == [dom1,dom2,dom3]

          過濾器就是過濾條件,對已經定位到數組中DOM 對象進行過濾篩選,過濾條件不能獨立出現在jquery 函數,如果使用只能出現在選擇器后方。

          基本過濾器

          1. 選擇第一個first, 保留數組中第一個DOM 對象

          語法:$(“選擇器:first”)

          2. 選擇最后個last, 保留數組中最后DOM 對象

          語法:$("選擇器:last")

          3. 選擇數組中指定對象

          語法:$(“選擇器:eq(數組索引)”)

          4. 選擇數組中小于指定索引的所有DOM 對象

          語法:$(“選擇器:lt(數組索引)”)

          5. 選擇數組中大于指定索引的所有DOM 對象

          語法:$(“選擇器:gt(數組索引)”)

          實例操作

          1.定義樣式

          2. 頁面加入div

          3. 定義js 函數

          表單對象屬性過濾器

          1. 選擇可用的文本框

          $(“:text:enabled”)

          2. 選擇不可用的文本框

          $(“:text:disabled”)

          3. 復選框選中的元素

          $(“:checkbox:checked”)

          4. 選擇指定下拉列表的被選中元素

          選擇器>option:selected

          例:

          創建filterForm.html 頁面:

          js 函數


          主站蜘蛛池模板: 国产成人无码精品一区二区三区| 日韩精品免费一区二区三区| 亚洲一区二区三区国产精品| 国内精品无码一区二区三区| 中文字幕亚洲一区二区va在线| 2018高清国产一区二区三区 | 精品一区二区三区在线观看视频| 精品国产亚洲第一区二区三区| 成人无码AV一区二区| 日韩aⅴ人妻无码一区二区| 无码av免费一区二区三区| 亚洲爽爽一区二区三区| 国产激情一区二区三区小说| 久久精品一区二区免费看| 亚洲一区二区视频在线观看| 人妻视频一区二区三区免费| 色窝窝无码一区二区三区色欲| 亚洲午夜日韩高清一区| 日本一区午夜爱爱| 久久精品道一区二区三区| 一区二区三区四区精品| 精品国产一区在线观看| 丰满爆乳无码一区二区三区| 亚洲AV无码一区二区三区牲色| 亚洲综合在线成人一区| 免费无码一区二区三区| 亚洲一区二区三区日本久久九| 亚洲日韩激情无码一区| 久久精品视频一区| 91在线视频一区| 亚洲av无码片vr一区二区三区| 亚洲AV噜噜一区二区三区| 色综合视频一区二区三区44| 夜精品a一区二区三区| 精品无码成人片一区二区| 一区二区三区高清在线 | 亚洲另类无码一区二区三区| 成人日韩熟女高清视频一区| 一区二区三区福利视频免费观看| 日韩人妻无码一区二区三区99| 一区二区和激情视频|