Python類比登陸萬能法

來源:互聯網
上載者:User

標籤:pre   cond   大寫   帳號密碼   import   過程   代碼   sign   ack   

此文轉自:https://zhuanlan.zhihu.com/p/28587931   轉錄只是為了方便學習,感謝他的分享

 

Python類比登陸讓不少人傷透腦筋,今天奉上一種萬能登陸方法。你無須精通HTML,甚至也無須精通Python,但卻能讓你成功的進行類比登陸。本文講的是登陸所有網站的一種方法,並不局限於微博與知乎,僅用其作為例子來講解。

用到的庫有“selenium”和“requests”。通過selenium進行類比登陸,然後將Cookies傳入requests,最終用requests進行網站的抓取。優點就是不但規避了“selenium”其本身抓取速度慢的問題(因為僅僅用其作為登陸),又規避了利用requests登陸時需要製作繁瑣的Cookies的過程(因為是從selenium直接拿來cookies)。文章前面列出了步驟與代碼,後面補充了登陸微博與知乎的執行個體。

文章最後給出了一個懶人的方法。想要走捷徑的朋友直接看第四部知乎登陸。該方法適用於登陸所有網站,僅用知乎作為執行個體以方便講解。

------------開始---------

需要材料:1.自己喜歡的webdriver (必須) 2.Anaconda(可選)。selenium是藉助瀏覽器而啟動並執行,因此需要額外下載一款小型瀏覽器。Anaconda推薦大家也去下載一個,它裡麵包含了眾多python的庫,用起來很方便,而且免費!友情連結:1.Google Web Driver下載 2. Anaconda下載

第一部:利用selenium登陸

匯入selenium庫

from selenium import webdriver

明確類比瀏覽器在電腦中存放的位置,比如我存在了D盤

chromePath = r‘D:\Python Program\chromedriver.exe‘ 

用selenium的webdriver方程指明瀏覽器的路徑,同時開啟一個瀏覽器。類比瀏覽器有多種可選,比如Firefox, Safari。本次用的是Google的類比瀏覽器。注意:‘.Chome‘是大寫字母。

wd = webdriver.Chrome(executable_path= chromePath)

讓webdriver為你填寫使用者名稱和密碼

wd.find_element_by_xpath(‘使用者名稱選項卡位置‘).send_keys(‘使用者名稱‘)wd.find_element_by_xpath(‘密碼選項卡位置‘).send_keys(‘密碼‘)

讓webdrive點擊登陸,若是按鈕就選擇用click(),若是表單就選擇submit()。

wd.find_element_by_xpath(‘登陸按鈕所在位置‘).click() #若是按鈕wd.find_element_by_xpath(‘登陸按鈕所在位置‘).submit() #若是表單

登陸完成,所有的cookies現在都存在了‘wd‘裡面,可隨時調用。

第二部:將selenium的cookies傳入requests

匯入requests庫,並構建Session()

import reqeustsreq = requests.Session()

從‘wd‘裡調出cookies

cookies = wd.get_cookies()

將selenium形式的cookies轉換為requests可用的cookies。

for cookie in cookies:        req.cookies.set(cookie[‘name‘],cookie[‘value‘])

大功告成!嘗試用requests來抓取網頁。

req.get(‘待測試的連結‘)

以上就是python類比登陸的萬能方法,你無需分析傳遞給網站的Cookies。只需要告訴python在什麼地方填寫使用者名稱與密碼就可以。十分的便利。

第三部:微博類比登陸
import requestsfrom selenium import webdriverchromePath = r‘瀏覽器存放位置‘wd = webdriver.Chrome(executable_path= chromePath) #構建瀏覽器loginUrl = ‘http://www.weibo.com/login.php‘ wd.get(loginUrl) #進入登陸介面wd.find_element_by_xpath(‘//*[@id="loginname"]‘).send_keys(‘userword‘) #輸入使用者名稱wd.find_element_by_xpath(‘//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input‘).send_keys(‘password‘) #輸入密碼wd.find_element_by_xpath(‘//*[@id="pl_login_form"]/div/div[3]/div[6]/a‘).click() #點擊登陸req = requests.Session() #構建Sessioncookies = wd.get_cookies() #匯出cookiefor cookie in cookies:    req.cookies.set(cookie[‘name‘],cookie[‘value‘]) #轉換cookiestest = req.get(‘待測試的連結‘)

解釋下關鍵的幾個步驟:

1.找位置。推薦使用Google瀏覽器來尋找每個元素的Xpath,參看這個:從Chrome擷取XPATH路徑。

2. 選擇click函數還是submit函數。推薦每個都試一下,總會有一個成功的。

3.登陸微博是被要求輸入驗證碼怎麼辦?有時登陸微博會被要求輸入驗證碼,這個時候我們可以加一行手動輸入驗證碼的代碼。例如:

wd.find_element_by_xpath(‘//*[@id="pl_login_form"]/div/div[3]/div[6]/a‘).click() #點擊登陸wd.find_element_by_xpath(‘//*[@id="pl_login_form"]/div/div[3]/div[3]/div/input‘).send_keys(input("輸入驗證碼: "))wd.find_element_by_xpath(‘//*[@id="pl_login_form"]/div/div[3]/div[6]/a‘).click()#再次點擊登陸

輸入驗證碼的時候需要點擊兩次登陸。因為驗證碼的輸入框只有在點擊了一次登陸後才會彈出來!根據每個網站的不同而靈活應用selenium是十分重要的!但這個和分析那些Cookies比起來簡直是太小兒科了。

第四部:知乎類比登陸

知乎經常更新,因此即使方法寫好了也可能不好用。因此我想到了一個終極方法,半手動登陸。僅用selenium開啟一個瀏覽器,然後手動輸入帳號密碼,有驗證碼就填驗證碼。等到成功登陸之後使用“get_cookies()”函數來調出它的Cookies。這個方法雖然看起來笨了點,但是效率比那些幾百行的代碼不知道要高多少!而且你還可以用手機掃描二維碼登陸!只要這些登陸操作是在selenium所開啟的瀏覽器內進行,selenium就可以完全記錄下這些Cookies。代碼如下:

import timeimport requestsfrom selenium import webdriverchromePath = r‘瀏覽器儲存的位置‘wd = webdriver.Chrome(executable_path= chromePath) time.sleep(45)#設定45秒睡眠,期間進行手動登陸。十分關鍵,下面有解釋。cookies = wd.get_cookies()#調出Cookiesreq = requests.Session()for cookie in cookies:    req.cookies.set(cookie[‘name‘],cookie[‘value‘])req.headers.clear() test = req.get(‘待測試的連結‘) 

req.headers.clear() 是刪除原始req裡面標記有python機器人的資訊。這個資訊會被一些網站(比如知乎)捕捉到。造成登陸爬取失敗。務必要刪除!

time.sleep()可以暫停執行下面的程式。在此期間你可以進行手動登陸,掃描二維碼等。然後在45秒過後再讓python執行後面的“cookies = wd.get_cookies()”。selenium的get.cookies方程可以抓取到你進行手動登陸過後的cookies。時間值的設定根據自己需要的時間。如果你在程式中已經將網站名、使用者名稱、密碼、等全部輸入就剩下一個驗證碼需要手動的話,僅設定幾秒鐘就可以了!加入time.sleep的好處就是程式本身是不需要停止執行的!下面的所有程式可以無縫銜接。

感謝大家讀到這,文章最初說的懶人方法就是我登陸知乎用到的這種方法,半手動。但是也不要覺得它不好,畢竟我們的目的是爬取網站的內容,儘快解決登陸問題。開始爬取工作才是正確的方向。這個方法可以幫您迅速登陸網站,節省大量時間。這個方法萬能的原理就是它調用了真實的瀏覽器。那麼只要在正常情況下瀏覽器能夠訪問的網站就都可以用這個方法登陸。

-------------------------------------------

本文結束-以下是常見問題集錦以及代碼贈送

問題1:如果網站禁用selenium怎麼辦?

解決方案:這種情況極少。網站如果採用這種反爬蟲手段的話很容易誤傷真正的使用者。如果真的遇到這種情況,只需要隱藏掉selenium中顯示你是機器人的資訊就可以了。參考連結:Can a website detect when you are using selenium with chromedriver?

問題2:如何讓新開啟的webdriver帶有曾經儲存過的cookies?

解決方案:將擷取的cookies儲存在本地。下次登陸的時候直接匯入本地的cookies。參考連結:How to save and load cookies using python selenium webdriver

 

友情贈送寫好的登陸代碼-知乎
from selenium import webdriverfrom requests import Sessionfrom time import sleepreq = Session()req.headers.clear() chromePath = r‘D:\Python Program\chromedriver.exe‘wd = webdriver.Chrome(executable_path= chromePath) zhihuLogInUrl = ‘https://www.zhihu.com/signin‘wd.get(zhihuLogInUrl)wd.find_element_by_xpath(‘/html/body/div[1]/div/div[2]/div[2]/div[1]/div[1]/div[2]/span‘).click()wd.find_element_by_xpath(‘/html/body/div[1]/div/div[2]/div[2]/form/div[1]/div[1]/input‘).send_keys(‘username‘) wd.find_element_by_xpath(‘/html/body/div[1]/div/div[2]/div[2]/form/div[1]/div[2]/input‘).send_keys(‘password‘)sleep(10) #手動輸入驗證碼 wd.find_element_by_xpath(‘/html/body/div[1]/div/div[2]/div[2]/form/div[2]/button‘).submit() sleep(10)#等待Cookies載入cookies = wd.get_cookies()for cookie in cookies:    req.cookies.set(cookie[‘name‘],cookie[‘value‘])

Python類比登陸萬能法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.