Scala爬蟲刷博客閱讀量

一、寫在前面

最近嘗試在簡(jiǎn)書上寫一些技術(shù)博客。每天看著可憐的閱讀量很是著急。剛好最近接觸爬蟲,有需求就有辦法。因此想到能否用爬蟲刷閱讀量呢?答案是可行的。

友情提示:
酒香不怕巷子深,要著力提高內(nèi)功,刷出的閱讀量騙不了別人也騙不了自己,提升自身技術(shù)才是關(guān)鍵。

二、實(shí)現(xiàn)思路

知識(shí)點(diǎn)

  1. 爬蟲主要的手段是通過(guò)HTTP請(qǐng)求,獲取并解析HTML網(wǎng)頁(yè),獲取指定數(shù)據(jù)
  2. HTML 網(wǎng)頁(yè)是一種格式數(shù)據(jù),解析可通過(guò)JSOUP(java 包)解析
  3. 獲取網(wǎng)頁(yè)可通過(guò) HTTP 協(xié)議的 Request 請(qǐng)求
  4. HTML網(wǎng)頁(yè)可分為動(dòng)態(tài)和靜態(tài)。靜態(tài)網(wǎng)頁(yè)可直接解析,動(dòng)態(tài)網(wǎng)頁(yè)的解析一種方法是通過(guò)模擬瀏覽器生成HTML,另一種是逆向工程分析頁(yè)面加載邏輯
  5. 模擬瀏覽器的過(guò)程實(shí)際是構(gòu)造一個(gè)自動(dòng)的JS解析引擎

實(shí)現(xiàn)流程

由于目前暫時(shí)未找到支持Scala 運(yùn)行的JS 引擎,而待解析的頁(yè)面又是動(dòng)態(tài)頁(yè)面,所以大致分為兩個(gè)模塊:
Python: 使用selenium + PhantomJS 構(gòu)造一個(gè)自動(dòng)化的JS 引擎,接受一個(gè)鏈接,然后刷新閱讀量,返回新的閱讀量和文章名稱,將刷新后的結(jié)果打印到控制臺(tái)
Scala: 解析靜態(tài)頁(yè)面,獲取要刷新的文章列表,接受一個(gè)文章列表的頁(yè)面,返回文章明細(xì)的地址信息。

環(huán)境要求

  1. 安裝selenium
  2. 安裝PhantomJS(速度要比Chrome快)

三、代碼實(shí)現(xiàn)

Python 解析動(dòng)態(tài)頁(yè)面

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import sys
import io
# sys.setdefaultencoding('utf8')
# TODO 如何刷贊
# TODO 微信公眾號(hào)如何刷新閱讀量和贊
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')
url = ('http://www.itdecent.cn/p/c20351c842bc')
# driver = webdriver.PhantomJS()
# 在pycharm 中必須指明PhantomJS的絕對(duì)路徑
driver = webdriver.PhantomJS("/Users/hhl/PycharmProjects/phantomjs-2.1.1-macosx/bin/phantomjs")

for i in range(2):
    time.sleep(2)
    driver.get(url)
    soup = BeautifulSoup(driver.page_source, 'xml')
    titles = soup.find_all('h1', {'class': 'title'})
    nums = soup.find_all('span', {'class': 'views-count'})
    for title, num in zip(titles, nums):
        print(title.get_text(), num.get_text())

Scala 解析靜態(tài)頁(yè)面,并調(diào)用Python腳本

package org.hhl.spark.pc
import org.jsoup.Jsoup

import scala.collection.JavaConverters._
import scala.sys.process._
/**
  * Created by huanghl4 on 2017/11/12.
  */
object RefreshBlogVistorNums {
  def main(args: Array[String]): Unit = {
    val l = blogList
    for (i <- 1 to 100) {
      l.foreach(x=>{
        val url = x
        println("當(dāng)前的URL是:" + url)
        val pe = s"python3 /Users/hhl/test.py $url"!
      })
    }
  }

  def blogList:List[String] = {
    val mainPageUrl = "http://www.itdecent.cn/u/ea9356f37a06"
    val doc = Jsoup.connect(mainPageUrl).get()
    val hrefs = doc.select("a.title").eachAttr("href").asScala.toList
    // fixme scala 循環(huán)如何像 java element: Elements 的寫法?
   // val title = doc.select("a.title").eachText().asScala.toList
    hrefs.map(x=>"http://www.itdecent.cn/" +x)
  }
  
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評(píng)論 25 709
  • 你可能會(huì)把 NodeJS 用作網(wǎng)絡(luò)服務(wù)器,但你知道它還可以用來(lái)做爬蟲嗎? 本教程中會(huì)介紹如何爬取靜態(tài)網(wǎng)頁(yè)——還有那...
    張嘉夫閱讀 5,207評(píng)論 3 51
  • 在火車上,沒(méi)有信號(hào),圖片啥的也都發(fā)不出去,一直請(qǐng)求超時(shí),瞬間沒(méi)了心情...睡覺(jué)算了,晚安。
    一把玻璃閱讀 128評(píng)論 0 1
  • 道吾山在瀏陽(yáng)北,而石霜在瀏陽(yáng)的南邊。從江西萬(wàn)載這邊過(guò)來(lái),到花炮之鄉(xiāng)大瑤鎮(zhèn),再往南到金剛鎮(zhèn),石霜寺就在此。瀏陽(yáng)汽車南...
    洪州禪心閱讀 831評(píng)論 0 3
  • 初讀曹禺先生的《雷雨》,便恰似讀懂了那個(gè)時(shí)代的一類人,他們?cè)?jīng)無(wú)視流言蜚語(yǔ)愛(ài)上門第懸殊的下層人家的姑娘,他們?cè)?jīng)都...
    黃宸閱讀 6,368評(píng)論 2 8

友情鏈接更多精彩內(nèi)容