Python模擬登陸萬能法-微博|知乎
Python模擬登陸讓不少人傷透腦筋,今天奉上一種萬能登陸方法。你無須精通HTML,甚至也無須精通Python,但卻能讓你成功的進行模擬登陸。本文講的是登陸所有網站的一種方法,並不局限於微博與知乎,僅用其作為例子來講解。
用到的庫有「selenium」和「requests」。通過selenium進行模擬登陸,然後將Cookies傳入requests,最終用requests進行網站的抓取。優點就是不但規避了「selenium」其本身抓取速度慢的問題(因為僅僅用其作為登陸),又規避了利用requests登陸時需要製作繁瑣的Cookies的過程(因為是從selenium直接拿來cookies)。文章前面列出了步驟與代碼,後面補充了登陸微博與知乎的實例。
文章最後給出了一個懶人的方法。想要走捷徑的朋友直接看第四部知乎登陸。該方法適用於登陸所有網站,僅用知乎作為實例以方便講解。
------------開始---------
需要材料:1.自己喜歡的webdriver (必須) 2.Anaconda(可選)。selenium是藉助瀏覽器而運行的,因此需要額外下載一款小型瀏覽器。Anaconda推薦大家也去下載一個,它裡面包含了眾多python的庫,用起來很方便,而且免費!友情鏈接:1.谷歌 Web Driver下載 2. Anaconda下載
第一部:利用selenium登陸
導入selenium庫
from selenium import webdriver
明確模擬瀏覽器在電腦中存放的位置,比如我存在了D盤
chromePath = rD:Python Programchromedriver.exe
用selenium的webdriver方程指明瀏覽器的路徑,同時打開一個瀏覽器。模擬瀏覽器有多種可選,比如Firefox, Safari。本次用的是谷歌的模擬瀏覽器。注意:.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.找位置。推薦使用谷歌瀏覽器來查找每個元素的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 = rD:Python Programchromedriver.exewd = webdriver.Chrome(executable_path= chromePath) zhihuLogInUrl = https://www.zhihu.com/signinwd.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])
推薦閱讀: