比Python,JavaScript才是更適合寫爬蟲的語言。原因有如下三個方面:
一、任務:爬取用戶在Github上的repo信息
通過實例的方式學習爬蟲是最好的方法,先定一個小目標:爬取github repo信息。入口URL如下,我們只需要一直點擊next按鈕就能夠遍歷到用戶的所有repo。
https://github.com/{{username}}?tab=repositories
獲取repo之后,可以做什么?
二、爬蟲雙股劍: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。
整個項目用到的庫包括:
試用地址:
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,我們一起飛!
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 的方式。
非常重要的理由就是:它能夠兼容市面上主流的瀏覽器, 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 方法。
文檔對象模型(Document Object Model,簡稱 DOM),是 W3C 組織推薦的處理可擴展標志語言的標準編程接口。
通過 DOM 對 HTML 頁面的解析,可以將頁面元素解析為元素節點、屬性節點和文本節點,這些解析出的節點對象,即 DOM 對象。DOM 對象可以使用 JavaScript 中的方法。
官網下載地址: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 對象是用JavaScript 語法創建的對象,也看做是 js 對象。
使用$(DOM 對象) 方式,可以 DOM 對象轉換為 jQuery 對象, 轉換為jQuery 對象才可以使用jQuery 中的提供的方法,操作DOM 對象。一般情況下,在命名 jQuery 對象時,為了與 DOM 對象進行區分,習慣性的以$ 開頭,這不是必須的。
例:新建html 頁面文件 domTojQuery.html
1. 頁面加入按鈕 button
2. 轉換 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 函數
*請認真填寫需求信息,我們會在24小時內與您取得聯系。