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 = r'D:\Python Program\chromedriver.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 reqeusts
req = 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 requests
from selenium import webdriver
chromePath = 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() #構建Session
cookies = wd.get_cookies() #導出cookie
for cookie in cookies:
    req.cookies.set(cookie['name'],cookie['value']) #轉換cookies
test = req.get('待測試的鏈接')

解釋下關鍵的幾個步驟:

1.找位置。推薦使用谷歌瀏覽器來查找每個元素的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 time
import requests
from selenium import webdriver
chromePath = r'瀏覽器儲存的位置'
wd = webdriver.Chrome(executable_path= chromePath) 
time.sleep(45)#設定45秒睡眠,期間進行手動登陸。十分關鍵,下面有解釋。
cookies = wd.get_cookies()#調出Cookies
req = 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的好處就是程序本身是不需要停止執行的!下面的所有程序可以無縫銜接。

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

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

參考:知乎回答

我在github上上傳了封裝的類:我的github     返回存儲cookie的requests

發佈了74 篇原創文章 · 獲贊 63 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章