Python自動化實戰(zhàn),自動登錄并發(fā)送微博
??????關注我,和老表一起學Python、云服務器
跟老表一起學云服務器開發(fā)相關文章(如果是第一次閱讀該系列文章,強烈建議先學習下面文章):
一、軟件準備
1.安裝Python 環(huán)境
首先需要你的電腦安裝好了Python環(huán)境,并且安裝好了Python開發(fā)工具。
如果你還沒有安裝,可以參考以下文章:
如果僅用Python來處理數(shù)據(jù)、爬蟲、數(shù)據(jù)分析或者自動化腳本、機器學習等,建議使用Python基礎環(huán)境+jupyter即可,安裝使用參考Windows/Mac 安裝、使用Python環(huán)境+jupyter notebook
如果想利用Python進行web項目開發(fā)等,建議使用Python基礎環(huán)境+Pycharm,安裝使用參考 :Windows下安裝、使用Pycharm教程,這下全了 和 Mac下玩轉Python-安裝&使用Python/PyCharm 。
2.安裝selenium庫
pip?install?selenium
3.下載谷歌瀏覽器驅動chromedriver,下載地址:http://npm.taobao.org/mirrors/chromedriver/
需要選擇對應的谷歌瀏覽器版本,(谷歌瀏覽器訪問:chrome://settings/help,即可查看版本)

下載好后,隨便發(fā)到一個路徑下即可(簡單點最好,記住路徑)。
二、實現(xiàn)方法
2.1 使用 Selenium 工具自動化模擬瀏覽器,當前重點是了解對元素的定位
對Selenium完全不了解,想進一步學習基礎的讀者還可以先看下這篇文章:2萬字帶你了解Selenium全攻略
我們想定位一個元素,可以通過 id、name、class、tag、鏈接上的全部文本、鏈接上的部分文本、XPath 或者 CSS 進行定位,在 Selenium Webdriver 中也提供了這 8 種方法方便我們定位元素。
1)通過 id 定位:我們可以使用 find_element_by_id() 函數(shù)。比如我們想定位 id=loginName 的元素,就可以使用browser.find_element_by_id(“l(fā)oginName”)。
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ù)。有時候超鏈接上的文本很長,我們通過查找部分文本內容就可以定位。
7)通過 XPath 定位:使用 find_element_by_xpath() 函數(shù)。使用 XPath 定位的通用性比較好,因為當 id、name、class 為多個,或者元素沒有這些屬性值的時候,XPath 定位可以幫我們完成任務。
8)通過 CSS 定位:使用 find_element_by_css_selector() 函數(shù)。CSS 定位也是常用的定位方法,相比于 XPath 來說更簡潔。
2.2 對元素進行的操作包括
1)清空輸入框的內容:使用 clear() 函數(shù);
2)在輸入框中輸入內容:使用 send_keys(content) 函數(shù)傳入要輸入的文本;
3)點擊按鈕:使用 click() 函數(shù),如果元素是個按鈕或者鏈接的時候,可以點擊操作;
4)提交表單:使用 submit() 函數(shù),元素對象為一個表單的時候,可以提交表單;
2.3 注意
由于selenium打開的chrome是原始設置的,所以訪問微博首頁時一定會彈出來是否提示消息的彈窗,導致不能定位到輸入框。可使用如下方法關閉彈窗:
prefs?=?{"profile.default_content_setting_values.notifications":?2}
2.4 如何定位元素
點擊需要定位的元素,然后右鍵選擇檢查,可以調出谷歌開發(fā)者工具。

獲取xpath 路徑,點擊谷歌開發(fā)者工具左上角的小鍵頭(選擇元素),選擇自己要查看的地方的,開發(fā)者工具就會自動定位到對應元素的源碼位置,選中對應源碼,然后右鍵,選擇Copy-> Copy XPath即可獲取到xpath 路徑。

另外: 可以下載 XPath Helper插件,安裝后 在網(wǎng)頁上選取想要提取的元素, 點擊右鍵 選中 檢查 然后 開發(fā)者工具自動打開 你可以看到 HTML代碼 ,選中然后再次點擊右鍵,選中copy 里的 copy to xpath這樣就得到了xpath的值了。
三、完整代碼
實現(xiàn)思路: 其實和平時我們正常操作一樣,只不過這里,全程由selenium來實現(xiàn),模擬點擊和輸入,所以整個過程為:打開登錄頁面->輸入賬號密碼->點擊登錄按鈕->在發(fā)微博框輸入發(fā)送內容->點擊發(fā)送按鈕->關閉瀏覽器(自選)。
3.1 目前自動輸入賬號可能會彈出登錄保護需掃二維碼驗證
from?selenium?import?webdriver
from?selenium.webdriver.chrome.service?import?Service
import?time
'''
自動發(fā)布微博
content:發(fā)送內容
username:微博賬號
password:微博密碼
'''
def?post_weibo(content,?username,?password):
????#?加載谷歌瀏覽器驅動
????path?=?r'C:/MyEnv/chromedriver.exe?'??#?指定驅動存放目錄
????ser?=?Service(path)
????chrome_options?=?webdriver.ChromeOptions()
????#?把允許提示這個彈窗關閉
????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()??#?設置頁面最大化,避免元素被隱藏??
????
????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[@class="info_list?login_btn"]/a')
????bt_logoin?=?driver.find_element_by_xpath('//div[@node-type="normal_form"]//div[@class="info_list?login_btn"]/a')??#?找到登錄按鈕
????bt_logoin.click()??#?點擊登錄
????#?等待頁面加載完畢??#有的可能需要登錄保護,需掃碼確認下
????time.sleep(40)
????#?登錄后?默認到首頁,有微博發(fā)送框
????print('#?找到文本輸入框?輸入內容?//*[@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()??#?關閉瀏覽器
if?__name__?==?'__main__':
????username?=?'微博用戶名'
????password?=?"微博密碼"
????#?自動發(fā)微博
????content?=?'每天進步一點'
????post_weibo(content,?username,?password)

通過cookie進行登錄可跳過掃碼登錄,cookie過期后重新獲取下cookie就可以了。
導入第三方包
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)?#?轉換成字符串保存
????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?'??#?指定驅動存放目錄
????ser?=?Service(path)
????chrome_options?=?webdriver.ChromeOptions()
????#?把允許提示這個彈窗關閉
????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()??#?關閉瀏覽器
????
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ā)送
可以參考上一篇文章:如何用Python發(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調度器
sched?=?BlockingScheduler(timezone='Asia/Shanghai')
#?job_every_nine?每天早上9點運行一次??日常發(fā)送
sched.add_job(every_day_nine,?'cron',?hour=9)
#?啟動定時任務
sched.start()
下期預告
凡是自動化的東西,都可以發(fā)到服務器上持續(xù)的去跑,當然,本地電腦也可以進行學習使用。
下一期,感覺有太多東西需要更新了,慢慢來吧,提前祝大家元旦快樂~2022,我準備好了!
好的,那么下期見,我是愛貓愛技術,更愛思思的老表???( ˙?˙ )???
跟老表一起學云服務器開發(fā)相關文章(如果是第一次閱讀該系列文章,強烈建議先學習下面文章):
老表每周三贈書
贈書規(guī)則:給本文點贊+2021想對自己說的一句話或者隨意留言,截止到2022.1.1 20:00,留言點贊top2的讀者可以獲贈一本,另外我將選擇一位讀者贈書一本(一定要留言吶,留言滿100后,將無法精選),一共送三本(包郵噠)。
【??注】同一讀者同一月內最多只能獲得一本贈書;必須在收到贈書后學習完圖書內容/投稿學習筆記一篇后才能獲得下一本贈書;不能刷贊。
如何找到我:
