上一篇文章Python爬蟲——新浪微博(網(wǎng)頁版)中提到cookie過期問題袍祖,想了一下可以通過selenium+chrome模擬登陸獲取登陸成功后的cookies拧篮,然后構(gòu)造字典返回牢裳,這樣在主程序進(jìn)行判斷如果抓不到正確的數(shù)據(jù)阶祭,就重新模擬登陸獲取新的cookies并返回(個人想法,測試可行)
URL入口+xpath定位
URL:http://weibo.com/login.php
** selenium+chrome**
這里如果沒有安裝相關(guān)的包岛蚤,可以自行百度解決環(huán)境問題番川,主程序主要使用selenium相關(guān)的函數(shù)去模擬點(diǎn)擊和輸入事件到涂,最后獲取登錄后的cookies脊框,廢話不多說,直接上代碼供大家參考践啄。
模擬登錄Demo
import time
from selenium import webdriver
class COOKIE(object):
url = 'http://weibo.com/login.php'
def __init__(self):
self.browser = webdriver.Chrome()
def getcookie(self):
self.browser.get(self.url)
self.browser.implicitly_wait(15)
self.browser.find_element_by_xpath('//*[@id="loginname"]').clear()
self.browser.find_element_by_xpath('//*[@id="loginname"]').send_keys('你的用戶名')
self.browser.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input').clear()
time.sleep(1)
self.browser.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input').send_keys('密碼')
time.sleep(1)
self.browser.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a').click()
cookie_dic={}
cookies = self.browser.get_cookies()
self.browser.close()
for cookie in cookies:
if cookie.has_key('name') and cookie.has_key('value'):
cookie_dic[cookie['name'].encode('utf-8')]=cookie['value'].encode('utf-8')
return cookie_dic
遇到的問題
- 1.為什么沒使用無界面的phantomjs浇雹,測試的時候使用的是chrome。并且成功返回了cookies屿讽,之后更換phantomjs后昭灵,出現(xiàn)找不到填充的位置的問題,之前以為是請求頭等問題伐谈,添加之后仍然不可行烂完,所以暫時采用chrome。
- 2.程序中間加了強(qiáng)制等待诵棵,這是因?yàn)榭衮迹绻患舆@個的話可能出現(xiàn)登錄不成功的情況(可能于網(wǎng)速有關(guān)系吧),所以最好還是加上履澳,時間自行調(diào)整嘶窄。
selenium使用案例
想對selenium進(jìn)一步了解的可以自行查相關(guān)的資料,然后就是在模擬登錄的時候要找到正確URL入口和賬戶和密碼的輸入框的位置奇昙,這里給一個58同城登錄的示例作為參考护侮。
很顯然我們用工具去抓的時候敌完,給我的位置是第一個密碼框的位置储耐,但是這個位置是填充不進(jìn)去值的,接著看下邊同樣也是密碼輸入框滨溉,但是display:none(隱藏了)什湘,然后我就想如果定位到這個位置能否成功填充密碼,經(jīng)測試果然可以晦攒,我們可以更改這個網(wǎng)頁元素屬性來看一下有怎樣的變化闽撤。
我們可以看到我講display的none屬性去掉后,主頁面多了一個密碼框脯颜,所以這個才是真正的密碼填充框哟旗,只不過一開始隱藏了。
總結(jié)
selenium模擬登錄這塊還是要找到正確的URL入口和正確的輸入框位置栋操,解決了這些差不多就可以完成模擬登錄一個網(wǎng)站闸餐。