一、写在前面
最近尝试在简书上写一些技术博客。每天看着可怜的阅读量很是着急。刚好最近接触爬虫,有需求就有办法。因此想到能否用爬虫刷阅读量呢?答案是可行的。
友情提示:
酒香不怕巷子深,要着力提高内功,刷出的阅读量骗不了别人也骗不了自己,提升自身技术才是关键。
二、实现思路
知识点
- 爬虫主要的手段是通过HTTP请求,获取并解析HTML网页,获取指定数据
- HTML 网页是一种格式数据,解析可通过JSOUP(java 包)解析
- 获取网页可通过 HTTP 协议的 Request 请求
- HTML网页可分为动态和静态。静态网页可直接解析,动态网页的解析一种方法是通过模拟浏览器生成HTML,另一种是逆向工程分析页面加载逻辑
- 模拟浏览器的过程实际是构造一个自动的JS解析引擎
实现流程
由于目前暂时未找到支持Scala 运行的JS 引擎,而待解析的页面又是动态页面,所以大致分为两个模块:
Python: 使用selenium + PhantomJS 构造一个自动化的JS 引擎,接受一个链接,然后刷新阅读量,返回新的阅读量和文章名称,将刷新后的结果打印到控制台
Scala: 解析静态页面,获取要刷新的文章列表,接受一个文章列表的页面,返回文章明细的地址信息。
环境要求
- 安装selenium
- 安装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)
}
}