1.selenium登錄網站
1)selenium訪問起始網址后一定要等待登錄框完全渲染出現,無頁面的瀏覽器可以打印出page_source出來看是否登錄框已出現
2)登錄框已出現的情況下,如果給用戶名輸入框輸入值,發現報錯,說找不到此節點,則看下是否在iframe中,在的話,需要switch_to.frame進入
3)用戶名和密碼輸入間隔要像人輸入的時間差不多,過快可能會被發現是模擬點擊登陸
4)有的網站在登陸按鈕上設置障礙,可能會發現是非人操作,這時可以用enter操作代替,跳過點擊登錄這一步,完美避開
5)登錄后(判斷是否是登錄了,可以打印當前的current_url,看是否是登陸后的url)獲取cookies(這時要注意如果登錄在iframe,需要返回主頁面)賦值到requests
6)這時用requests去請求網站登錄后頁面,即可正常響應,不會跳到登錄頁
sites = []
s = requests.Session()
start_url = 'https://passport.umeng.com/login?appId=cnzz'
try:
print '登錄友盟'
driver.delete_all_cookies()
driver.get(start_url)
# print driver.current_url ,driver.page_source
driver.switch_to.frame("alibaba-login-box") #進入登錄iframe
time.sleep(10)
elem_user = driver.find_element_by_id("fm-login-id")
time.sleep(10)
elem_user.send_keys("用戶名");
elem_pwd = driver.find_element_by_id('fm-login-password')
time.sleep(10)
elem_pwd.send_keys("密碼")
time.sleep(10)
elem_pwd.send_keys(Keys.ENTER) #網站模擬點擊登錄按鈕會出錯,直接在密碼輸完后enter進行登錄即可
time.sleep(10)
if driver.current_url != start_url:
print '登陸成功',driver.current_url
driver.switch_to_default_content()#需要返回主頁面,不然獲取的cookies不是登陸后cookies
list_cookies = driver.get_cookies()
cookies = {}
for s in list_cookies:
cookies[s['name']] = s['value']
requests.utils.add_dict_to_cookiejar(s.cookies, cookies) #將獲取的cookies帶入請求中
print 'cookies:',cookies,self.config.url_list
url_list = 'ttps://web.umeng.com/main.php?c=site&a=show&ajax=module=list|module=isOpenTongji&search=¤tPage=1&pageType=30&sort=0' #url_list是登陸后才能請求到數據的api
r = json.loads(s.get(url_list).content)
for temp in r['data']['list']['items']:
if isinstance(temp,dict):
sites.append({"siteid":temp["siteid"],"name":temp["name"]})
except:
print '登陸失敗'
traceback.print_exc()
finally:
driver.quit()
display.stop()