使用Python自動刷取博客訪問量

前言

近來好幾個月都沒有更新過簡書的文章了,一來是年底之前工作上非常忙,二來是南方的溼冷天氣直接把人給凍懶了。之前打心底裏立的堅持寫作的Flag早已煙消雲散,今天我那有進取心的一部分身心感到很是藍瘦(難受),於是決定重新拾起這份寫作的熱情。今天來給大家分享一個通過Python編寫自動化腳本刷取博客訪問量的方法。

事情概要

年前有個朋友急需要刷取某浪博客的閱讀量,需要刷到20W+,於是乎找上我,希望我能幫他搞定。我在網上看了一些大牛們的解題思路和代碼示例,拋開編程語言,總結起來都是爬蟲思路,只是實現方式上有些優劣的差異。
針對只要打開網頁,網頁內容讀取完成就算一個閱讀量或者訪問量這一類的博主網站,拿Python來講可以通過:Request/urlib+代理池+多線程Thread來實現。
如何尋找代理池可自行百度谷歌或者訪問這個網站代理
思路就是可以通過Request模塊爬取網頁內容,再用BeautifulSoup模塊解析詳細的網頁內容,獲取到代理地址同時測試每個代理地址是否可用,把可用的地址記錄下來得到一個代理池,再使用代理池中的地址去刷取目標博客的URL網頁。
使用代理池的目的是爲了繞開大部分的博客系統都有封IP的防爬策略,單個IP訪問的次數或者頻率過高會被封殺。
還有另外一點需要注意的就是使用Request/urlib模塊訪問博客的時候需要設定好Http headers中的內容,模擬瀏覽器發起請求,可隨機使用多種瀏覽器的的User-agent標識,防止被博客系統的防爬蟲策略給幹掉。
但是今天我主要寫一下另外一種情況,因爲我發現這個某浪的博客系統對於打開網頁,內容讀取完成是不算閱讀量的,它還有一定的業務邏輯,需要瀏覽器打開網頁,網頁內容中有JS控制觸發了業務請求才算閱讀量,這就要求我採用另外一種思路來解決這個問題,於是乎就有了下面的方法。

方法

這裏我使用的是簡單直接的笨方法:通過編寫python代碼實現自動打開瀏覽器訪問指定URL,同時多線程控制實現每個URL在瀏覽器中定時刷新。
我們需要用到python的webbrower模塊,此模塊主要常用的幾個方法如下:

# 在系統的默認瀏覽器中訪問url地址,如果new=0,url會在同一個瀏覽器窗口中打開;
# 如果new=1,新的瀏覽器窗口會被打開;
# new=2新的瀏覽器tab會被打開。
# new參數的解釋不一定適用所有瀏覽器,具體瀏覽器有具體差異比如chrome總是新開一個tab
webbrowser.open(url, new=0, autoraise=True)

# 其實調用的還是上面的open
webbrowser.open_new(url)
# 同上
webbrowser.open_new_tab(url)
# 方法可以獲取到系統瀏覽器的操作對象。
webbrowser.get()
# 方法可以註冊瀏覽器類型
webbrowser.register()

最後一個register方法的使用和模塊支持的允許被註冊的瀏覽器類型可以參閱如下一篇博客:
http://www.cnblogs.com/hongten/p/hongten_python_webbrowser.html

編碼

首先編寫一個通過webbrower模塊可以自動打開一個URL地址並自動刷新的函數供多線程來調用。考慮到最大限度的利用計算機性能,方法支持多線程同時打開系統默認瀏覽器和谷歌瀏覽器來刷新URL(如果系統默認瀏覽器就是Chrome的同學可以把代碼簡單改下,微笑)

"""
此方法用於打開博客網站URL,目前此方法是在我本機Mac下跑的,如果是Windows或者Linux的朋友
需要稍作修改,只要修改註冊chrome的那一行代碼,chrome運行文件路徑即可,windows下是chrome.exe的全路徑
@:param url                     待刷取博客URL地址
@:param interval_time           自動刷新訪問的間隔時間(視個人設備和網絡實際情況設定)
@:param open_defalut            默認爲True用操作系統設定的默認瀏覽器打開,False爲使用chrome

"""
def open_brower_auto_refresh(url, interval_time, open_default=True):
    global count
    temp = 1
    while True:
        if open_default:
            brower = web.open(url, new=0, autoraise=False)
        else:
            chrome = web.get("chrome")
            chrome.open(url)
            temp = temp + 1
            #防止chrome瀏覽器tab頁開啓太多,內存耗盡
            if temp > 20:
                temp = 1
                os.system('pkill -9 Chrome')
                web.register("chrome", None, web.BackgroundBrowser(r'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'))
        time.sleep(interval_time)
        count = count+1

整個模塊包含多線程的完整代碼如下:

# coding=utf-8
"""
此模塊用於控制用戶自動打開瀏覽器,瀏覽博客網站URL,刷取閱讀量
若遇到會封單個IP的博客網站,可以考慮再拓展動態設置網絡代理
每個URL會對應一個獨立的訪問線程
"""
import webbrowser as web
import time
import threading
import os

# 用於全局統計刷取了訪問量總數
count = 0

"""
此方法用於打開博客網站URL,目前此方法是在我本機Mac下跑的,如果是Windows或者Linux的朋友
需要稍作修改,只要修改註冊chrome的那一行代碼,chrome運行文件路徑即可
@:param url                     待刷取博客URL地址
@:param interval_time           自動刷新訪問的間隔時間(視個人設備和網絡實際情況設定)
@:param open_defalut            默認爲True用操作系統設定的默認瀏覽器打開,False爲使用chrome

"""
def open_brower_auto_refresh(url, interval_time, open_default=True):
    global count
    temp = 1
    while True:
        if open_default:
            brower = web.open(url, new=0, autoraise=False)
        else:
            chrome = web.get("chrome")
            chrome.open(url)
            temp = temp + 1
            if temp > 20:
                temp = 1
                os.system('pkill -9 Chrome')
                web.register("chrome", None, web.BackgroundBrowser(r'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'))
        time.sleep(interval_time)
        count = count+1



if __name__ == '__main__':
    # 多線程啓動瀏覽器,每個頁面一個線程,自動延時的刷新間隔時間
    interval_time = 2
    #需要刷新的博客列表URL定義在這裏
    url_list = ["https://www.jianshu.com/u/93e6c3dd7c46", 
                "https://www.jianshu.com/p/1e48e68c6678"]
    for url in url_list:
        t2 = threading.Thread(target=open_brower_auto_refresh,
                              args=(url, interval_time+1))
        t2.start()
        time.sleep(1)
    for url in url_list:
        t4 = threading.Thread(target=open_brower_auto_refresh,
                              args=(url, interval_time, False))
        t4.start()
    while True:
        print "當前已刷新閱讀量總數:"+str(count)
        time.sleep(60)

模塊運行效果圖:



代碼是在Mac筆記本python 2.7.15版本上運行,親測Chrome瀏覽器的性能要好些,因爲每次訪問url Chrome都會新開一個tab再加上本身瀏覽器的性能優秀,所以使用chrome瀏覽器時interval_time可以相對設置小一點,相比其他瀏覽器。

後記優化思路

  1. 如果遇到比較變態的反爬蟲博客系統限制了單個IP的瀏覽器訪問頻率和次數,可以考慮結合代理池來繞過,使用webbrower模塊訪問URL之前先設置好瀏覽器網絡代理再發起請求。
  2. 基於綠色環保節能和收益最大化的思路,使用一臺電腦一直持續的做這個事情,說實話比較浪費,能耗較高。可以把上面的程序代碼放到一臺樹莓派上面跑,畢竟樹莓派使用的是手機充電頭5V 2A的電源供電,相比一臺電腦或者筆記本來說這是指數級的能耗比吧

最後,如果有同學還有其它好的解題思路,可以在留言區評論一下,大家互相學習,好的話我會幫你置頂評論,謝謝。

當然了,提升博客的訪問量還是需要通過提高博客內容質量,創作出優秀新穎的內容來吸引大衆,靠刷取閱讀量的博主一看就會露餡的,這條路終究是無法走長久。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章