大型情感劇集Selenium:7_使用selenium,讓整個簡書網站都認識我! #華爲雲·尋找黑馬程序員#

安靜的學習,真好

媳婦兒帶着孩子去旅遊,終於可以一個人聽着陶喆的歌學習、寫博客了,這感覺真好!(明天我媳婦兒看到文章,又要…)
今天早上收到了份哭笑不得的鼓勵,一位朋友說我真勤勞,每天早上早起看一篇python文章,然後還發到朋友圈。
寫公衆號一個月了,每天早上朋友圈轉發一下文章,算是我最大的推廣了,然後被認爲是我讀別人的文章。
好吧,那我讀文章的時候,比這個寫文章的人時間不落分毫,哈哈。

說說selenium這個系列

這個大型情感劇集selenium系列,從開始做到現在第七集。一直在更新些零碎的知識,也沒有系統的寫過這方面代碼。
很多朋友覺得這個系列的文章,就只是面向自動化測試去寫的,其他人沒必要看,學了沒用。然後導致這個系列整體的閱讀量炒雞低!
那麼今天,針對咱們之前學的只是,再補充一些,來做一個練習吧,名字就叫:**使用selenium,讓整個簡書網站都認識我!**張狂吧?其實開玩笑的,簡書有安全回覆機制,禁止短時間進行刷屏的…
通過這篇文章我想告訴你,任何人學selenium,都不是白費的!想做微商、推廣的更應該關注我這篇文章,哈哈。

避坑指南與涉及知識點

大概羅列下場景覆蓋中,涉及到的知識點

cookie登陸簡書

本來想找個新賬號的,但就我一個人,這會兒2點了朋友圈求不怕封想出名的賬號,貌似也沒結果
攜帶cookie登陸簡書的方法,我上篇文章說了,就不再贅述了。

動態刷新簡書首頁文章鏈接

這裏要詳細說下簡書的文章刷新方式…

  • 進入簡書進來後,默認展示10-15篇文章
  • 頁面下拉框滑動,會通過Ajax刷新文章,一次刷新5篇刷新3次
  • 之後滑動刷新失效,需要點擊“閱讀更多”來獲取新的文章
  • 讀取刷新日誌,如該文章之前回復過,則跳過訪問下一篇文章
  1. 這幾種場景,我們可以通過js控制滾動條滑動到底部來實現刷新文章
  2. 通過try … except 判斷是否出現閱讀更多的文章來進行點擊事件
  3. 通過link.text與我們之前保存的日誌文件進行對比,判斷新文章訪問
  4. 點擊鏈接會彈出新標籤頁,此處涉及標籤切換、訪問、關閉和主handle的返回
文章回復

本來這裏沒什麼知識點的,但是簡書做的比較溜,文章內容也是Ajax成段展示,剛進入頁面無法後去到所有的內容,更沒辦法定位到回覆欄
開始使用直接下拉到底部的方式,但這種方式依然無法獲取所有內容及回覆窗口
需要逐步刷新,加載所有內容後,才能顯示回覆欄…
for循環每次下拉500單位,最終得到文章內容的方式完成此方式
WebDriverWait(driver,totaltime,checksplit).until()
其實本來這裏,用不到WebDriverWait的,這種一般都是在頁面訪問後,進行動態等待的,但咱們沒這個場景就生硬的使用下吧…

設置刷新文章頁數

根據想刷新的頁數,來控制主頁面進行多少次下拉框拖動和點擊“閱讀更多”…
最終結束時,將訪問過的文章重新寫入到日誌文件中…

代碼實現

由於cookie涉及到我的登陸驗證,所有就在代碼中隱藏了,如何獲取,上篇文章說過了…
我習慣不太好,註釋寫的比較少,抱歉,有不清楚的可以微信問我…

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清風Python
# @Date     : 2019/7/4 02:19
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : Be_A_Famous.py


import time
import os
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, \
    ElementNotInteractableException, TimeoutException


class FamousPerson:
    # 簡書首頁地址
    BaseUrl = "https://www.jianshu.com"
    # 腳本目錄
    BaseDir = os.path.dirname(os.path.realpath(__file__))
    # 日誌文件
    text_name = 'comment.txt'
    # 默認評論頁面數
    Page = 3
    # 設置變量,定位已訪問的文章數目
    ContentNo = 0

    def __init__(self):
        self.log_text = os.path.join(self.BaseDir, self.text_name)
        self.log_list = self.get_log()
        self.driver = self.init_driver()
        self.base_handle = None
        self.note_list = []

    def get_log(self):
        if os.path.exists(self.log_text):
            with open(self.log_text, 'r', encoding='utf-8') as f:
                return f.readlines()
        return []

    @staticmethod
    def init_driver():
        """
        basic option:
            set screen size
            disable info bar
        :return: driver
        """
        options = webdriver.ChromeOptions()
        options.add_argument('window-size=900,600')
        options.add_argument('disable-infobars')
        return webdriver.Chrome(options=options)

    def prepare_work(self):
        """
        1. add cookie
        2. set base handle
        """
        self.driver.get(self.BaseUrl)
        self.driver.add_cookie(cookie)
        self.driver.refresh()
        self.base_handle = self.driver.current_window_handle

    def control_scrollbar(self):
        """
        use js to control scroll down ...
        """
        _scrollTop = 0
        # 漸進下拉,避免大幅度頁面偏移,導致的textarea獲取失敗...
        for i in range(20):
            _scrollTop += 400
            js = "var q=document.documentElement.scrollTop={}".format(_scrollTop)
            self.driver.execute_script(js)
            time.sleep(0.2)
        # 簡書AJax刷新3次後,必須點擊一次查看更多,才能繼續刷新...
        try:
            self.driver.find_element_by_class_name('load-more').click()
        except NoSuchElementException:
            pass
        except ElementNotInteractableException:
            pass

    def add_comment(self):
        # 判斷窗口並切換
        for handle in self.driver.window_handles:
            if handle != self.base_handle:
                self.driver.switch_to.window(handle)
            print("訪問文章:{}".format(self.driver.title))
        # 滾動至頁面底部
        self.control_scrollbar()
        try:
            WebDriverWait(self.driver, 5, 0.5).until(
                ec.presence_of_element_located((By.TAG_NAME, 'textarea')))
            self.driver.find_element_by_tag_name('textarea').send_keys(comment_info)
            self.driver.find_element_by_class_name('btn-send').click()
            print("回覆成功")
        except TimeoutException:
            print("回覆失敗,未找到textarea,藍瘦...")
        # 爲展示效果,等待2秒,使用時可刪除...
        time.sleep(1)
        self.driver.close()
        # 切換至主窗口
        self.driver.switch_to.window(self.base_handle)

    def get_content(self):
        while self.Page:
            notes = self.driver.find_elements_by_css_selector('.note-list li')
            for note in notes[self.ContentNo:]:
                try:
                    note_link = note.find_element_by_tag_name('a')
                    note_name = note_link.text + '\n'
                    if note_name in self.log_list:
                        continue
                    self.log_list.append(note_name)
                    note_link.click()
                    time.sleep(1)
                    self.add_comment()
                    self.ContentNo += 1
                except:
                    pass
            self.Page -= 1
            # 下拉刷新一次頁面
            self.control_scrollbar()
        with open(self.log_text, 'w') as f:
            f.writelines(self.log_list)


def run():
    # 實例化方法
    start_test = FamousPerson()
    # add cookie set base_handle
    start_test.prepare_work()
    # 啓動評論
    start_test.get_content()


if __name__ == '__main__':
    comment_info = ("爲作者點贊! 小弟技術公衆號 【清風Python】 剛剛創建,"
                    "歡迎大家關注,謝謝支持。")
    cookie = {
        'name': 'remember_user_token',
        'value': 'token_value'  # 練習時請自行獲取,方法上篇文章寫了
    }
    run()

代碼執行效果

selenium實戰.gif

大家看到了間隔時間太短,連續回覆,會被系統禁止操作…至於間隔多久,我只是爲了寫文章,就不去仔細考究了…

The End

今天的selenium內容就更新到這裏,算是對之前知識的一個總結,和剩餘內容的一個總體概括與練習吧。
其實selenium涉及的知識還有很多,以及與它相關的一些部署、搭建、自動化報告等等功能。但因爲這個系列看的人實在太少,懶得更新了啊…
先暫時告一段落吧,如果還有人催更,我在想想下來寫點什麼吧。
OK,如果覺得這篇文章對你有幫助,歡迎將文章或我的微信公衆號【清風Python】轉發分享給更多喜歡python的朋友們,謝謝。

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