如何用Python實現(xiàn)自動發(fā)送微博
一、軟件準備
1.安裝Python 環(huán)境
首先需要你的電腦安裝好了Python環(huán)境,并且安裝好了Python開發(fā)工具。如果你還沒有安裝,可以參考以下文章:如果僅用Python來處理數(shù)據(jù)、爬蟲、數(shù)據(jù)分析或者自動化腳本、機器學習等,建議使用Python基礎(chǔ)環(huán)境+jupyter即可,安裝使用參考??Windows/Mac 安裝、使用Python環(huán)境+jupyter notebook??
2.安裝selenium庫
pip install selenium
3.下載谷歌瀏覽器驅(qū)動chromedriver,下載地址:http://npm.taobao.org/mirrors/chromedriver/需要選擇對應(yīng)的谷歌瀏覽器版本,(谷歌瀏覽器訪問:chrome://settings/help,即可查看版本)
下載好后,隨便發(fā)到一個路徑下即可(簡單點最好,記住路徑)。
二、實現(xiàn)方法
2.1 使用 Selenium 工具自動化模擬瀏覽器,當前重點是了解對元素的定位
我們想定位一個元素,可以通過 id、name、class、tag、鏈接上的全部文本、鏈接上的部分文本、XPath 或者 CSS 進行定位,在 Selenium Webdriver 中也提供了這 8 種方法方便我們定位元素。
1)通過 id 定位:我們可以使用 find_element_by_id() 函數(shù)。比如我們想定位 id=loginName 的元素,就可以使用browser.find_element_by_id(“loginName”)。
2)通過 name 定位:我們可以使用 find_element_by_name() 函數(shù),比如我們想要對 name=key_word 的元素進行定位,就可以使用 browser.find_element_by_name(“key_word”)。
3)通過 class 定位:可以使用 find_element_by_class_name() 函數(shù)。
4)通過 tag 定位:使用 find_element_by_tag_name() 函數(shù)。
5)通過 link 上的完整文本定位:使用 find_element_by_link_text() 函數(shù)。
6)通過 link 上的部分文本定位:使用 find_element_by_partial_link_text() 函數(shù)。有時候超鏈接上的文本很長,我們通過查找部分文本內(nèi)容就可以定位。
7)通過 XPath 定位:使用 find_element_by_xpath() 函數(shù)。使用 XPath 定位的通用性比較好,因為當 id、name、class 為多個,或者元素沒有這些屬性值的時候,XPath 定位可以幫我們完成任務(wù)。
8)通過 CSS 定位:使用 find_element_by_css_selector() 函數(shù)。CSS 定位也是常用的定位方法,相比于 XPath 來說更簡潔。
2.2 對元素進行的操作包括
1)清空輸入框的內(nèi)容:使用 clear() 函數(shù);
2)在輸入框中輸入內(nèi)容:使用 send_keys(content) 函數(shù)傳入要輸入的文本;
3)點擊按鈕:使用 click() 函數(shù),如果元素是個按鈕或者鏈接的時候,可以點擊操作;
4)提交表單:使用 submit() 函數(shù),元素對象為一個表單的時候,可以提交表單;
2.3 注意
由于selenium打開的chrome是原始設(shè)置的,所以訪問微博首頁時一定會彈出來是否提示消息的彈窗,導(dǎo)致不能定位到輸入框??墒褂萌缦路椒P(guān)閉彈窗:
prefs = {"profile.default_content_setting_values.notifications": 2}
2.4 如何定位元素
點擊需要定位的元素,然后右鍵選擇檢查,可以調(diào)出谷歌開發(fā)者工具。
獲取xpath 路徑,點擊谷歌開發(fā)者工具左上角的小鍵頭(選擇元素),選擇自己要查看的地方的,開發(fā)者工具就會自動定位到對應(yīng)元素的源碼位置,選中對應(yīng)源碼,然后右鍵,選擇??Copy?
?-> ??Copy XPath?
?即可獲取到xpath 路徑。
另外: 可以下載 XPath Helper插件,安裝后 在網(wǎng)頁上選取想要提取的元素, 點擊右鍵 選中 檢查 然后 開發(fā)者工具自動打開 你可以看到 HTML代碼 ,選中然后再次點擊右鍵,選中copy 里的 copy to xpath這樣就得到了xpath的值了。
三、完整代碼
實現(xiàn)思路: 其實和平時我們正常操作一樣,只不過這里,全程由selenium來實現(xiàn),模擬點擊和輸入,所以整個過程為:打開登錄頁面->輸入賬號密碼->點擊登錄按鈕->在發(fā)微博框輸入發(fā)送內(nèi)容->點擊發(fā)送按鈕->關(guān)閉瀏覽器(自選)。
3.1 目前自動輸入賬號可能會彈出登錄保護需掃二維碼驗證
from selenium import webdriver from selenium.webdriver.chrome.service import Service import time ''' 自動發(fā)布微博 content:發(fā)送內(nèi)容 username:微博賬號 password:微博密碼 ''' def post_weibo(content, username, password): # 加載谷歌瀏覽器驅(qū)動 path = r'C:/MyEnv/chromedriver.exe ' # 指定驅(qū)動存放目錄 ser = Service(path) chrome_options = webdriver.ChromeOptions() # 把允許提示這個彈窗關(guān)閉 prefs = {"profile.default_content_setting_values.notifications": 2} chrome_options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(service=ser, options=chrome_options) driver.maximize_window() # 設(shè)置頁面最大化,避免元素被隱藏 print('# get打開微博主頁') url = 'http://weibo.com/login.php' driver.get(url) # get打開微博主頁 time.sleep(5) # 頁面加載完全 print('找到用戶名 密碼輸入框') input_account = driver.find_element_by_id('loginname') # 找到用戶名輸入框 input_psw = driver.find_element_by_css_selector('input[type="password"]') # 找到密碼輸入框 # 輸入用戶名和密碼 input_account.send_keys(username) input_psw.send_keys(password) print('# 找到登錄按鈕 //div[@node-type="normal_form"]//div[@]/a') bt_logoin = driver.find_element_by_xpath('//div[@node-type="normal_form"]//div[@]/a') # 找到登錄按鈕 bt_logoin.click() # 點擊登錄 # 等待頁面加載完畢 #有的可能需要登錄保護,需掃碼確認下 time.sleep(40) # 登錄后 默認到首頁,有微博發(fā)送框 print('# 找到文本輸入框 輸入內(nèi)容 //*[@id="homeWrap"]/div[1]/div/div[1]/div/textarea') weibo_content = driver.find_element_by_xpath('//*[@id="homeWrap"]/div[1]/div/div[1]/div/textarea') weibo_content.send_keys(content) print('# 點擊發(fā)送按鈕 //*[@id="homeWrap"]/div[1]/div/div[4]/div/button') bt_push = driver.find_element_by_xpath('//*[@id="homeWrap"]/div[1]/div/div[4]/div/button') bt_push.click() # 點擊發(fā)布 time.sleep(15) driver.close() # 關(guān)閉瀏覽器 if __name__ == '__main__': username = '微博用戶名' password = "微博密碼" # 自動發(fā)微博 content = '每天進步一點' post_weibo(content, username, password)
通過cookie進行登錄可跳過掃碼登錄,cookie過期后重新獲取下cookie就可以了。
導(dǎo)入第三方包
from selenium import webdriver from selenium.webdriver.chrome.service import Service import time import requests import json
獲取cookie到本地
這里主要利用了selenium的get_cookies函數(shù)獲取cookies。
# 獲取cookies 到本地 def get_cookies(driver): driver.get('https://weibo.com/login.php') time.sleep(20) # 留時間進行掃碼 Cookies = driver.get_cookies() # 獲取list的cookies jsCookies = json.dumps(Cookies) # 轉(zhuǎn)換成字符串保存 with open('cookies.txt', 'w') as f: f.write(jsCookies) print('cookies已重新寫入!') # 讀取本地的cookies def read_cookies(): with open('cookies.txt', 'r', encoding='utf8') as f: Cookies = json.loads(f.read()) cookies = [] for cookie in Cookies: cookie_dict = { 'domain': '.weibo.com', 'name': cookie.get('name'), 'value': cookie.get('value'), 'expires': '', 'path': '/', 'httpOnly': False, 'HostOnly': False, 'Secure': False } cookies.append(cookie_dict) return cookies
利用cookie登錄微博并發(fā)送文字 完整代碼
# 初始化瀏覽器 打開微博登錄頁面 def init_browser(): path = r'C:/MyEnv/chromedriver.exe ' # 指定驅(qū)動存放目錄 ser = Service(path) chrome_options = webdriver.ChromeOptions() # 把允許提示這個彈窗關(guān)閉 prefs = {"profile.default_content_setting_values.notifications": 2} chrome_options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(service=ser, options=chrome_options) driver.maximize_window() driver.get('https://weibo.com/login.php') return driver # 讀取cookies 登錄微博 def login_weibo(driver): cookies = read_cookies() for cookie in cookies: driver.add_cookie(cookie) time.sleep(3) driver.refresh() # 刷新網(wǎng)頁 # 發(fā)布微博 def post_weibo(content, driver): time.sleep(5) weibo_content = driver.find_element_by_xpath('//*[ @id ="homeWrap"]/div[1]/div/div[1]/div/textarea') weibo_content.send_keys(content) bt_push = driver.find_element_by_xpath('//*[@id="homeWrap"]/div[1]/div/div[4]/div/button') bt_push.click() # 點擊發(fā)布 time.sleep(5) driver.close() # 關(guān)閉瀏覽器 if __name__ == '__main__': # cookie登錄微博 driver = init_browser() login_weibo(driver) # 自動發(fā)微博 content = '今天的天氣真不錯~' post_weibo(content, driver)
拓展:檢測cookies有效性
檢測方法:利用本地cookies向微博發(fā)送get請求,如果返回的頁面源碼中包含自己的微博昵稱,就說明cookies還有效,否則無效。
# 檢測cookies的有效性 def check_cookies(): # 讀取本地cookies cookies = read_cookies() s = requests.Session() for cookie in cookies: s.cookies.set(cookie['name'], cookie['value']) response = s.get("https://weibo.com") html_t = response.text # 檢測頁面是否包含我的微博用戶名 if '老表max' in html_t: return True else: return False
拓展:定時每日自動發(fā)送
from apscheduler.schedulers.blocking import BlockingSchedulera ''' 每天早上9:00 發(fā)送一條微博 ''' def every_day_nine(): # cookie登錄微博 driver = init_browser() login_weibo(driver) req = requests.get('https://hitokoto.open.beeapi.cn/random') get_sentence = req.json() content = f'【每日一言】{get_sentence["data"]} 來自:一言api' # 自動發(fā)微博 post_weibo(content, driver) # 選擇BlockingScheduler調(diào)度器 sched = BlockingScheduler(timezone='Asia/Shanghai') # job_every_nine 每天早上9點運行一次 日常發(fā)送 sched.add_job(every_day_nine, 'cron', hour=9) # 啟動定時任務(wù) sched.start()
總結(jié)
到此這篇關(guān)于如何用Python實現(xiàn)自動發(fā)送微博的文章就介紹到這了,更多相關(guān)Python發(fā)送微博內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pycharm 如何連接遠程服務(wù)器并debug調(diào)試
本文主要介紹了Pycharm 如何連接遠程服務(wù)器并debug調(diào)試,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06python在windows下實現(xiàn)ping操作并接收返回信息的方法
這篇文章主要介紹了python在windows下實現(xiàn)ping操作并接收返回信息的方法,實例分析了Python實現(xiàn)ping操作的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03python讀取txt文件并取其某一列數(shù)據(jù)的示例
今天小編就為大家分享一篇python讀取txt文件并取其某一列數(shù)據(jù)的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python鏈式調(diào)用數(shù)據(jù)處理實際應(yīng)用實例探究
本文將深入介紹Python鏈式調(diào)用的概念、原理以及實際應(yīng)用,通過豐富的示例代碼,幫助讀者更全面地理解和應(yīng)用這一編程技巧2024-01-01