<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python自動化實戰(zhàn),自動登錄并發(fā)送微博

          共 8246字,需瀏覽 17分鐘

           ·

          2021-12-31 06:43

          ??????關注我,和老表一起學Python、云服務器


          跟老表一起學云服務器開發(fā)相關文章(如果是第一次閱讀該系列文章,強烈建議先學習下面文章):

          先導篇:擁有有一臺服務器后,我竟然這么酷?

          替代項目:10行代碼寫一個簡歷頁面!

          手把手教大家如何給域名申請免費SSL證書

          Linux里的寶塔,真正的寶塔!詳細教程

          終于有了一個人人可以訪問的網(wǎng)站了

          如何用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還有效,否則無效。

          登錄狀態(tài)下才有自己的微博昵稱
          #?檢測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ā)相關文章(如果是第一次閱讀該系列文章,強烈建議先學習下面文章):

          先導篇:擁有有一臺服務器后,我竟然這么酷?

          替代項目:10行代碼寫一個簡歷頁面!

          手把手教大家如何給域名申請免費SSL證書

          Linux里的寶塔,真正的寶塔!詳細教程

          終于有了一個人人可以訪問的網(wǎng)站了

          如何用Python發(fā)送告警通知到釘釘?

          老表每周三贈書

          圖書介紹Python量化金融編程從入門到精通本書先從量化交易的基本概念講起,然后講解Python的基本語法及常見庫的使用,在每章節(jié)的學習中都以金融量化為實例,并在后結合實戰(zhàn)項目來進行學習和鞏固,讀者不但可以系統(tǒng)地學習Python編程的相關知識,而且還能學習到Python在量化交易場景下的應用。
          點擊下方卡片直接購買學習

          贈書規(guī)則給本文點贊+2021想對自己說的一句話或者隨意留言,截止到2022.1.1 20:00,留言點贊top2的讀者可以獲贈一本,另外我將選擇一位讀者贈書一本(一定要留言吶,留言滿100后,將無法精選,一共送三本(包郵噠)。


          ??注】同一讀者同一月內最多只能獲得一本贈書;必須在收到贈書后學習完圖書內容/投稿學習筆記一篇后才能獲得下一本贈書;不能刷贊。


          如何找到我:

          瀏覽 69
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美成人片网站 | 精品免费囯产一区二区三区 | 操逼福利| A V视频在线观看 | 18禁网站免费 |