一、寫在前面
最近嘗試在簡(jiǎn)書上寫一些技術(shù)博客。每天看著可憐的閱讀量很是著急。剛好最近接觸爬蟲,有需求就有辦法。因此想到能否用爬蟲刷閱讀量呢?答案是可行的。
友情提示:
酒香不怕巷子深,要著力提高內(nèi)功,刷出的閱讀量騙不了別人也騙不了自己,提升自身技術(shù)才是關(guān)鍵。
二、實(shí)現(xiàn)思路
知識(shí)點(diǎn)
- 爬蟲主要的手段是通過(guò)HTTP請(qǐng)求,獲取并解析HTML網(wǎng)頁(yè),獲取指定數(shù)據(jù)
- HTML 網(wǎng)頁(yè)是一種格式數(shù)據(jù),解析可通過(guò)JSOUP(java 包)解析
- 獲取網(wǎng)頁(yè)可通過(guò) HTTP 協(xié)議的 Request 請(qǐng)求
- 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è)面加載邏輯
- 模擬瀏覽器的過(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)境要求
- 安裝selenium
- 安裝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)
}
}