Scala爬虫刷博客阅读量

一、写在前面

最近尝试在上写一些技术博客。每天看着可怜的阅读量很是着急。刚好最近接触爬虫,有需求就有办法。因此想到能否用爬虫刷阅读量呢?答案是可行的。

友情提示:
酒香不怕巷子深,要着力提高内功,刷出的阅读量骗不了别人也骗不了自己,提升自身技术才是关键。

二、实现思路

知识点

  1. 爬虫主要的手段是通过HTTP请求,获取并解析HTML网页,获取指定数据
  2. HTML 网页是一种格式数据,解析可通过JSOUP(java 包)解析
  3. 获取网页可通过 HTTP 协议的 Request 请求
  4. HTML网页可分为动态和静态。静态网页可直接解析,动态网页的解析一种方法是通过模拟浏览器生成HTML,另一种是逆向工程分析页面加载逻辑
  5. 模拟浏览器的过程实际是构造一个自动的JS解析引擎

实现流程

由于目前暂时未找到支持Scala 运行的JS 引擎,而待解析的页面又是动态页面,所以大致分为两个模块:
Python: 使用selenium + PhantomJS 构造一个自动化的JS 引擎,接受一个链接,然后刷新阅读量,返回新的阅读量和文章名称,将刷新后的结果打印到控制台
Scala: 解析静态页面,获取要刷新的文章列表,接受一个文章列表的页面,返回文章明细的地址信息。

环境要求

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

三、代码实现

Python 解析动态页面

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import sys
import io
# sys.setdefaultencoding('utf8')
# TODO 如何刷赞
# TODO 微信公众号如何刷新阅读量和赞
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')
url = ('http://www.jianshu.com/p/c20351c842bc')
# driver = webdriver.PhantomJS()
# 在pycharm 中必须指明PhantomJS的绝对路径
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 解析静态页面,并调用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("当前的URL是:" + url)
        val pe = s"python3 /Users/hhl/test.py $url"!
      })
    }
  }

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

你可能感兴趣的:(Scala爬虫刷博客阅读量)