安靜的學習,真好
媳婦兒帶着孩子去旅遊,終於可以一個人聽着陶喆的歌學習、寫博客了,這感覺真好!(明天我媳婦兒看到文章,又要…)
今天早上收到了份哭笑不得的鼓勵,一位朋友說我真勤勞,每天早上早起看一篇python文章,然後還發到朋友圈。
寫公衆號一個月了,每天早上朋友圈轉發一下文章,算是我最大的推廣了,然後被認爲是我讀別人的文章。
好吧,那我讀文章的時候,比這個寫文章的人時間不落分毫,哈哈。
說說selenium這個系列
這個大型情感劇集selenium系列,從開始做到現在第七集。一直在更新些零碎的知識,也沒有系統的寫過這方面代碼。
很多朋友覺得這個系列的文章,就只是面向自動化測試去寫的,其他人沒必要看,學了沒用。然後導致這個系列整體的閱讀量炒雞低!
那麼今天,針對咱們之前學的只是,再補充一些,來做一個練習吧,名字就叫:**使用selenium,讓整個簡書網站都認識我!**張狂吧?其實開玩笑的,簡書有安全回覆機制,禁止短時間進行刷屏的…
通過這篇文章我想告訴你,任何人學selenium,都不是白費的!想做微商、推廣的更應該關注我這篇文章,哈哈。
避坑指南與涉及知識點
大概羅列下場景覆蓋中,涉及到的知識點
cookie登陸簡書
本來想找個新賬號的,但就我一個人,這會兒2點了朋友圈求不怕封想出名的賬號,貌似也沒結果
攜帶cookie登陸簡書的方法,我上篇文章說了,就不再贅述了。
動態刷新簡書首頁文章鏈接
這裏要詳細說下簡書的文章刷新方式…
- 進入簡書進來後,默認展示10-15篇文章
- 頁面下拉框滑動,會通過Ajax刷新文章,一次刷新5篇刷新3次
- 之後滑動刷新失效,需要點擊“閱讀更多”來獲取新的文章
- 讀取刷新日誌,如該文章之前回復過,則跳過訪問下一篇文章
- 這幾種場景,我們可以通過js控制滾動條滑動到底部來實現刷新文章
- 通過try … except 判斷是否出現閱讀更多的文章來進行點擊事件
- 通過link.text與我們之前保存的日誌文件進行對比,判斷新文章訪問
- 點擊鏈接會彈出新標籤頁,此處涉及標籤切換、訪問、關閉和主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()
代碼執行效果
大家看到了間隔時間太短,連續回覆,會被系統禁止操作…至於間隔多久,我只是爲了寫文章,就不去仔細考究了…
The End
今天的selenium內容就更新到這裏,算是對之前知識的一個總結,和剩餘內容的一個總體概括與練習吧。
其實selenium涉及的知識還有很多,以及與它相關的一些部署、搭建、自動化報告等等功能。但因爲這個系列看的人實在太少,懶得更新了啊…
先暫時告一段落吧,如果還有人催更,我在想想下來寫點什麼吧。
OK,如果覺得這篇文章對你有幫助,歡迎將文章或我的微信公衆號【清風Python】
轉發分享給更多喜歡python的朋友們,謝謝。