Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 中文字幕永久在线,最新亚洲精品国自产在线,久久亚洲国产高清

          整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          使用JavaScript寫爬蟲

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

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

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

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

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

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

          • 統(tǒng)計用戶最常使用的語言,統(tǒng)計用戶語言使用分布情況統(tǒng)計用戶所獲取的star數(shù),fork數(shù)

          二、爬蟲雙股劍: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。

          整個項目用到的庫包括:

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

          試用地址:

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

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

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

          蟲是Python的一個重要的應(yīng)用,使用Python爬蟲我們可以輕松的從互聯(lián)網(wǎng)中抓取我們想要的數(shù)據(jù),本文將基于爬取B站視頻熱搜榜單數(shù)據(jù)并存儲為例,詳細介紹Python爬蟲的基本流程。如果你還在入門爬蟲階段或者不清楚爬蟲的具體工作流程,那么應(yīng)該仔細閱讀本文!

          第一步:嘗試請求

          首先進入b站首頁,點擊排行榜并復(fù)制鏈接

          https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3

          現(xiàn)在啟動Jupyter notebook,并運行以下代碼

          import requests

          url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
          res = requests.get('url')
          print(res.status_code)
          #200

          在上面的代碼中,我們完成了下面三件事

          • 導(dǎo)入requests

          • 使用get方法構(gòu)造請求

          • 使用status_code獲取網(wǎng)頁狀態(tài)碼

          可以看到返回值是200,表示服務(wù)器正常響應(yīng),這意味著我們可以繼續(xù)進行。

          第二步:解析頁面

          在上一步我們通過requests向網(wǎng)站請求數(shù)據(jù)后,成功得到一個包含服務(wù)器資源的Response對象,現(xiàn)在我們可以使用.text來查看其內(nèi)容

          可以看到返回一個字符串,里面有我們需要的熱榜視頻數(shù)據(jù),但是直接從字符串中提取內(nèi)容是比較復(fù)雜且低效的,因此我們需要對其進行解析,將字符串轉(zhuǎn)換為網(wǎng)頁結(jié)構(gòu)化數(shù)據(jù),這樣可以很方便地查找HTML標(biāo)簽以及其中的屬性和內(nèi)容。

          在Python中解析網(wǎng)頁的方法有很多,可以使用正則表達式,也可以使用BeautifulSouppyquerylxml,本文將基于BeautifulSoup進行講解.

          Beautiful Soup是一個可以從HTML或XML文件中提取數(shù)據(jù)的第三方庫.安裝也很簡單,使用pip install bs4安裝即可,下面讓我們用一個簡單的例子說明它是怎樣工作的

          from bs4 import BeautifulSoup

          page = requests.get(url)
          soup = BeautifulSoup(page.content, 'html.parser')
          title = soup.title.text
          print(title)
          # 熱門視頻排行榜 - 嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili

          在上面的代碼中,我們通過bs4中的BeautifulSoup類將上一步得到的html格式字符串轉(zhuǎn)換為一個BeautifulSoup對象,注意在使用時需要制定一個解析器,這里使用的是html.parser

          接著就可以獲取其中的某個結(jié)構(gòu)化元素及其屬性,比如使用soup.title.text獲取頁面標(biāo)題,同樣可以使用soup.bodysoup.p等獲取任意需要的元素。

          第三步:提取內(nèi)容

          在上面兩步中,我們分別使用requests向網(wǎng)頁請求數(shù)據(jù)并使用bs4解析頁面,現(xiàn)在來到最關(guān)鍵的步驟:如何從解析完的頁面中提取需要的內(nèi)容

          Beautiful Soup中,我們可以使用find/find_all來定位元素,但我更習(xí)慣使用CSS選擇器.select,因為可以像使用CSS選擇元素一樣向下訪問DOM樹。

          現(xiàn)在我們用代碼講解如何從解析完的頁面中提取B站熱榜的數(shù)據(jù),首先我們需要找到存儲數(shù)據(jù)的標(biāo)簽,在榜單頁面按下F12并按照下圖指示找到

          可以看到每一個視頻信息都被包在class="rank-item"li標(biāo)簽下,那么代碼就可以這樣寫


          主站蜘蛛池模板: av无码精品一区二区三区四区| 国产香蕉一区二区三区在线视频| 亚洲一区二区三区国产精华液| 国产一区二区三区不卡在线观看| 水蜜桃av无码一区二区| 国产精品 一区 在线| 日韩在线一区视频| 毛片一区二区三区| 97久久精品一区二区三区| 亚洲性日韩精品一区二区三区| 日本精品视频一区二区三区 | 国产一区二区三区夜色| 免费在线视频一区| 国产综合精品一区二区| 亚洲av乱码一区二区三区按摩| 无码精品人妻一区二区三区漫画 | 无码人妻精品一区二区| 中文字幕一区二区三区四区| 天堂不卡一区二区视频在线观看 | 国产一区二区三区久久| 中文字幕无码一区二区三区本日| 无码AV动漫精品一区二区免费| 又紧又大又爽精品一区二区| 国产精品久久亚洲一区二区 | 一区二区不卡在线| 麻豆果冻传媒2021精品传媒一区下载 | 中文字幕一区二区三区在线观看 | 一区二区三区高清视频在线观看| 精品一区二区三区在线观看l | 99无码人妻一区二区三区免费| 亚洲高清美女一区二区三区| 亚洲美女一区二区三区| 99久久精品日本一区二区免费| 亚洲Av永久无码精品一区二区| 日韩一区二区在线免费观看| 在线视频亚洲一区| 在线观看国产一区| 亚洲福利视频一区二区三区| 精品无人乱码一区二区三区| 免费在线视频一区| 久久精品一区二区三区四区 |