比Python,JavaScript才是更適合寫爬蟲的語言。原因有如下三個方面:
一、任務(wù):爬取用戶在Github上的repo信息
通過實例的方式學(xué)習(xí)爬蟲是最好的方法,先定一個小目標(biāo):爬取github repo信息。入口URL如下,我們只需要一直點擊next按鈕就能夠遍歷到用戶的所有repo。
https://github.com/{{username}}?tab=repositories
獲取repo之后,可以做什么?
二、爬蟲雙股劍:axios和jQuery
axios是JavaScript中很常用的異步網(wǎng)絡(luò)請求庫,相比jQuery,它更輕量、更專業(yè)。既能夠用于瀏覽器端,也可以用于Node。它的語法風(fēng)格是promise形式的。在本任務(wù)中,只需要了解如下用法就足夠了:
axios.get(url).then((resp)=> { 請求成功,處理resp.data中的html數(shù)據(jù) }).catch((err)=> { 請求失敗,錯誤處理 })
請求之后需要處理回復(fù)結(jié)果,處理回復(fù)結(jié)果的庫當(dāng)然是用jQuery。實際上,我們有更好的選擇:cheerio。
在node下,使用jQuery,需要使用jsdom庫模擬一個window對象,這種方法效率較低,四個字形容就是:笨重穩(wěn)妥。
如下代碼使用jQuery解析haha.html文件
fs=require("fs") jquery=require('jquery') jsdom=require('jsdom') //fs.readFileSync()返回結(jié)果是一個buffer,相當(dāng)于byte[] html=fs.readFileSync('haha.html').toString('utf8') dom=new jsdom.JSDOM(html) $=jquery(dom.window) console.log($('h1'))
cheerio只實現(xiàn)了jQuery中的DOM部分,相當(dāng)于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余行,便可實現(xiàn)簡單的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) })
三、更豐富的功能
爬蟲不是目的,而是達成目的的一種手段。獲取數(shù)據(jù)也不是目的,從數(shù)據(jù)中提取統(tǒng)計信息并呈現(xiàn)給人才是最終目的。
在github爬蟲的基礎(chǔ)上,我們可以擴展出更加豐富的功能:使用echarts等圖表展示結(jié)果。
要想讓更多人使用此爬蟲工具獲取自己的github統(tǒng)計信息,就需要將做成一個網(wǎng)站的形式,通過搜索頁面輸入用戶名,啟動爬蟲立即爬取github信息,然后使用echarts進行統(tǒng)計展示。網(wǎng)站肯定也要用js作為后端,這樣才能和js爬蟲無縫銜接,不然還要考慮跨語言調(diào)用。js后端有兩大web框架express和koa,二者API非常相似,并無優(yōu)劣之分,但express更加流行。
如上設(shè)計有一處用戶體驗不佳的地方:當(dāng)啟動爬蟲爬取github信息時,用戶可能需要等待好幾秒,這個過程不能讓用戶干等著。一種解決思路是:讓用戶看到爬蟲爬取的進度或者爬取過程。可以通過websocket向用戶推送爬取過程信息并在前端進行展示。展示時,使用類似控制臺的界面進行展示。
如何存儲爬取到的數(shù)據(jù)呢?使用MongoDB或者文件都可以,最好實現(xiàn)兩種存儲方式,讓系統(tǒng)的存儲方式變得可配置。使用MongoDB時,用到j(luò)s中的連接池框架generic-pool。
整個項目用到的庫包括:
試用地址:
https://weiyinfu.cn/githubstatistic/search.html?
案例地址:https://github.com/weiyinfu/GithubStatistic
原文鏈接:https://zhuanlan.zhihu.com/p/53763115
剛,記者從杭州市發(fā)改委獲悉,2022年春節(jié)期間留杭省外員工電子消費券申報工作,將于明天(1月18日)8:00開始,至1月24日21:00截止;異議處理申請于1月25日12:00截止。
申報通道根據(jù)員工參保情況,分為2個:
用人單位申報:職工社保或工程建設(shè)項目工傷保險的參保人員,由用人單位通過PC端在“親清在線”平臺申報。
靈活就業(yè)個人申報:靈活就業(yè)參保人員由個人通過手機端在浙里辦APP“親清在線”應(yīng)用申報。
具體怎么申報?一起來看!
1.登錄親清在線
路徑1:在“浙江省政務(wù)服務(wù)網(wǎng)”(https://www.zjzwfw.gov.cn)首頁“親清在線”欄目進入;
路徑二:瀏覽器直接訪問https://qinqing.hangzhou.gov.cn,進入親清在線。
打開“親清在線”首頁,在右上角按【登錄】,選擇【法人登錄】,使用浙江政務(wù)網(wǎng)高級實名認(rèn)證賬號、法人數(shù)字證書、電子營業(yè)執(zhí)照等方式登錄。
2.進入政策
登錄后,在“惠企政策”頁,找到置頂政策“春節(jié)期間留杭省外員工電子消費券發(fā)放”,點擊【兌現(xiàn)】。
如跳出“賬號等級不夠或未授權(quán)”提示框,說明當(dāng)前賬號不符合申報要求,請根據(jù)提示提升賬號等級或由更高賬號進行授權(quán)操作。
3.查閱政策
進入政策后可查閱政策內(nèi)容,點擊【申報】進入政策申報頁面。
以下申報單位將無法進入申報頁面,如與事實不符可聯(lián)系親清D小二:
①申報單位是國企、事業(yè)單位和非杭州企業(yè);
②申報單位無法判斷是否在杭(企業(yè)、個體工商戶、社會組織);
③申報單位未在杭納稅。
4.政策申報
第一步:確認(rèn)企業(yè)信息無誤后,可直接添加申領(lǐng)補貼的員工。
添加員工支持單條錄入和批量錄入兩種方式:
①單條錄入:點擊【添加員工】進行添加。【員工姓名】框支持使用姓名模糊查詢滿足參保和非浙條件的參保員工信息,選中后將自動補全對應(yīng)信息,填報人員補充員工手機號即可完成填報;也可直接手動錄入員工信息。
②批量錄入:【下載待申報數(shù)據(jù)】Excel電子表格(名單中包含滿足參保和非浙條件的員工信息),根據(jù)員工留杭情況對表格人員進行增刪處理,并補充員工手機號碼。確保表格內(nèi)只保留需申報的員工信息,點擊【批量導(dǎo)入】上傳表格。(批量導(dǎo)入數(shù)據(jù)單次最大支持200條,支持連續(xù)上傳多個表格)
添加成功后,員工將展示在下方申報列表中。
注:個人證件類型支持以下幾種,填報須使用與繳納社保時使用的證件類型一致,否則存在社保無記錄的問題:
(1)身份證;
(2)護照;
(3)其他:含港澳臺居民來往內(nèi)地通行證、港澳臺居民居住證、外國人永久居留證、護照等
第二步:在申報列表勾選員工,點擊【閱讀并簽署《承諾函》】。
第三步:點擊頁面上方的【提交兌現(xiàn)】,即完成申報操作。
5.申報記錄查看
點擊【兌現(xiàn)記錄】,可查看申報記錄的進度及狀態(tài)。
6.申報成功
申報單狀態(tài)為“申報成功”,即表示該員工已通過審核。員工會收到通過審核的短信通知。
***,感謝您積極響應(yīng)杭州市委市政府的倡議,將最好的時光留在杭州。請您于1月28日-2月6日期間,使用尾號“***”的證件號碼實名登錄“云閃付”APP領(lǐng)取新春留杭消費券(下載APP:app.95516.com;操作說明:https://article.95516.com/eq/ls/H9aryasG.html)。“親清在線”預(yù)祝您在杭州度過一個平安幸福年!
7.異議申請
申報單狀態(tài)未通過的,可點擊【查看詳情】查看不通過的原因。
不通過原因有兩種:
(1)未查到2021年12月度當(dāng)前員工在杭社保或工傷險繳納記錄。
(2)當(dāng)前員工不符合非浙戶籍。
若是因為員工信息填寫錯誤造成未通過,可以點擊【修改員工信息】更正員工姓名和手機號。
若對不通過原因有異議,可點擊【提交異議】上傳證明材料發(fā)起異議申請(異議處理不通過后不能再發(fā)起,還未處理的異議申報人可撤銷)。
8.處理記錄
異議經(jīng)政府端審批后返回審批結(jié)果,可在處理記錄里查看詳細說明。
9.親清攻略
親清在線在頁面頂端的“親清攻略”可查閱操作手冊和常見問題。
?下載與登錄
通過應(yīng)用市場或政務(wù)服務(wù)網(wǎng)(www.zjzwfw.gov.cn/zjzw/zj/zw_pc_download) 下載浙里辦APP。個人實名登錄浙里辦后,在“杭州市本級”站點首頁腰線處可見“親清在線”入口或直接搜索“親清在線”。
本端提供:
①靈活就業(yè)參保人員申報;
②企業(yè)員工查看本人是否通過審核。
? 查看政策
進入置頂政策“春節(jié)期間留杭省外員工電子消費券發(fā)放”,查看閱讀政策內(nèi)容,系統(tǒng)根據(jù)當(dāng)前用戶自動顯示不同功能。靈活就業(yè)參保人員顯示【申報】按鈕,可進入申報;單位參保員工顯示【查看】按鈕,可查閱審批通過情況。
? 申報政策
如當(dāng)前用戶符合靈活就業(yè)參保、非浙戶籍(2021年12月31日)、有效在杭居住證等條件,將顯示以下頁面,個人選中承諾事項后,提交申報即可完成申報。
如不符合以上條件,系統(tǒng)將根據(jù)情況返回以下三種提示:
? 異議申請
不符合2021年12月份靈活就業(yè)參保條件的需上傳個人參保證明、非浙戶籍證明、在杭居住證等掃描件或清晰照片。
提出異議經(jīng)人工審批后將返回結(jié)果。
? 查看申報結(jié)果
如完成申報的,可查看申報記錄。單位申報和個人申報結(jié)果都在此處展示。
用人單位為員工申報的狀態(tài)
個人申報的狀態(tài)
? 申報關(guān)閉
1月24日21點后申報將關(guān)閉;1月25日12點后異議申請將關(guān)閉。
如申報中還遇到其他問題
咨詢服務(wù)看這里
NO.1 線上咨詢
本政策頁面右側(cè)設(shè)置D小二咨詢圖標(biāo)。點擊開啟后,申報單位可通過即時對話方式在線與親清D小二進行互動交流,支持發(fā)送圖文信息、在線查看常見問題等服務(wù)。
本次電子消費券咨詢開通時間為1月18-25日,其中人工客服時間:1月18日-21日8:00-21:00,1月22日-23日為8:00-19:00,1月24日-25日為8:00-21:00。D小二響應(yīng)時間在3分鐘以內(nèi)。若D小二因過于忙碌無法及時回復(fù)消息,申報單位可以選擇留言,留言將生成工單由D小二處理。
NO.2 熱線咨詢
政策咨詢熱線:96345。提供政策申報方面問題咨詢。服務(wù)時間從2022年1月12日起至活動結(jié)束。
消費券客服熱線:銀聯(lián)7×24小時專屬客服熱線95516。服務(wù)時間從1月28日至2月底。提供消費券領(lǐng)取、使用、退款等相關(guān)問題的咨詢和處理。
常見問題
1.登錄賬號等級無法辦理
本政策需要具備二級以上實名認(rèn)證賬號進行操作,對應(yīng)經(jīng)辦人認(rèn)證等級2級以上,即1級、2級賬號可以直接申報本政策。如出現(xiàn)登錄賬號等級無法辦理的提示,可進入右上角【我的企業(yè)】【我的信息】-【經(jīng)辦人授權(quán)】查看賬號等級。
1級經(jīng)辦人指通過電子數(shù)字證書及電子營業(yè)執(zhí)照登錄的企業(yè)賬號。2級經(jīng)辦人指在浙江政務(wù)服務(wù)網(wǎng)完成高級實名認(rèn)證的賬號。
如需要使用3級賬號申報,可通過1級或2級賬號給3級賬號單獨授權(quán)本政策申報權(quán)限。選中經(jīng)辦人給您的賬號授權(quán)。
2.經(jīng)辦人信息不完善
使用數(shù)字證書或電子營業(yè)執(zhí)照登錄親清平臺,在事項辦理中,可能會出現(xiàn)經(jīng)辦人信息不完善的提示:
可點擊“我的企業(yè)”“修改手機號”補全經(jīng)辦人手機號信息。
3.批量導(dǎo)入失敗/添加失敗
通過【批量導(dǎo)入】導(dǎo)入Excel表格,員工信息出現(xiàn)缺失字段或人員重復(fù)等問題將會跳出以下提示。
4.港澳臺、外籍靈活就業(yè)參保人員
無法登錄浙里辦申報的
港澳臺、外籍在杭參加靈活就業(yè)社保的,如無法正常使用浙里辦,請往電子郵箱bgs@fzw.hz.gov.cn寄送本人簽名的留杭承諾函照片進行報名,審核情況將以郵箱回復(fù)。承諾函模板可點擊此鏈接下載:《港澳臺及外籍在杭靈活就業(yè)參保人員春節(jié)期間個人留杭承諾函》。
JQuery 是將 JS 的一些代碼塊進行封裝,方便使用。
1.JQ的引入
(1)link 導(dǎo)入
先進入 https://www.bootcdn.cn/ 網(wǎng)站進行查找,找到后復(fù)制到一個 js 中,進行引用。
(2)直接復(fù)制標(biāo)簽
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
1. JQ 獲取元素
$('.p1').eq(1).text('今天天氣真好')
$('.p1').html('<h>天氣真熱</h>')
2.JS 轉(zhuǎn) JQ
$(ap1).text('天好冷')
3. JQ 轉(zhuǎn) JS
var ap3=$('.p1')
ap3[0].innerText='金地是'
ap3.get(1).innerText='多少金幣' //get() 傳下標(biāo)
4. JQ JS 都可用
$('ul li').each(function (){
console.log($(this).text());
// console.log(this.innerText);
console.log($(this).index()); //jq 獲取下標(biāo)
})
<button>添加</button>
<button>刪除</button>
1. 添加 class
//添加class
$("button").eq(0).click(function (){
$("div").addClass("div1")
})
2. 刪除 class
(1)removeClass
//刪除class
$("button").eq(1).click(function (){
$("div").removeClass("div1")
})
(2)removeAttr
//刪除屬性和屬性值
$("button").eq(1).click(function (){
$("div").removeAttr("class")
3. 修改 class
(1)toggleclass
//無則增 有則增
$("button").eq(0).click(function (){
$("div").toggleClass("div1")
(2)attr
//無則增 有則改
$("button").eq(0).click(function (){
$("div").attr("class","div1")
$("div").attr("class","div2")
})
4.獲取 value
$("input").eq(0).val('666');
1. 獲取盒子寬高
(1)獲取寬
console.log($("div").width());
(2)獲取內(nèi)邊框加寬
$("div").innerWidth()
(3)獲取內(nèi)邊框,邊框外邊距和寬的寬度
$("div").outerWidth()
2. JQ 修改 CSS
// jq修改css
$("div").css("background","blue")
$("div").css({
"background":"pink",
"width":"150px"
})
3.定位元素(父級元素一定要有定位)
$(".div2").position()
4.定位瀏覽器窗口
$(".div2").offset()
1.單擊事件
$("div").click(function (){
console.log(1);
})
2.雙擊事件
$("div").dblclick(function (){
console.log(2);
})
3.劃入事件
$("div").mouseenter(function (){
console.log(3);
})
4.劃出事件
$("div").mouseout(function (){
console.log(4);
})
5.劃入劃出事件
$("div").hover(
function (){
console.log(3);
},function (){
console.log(5);
}
)
6.綁定事件
$("button").click(function (){
$("p").on("click",function (){
$("p").css('background','red')
})
})
7.綁定多個事件
$("p").on({
"mouseenter":function (){
$(this).css('background','yellow')
},
"mouseout":function (){
$(this).css('background','blue')
}
})
8.清除事件
$("button").click(function (){
$("p").off()
})
1. 隱藏
$("button").eq(0).click(function (){
// $("div").hide(1000)
$("div").slideUp(1000)
})
2.顯示
$("button").eq(1).click(function (){
$("div").show(1000)
// $("div").slideDown(1000)
})
3.取反
$("button").eq(2).click(function (){
$("div").slideToggle(1000)
// $("div").slideDown(1000)
})
4.淡出事件
$("button").eq(3).click(function (){
$("div").fadeOut(1000)
})
5.淡入事件
$("button").eq(4).click(function (){
$("div").fadeIn(1000)
})
6.淡入淡出取反事件
$("button").eq(5).click(function (){
$("div").fadeToggle(1000)
})
7.動畫效果
$("button").eq(6).click(function (){
$("div").delay(100).animate({
"width":"130px",
"height":"130px",
"top":"50px",
"left":"20px",
})
})
8.停止
$("button").eq(7).click(function (){
$("div").stop(1000)
})
附(今日份學(xué)習(xí)):
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。