|
相信很多python學(xué)習(xí)者都和我一樣在剛開(kāi)始學(xué)習(xí)爬蟲(chóng)時(shí),對(duì)見(jiàn)到的網(wǎng)站都有種躍躍欲試的沖動(dòng),像豆瓣電影、電影天堂以及各類(lèi)壁紙寫(xiě)真圖片網(wǎng)站的等等,但這些都是不需要登陸賬號(hào)就可以直接請(qǐng)求解析網(wǎng)頁(yè)獲取資源鏈接的,如果遇到需要登陸賬號(hào)的網(wǎng)站時(shí)就不行了。這個(gè)時(shí)候小編就及時(shí)出來(lái)解決大家的問(wèn)題,給大家準(zhǔn)備了一份模擬登陸代碼供大家學(xué)習(xí)。 環(huán)境準(zhǔn)備 python3.5 selenium模塊 模擬登陸思路 通過(guò)selenium中的webdriver控制瀏覽器登錄目標(biāo)網(wǎng)站,然后獲取模擬登陸需要的Cookie,再利用此Cookie來(lái)達(dá)到登錄的效果。本次我們使用webdriver來(lái)驅(qū)動(dòng)火狐瀏覽器插件。在登錄網(wǎng)站時(shí),cookie保存在發(fā)起請(qǐng)求的客戶(hù)端中,網(wǎng)站服務(wù)器利用cookie來(lái)區(qū)分不同的客戶(hù)端。cookie里面記錄了“訪問(wèn)登錄后才能看到的頁(yè)面”這一行為的信息,含有能夠向服務(wù)器證明:“我剛才登錄過(guò)”。因此cookie可以用來(lái)標(biāo)識(shí)客戶(hù)端的身份,以存儲(chǔ)它的信息。 登錄步驟 導(dǎo)入模塊 from selenium import webdriver
啟動(dòng)瀏覽器 通過(guò)webdriver驅(qū)動(dòng)火狐瀏覽器,然后在加載將要訪問(wèn)的目標(biāo)網(wǎng)站 driver = webdriver.Firefox() driver.get('目標(biāo)網(wǎng)站')
點(diǎn)擊登錄 找到網(wǎng)頁(yè)中登錄按鈕所在的位置,通過(guò)瀏覽器模擬點(diǎn)擊打開(kāi)登錄框,然后找到用戶(hù)名和密碼框的位置,輸入用戶(hù)名及密碼,在尋找按鈕以及密碼輸入框時(shí)可鼠標(biāo)右鍵然后找到“查看元素”選項(xiàng),點(diǎn)擊之后可在網(wǎng)頁(yè)源碼中尋找。代碼如下 driver.find_element_by_xpath("./*//input[@name='username']").clear() driver.find_element_by_xpath("./*//input[@name='username']").send_keys(user) driver.find_element_by_xpath("./*//input[@name='password']").clear() driver.find_element_by_xpath("./*//input[@name='password']").send_keys(password) driver.find_element_by_xpath("./*//button[@name='loginsubmit']").click()
記錄cookie 經(jīng)過(guò)上面幾步,如果沒(méi)有報(bào)錯(cuò)的話(huà)就說(shuō)明已經(jīng)登錄成功了,接下來(lái)我們?cè)俅渭虞d網(wǎng)頁(yè)獲取登錄cookie。代碼如下 driver.get('目標(biāo)網(wǎng)站') cookie_items = driver.get_cookies() for cookie_item in cookie_items: post[cookie_item['name']] = cookie_item['value'] cookie_str = json.dumps(post) with open('cookie.txt', 'w', encoding='utf-8') as f:
通過(guò)cookie登錄 獲得cookie之后,模擬登陸就跟之前一樣用requests請(qǐng)求網(wǎng)站,只需要將cookie內(nèi)容加到請(qǐng)求中即可。代碼如下 header = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64;rv:53.0) Gecko/20100101 Firefox/53.0"} with open('cookie.txt', 'r', encoding='utf-8') as f: cookies = json.loads(cookie) res = requests.get(url=url, cookies=cookies, headers=header)
對(duì)于有些網(wǎng)站來(lái)說(shuō),cookie的生命期較長(zhǎng),所以在第一次登陸獲取cookie后,在以后模擬登陸時(shí)只需要調(diào)用此cookie即可,十分方便。 具體代碼如下 from selenium import webdriver
driver = webdriver.Firefox() driver.get('目標(biāo)網(wǎng)站') driver.find_element_by_xpath("./*//button[@type='submit']").click() driver.find_element_by_xpath("./*//input[@name='username']").clear() driver.find_element_by_xpath("./*//input[@name='username']").send_keys(user) driver.find_element_by_xpath("./*//input[@name='password']").clear() driver.find_element_by_xpath("./*//input[@name='password']").send_keys(password)
driver.find_element_by_xpath("./*//button[@name='loginsubmit']").click() driver.get('目標(biāo)網(wǎng)站') cookie_items = driver.get_cookies()
#獲取到的cookies是列表形式,將cookies轉(zhuǎn)成json形式并存入本地名為cookie的文本中 for cookie_item in cookie_items: post[cookie_item['name']] = cookie_item['value'] cookie_str = json.dumps(post) with open('cookie.txt', 'w', encoding='utf-8') as f:
|