csdn搜索結果按照閱讀數排序

經常在CSDN博客裏查找文章,但是系統裏一直沒有找到結果按文章閱讀數排序的方法。因此自己寫個簡單的小爬蟲腳本,輸入要查找的關鍵字和想要獲取的條目,打印出排名前幾的博客網址。

當前是第一版本,支持輸入兩個參數:搜索關鍵字和期待結果數目, 屏幕上打印出閱讀數排名前幾的博客網址。

後續版本計劃更新:

1. 第一頁之後的結果遍歷,當前只處理第一頁的搜索結果

2. 不帶閱讀數的結果項解析,有些結果表項沒有閱讀數信息,需要打開博客去解析閱讀數

3. 健壯性保護:

    I. 增加輸入參數合法性校驗

    II. 網頁加載超時異常處理

    III. 元素找不到異常處理

    IV. xxx

4. help命令添加

5. 反爬蟲機制

import sys
import time
import re
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys


class Csdn():
    def __init__(self, searchStr, displayCount):
        self.searchStr = searchStr
        self.displayCount = displayCount
        self.retList = []
        options = Options()
        options.add_argument('--headless')
        options.add_argument('--disable-gpu')
        options.add_argument('log-level=3')
        self.driver = webdriver.Chrome(executable_path=r'C:\softPackage\chromedriver_win32\chromedriver.exe', options=options)
        
    def sortResult(self):
        def sortKey(item):
            counts = re.findall(r"\d+", item[0])
            return int(counts[0])
        self.retList.sort(key=sortKey, reverse=True)
        
    def desplayResult(self):
        if self.displayCount > len(self.retList):
            self.displayCount = len(self.retList)
        for retItem in self.retList[:self.displayCount]:
            print("%10s"%retItem[0], retItem[1])
        
    def run(self):
        driver = self.driver
        driver.get('https://blog.csdn.net/')
        driver.find_element_by_id('toolber-keyword').send_keys(self.searchStr)
        driver.find_element_by_id('toolber-keyword').send_keys(Keys.RETURN)
        time.sleep(1)
        handles = driver.window_handles
        driver.switch_to.window(handles[-1])
        items = driver.find_elements_by_xpath("//dd[@class='author-time']")
        # 作者: hpu11 日期:2018-06-07 https://blog.csdn.net/hpu11/article/details/80609571 225次閱讀
        for item in items: 
            strs = item.text.split()
            self.retList.append((strs[4], strs[3]))
        self.sortResult()
        self.desplayResult()
        driver.quit()


if __name__ == '__main__':
    searchStr = sys.argv[1]
    displayCount = int(sys.argv[2])
    csdn = Csdn(searchStr, displayCount)
    csdn.run()

 

結果顯示如下:

 

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