一、獲取一個有登錄信息的Cookie模擬登陸
下面以人人網為例,首先使用自己的賬號和密碼在瀏覽器登錄,然后通過抓包拿到cookie,再將cookie放到請求之中發送請求即可,具體代碼如下:
# -*- coding: utf-8 -*- import urllib2 # 構建一個已經登錄過的用戶的headers信息 headers = { "Host":"www.renren.com", "Connection":"keep-alive", "Upgrade-Insecure-Requests":"1", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6", # 添加抓包獲取的cookie,這個Cookie是保存了密碼無需重復登錄的用戶的Cookie,里面記錄了用戶名及密碼等登錄信息(我這里只顯示一部分) "Cookie": "anonymid=j5xitrrwqgbk8; _r01_=1; loginfrom=syshome; wp_fold=0; _de=BF09EE3FED92E6B65F6A4705D973F1383380866D39FF5; } # 通過headers里的報頭信息(主要是Cookie信息),構建Request對象 request = urllib2.Request("http://www.renren.com/", headers = headers) # 直接訪問renren主頁,服務器會根據headers報頭信息(主要是Cookie信息),判斷這是一個已經登錄的用戶,並返回相應的頁面 response = urllib2.urlopen(request) # 打印響應內容 print response.read()
這樣就可以訪問登錄后才會呈現的頁面。
二、使用cookielib庫 和 HTTPCookieProcessor處理器
上面的方式固然可行,但是卻過於麻煩,我們先需要在瀏覽器登錄賬戶,並且設置保存密碼,並且通過抓包才能獲取這個Cookie。下面我們將簡化一下,代碼如下:
# -*- coding: utf-8 -*- import urllib import urllib2 import cookielib # 構建一個CookieJar對象實例來保存cookie cookie = cookielib.CookieJar() # 使用HTTPCookieProcessor()來創建cookie處理器對象,參數為CookieJar()對象 cookie_handler = urllib2.HTTPCookieProcessor(cookie) # 通過 build_opener() 來構建opener opener = urllib2.build_opener(cookie_handler) # addheaders 接受一個列表,里面每個元素都是一個headers信息的元祖, opener將附帶headers信息 opener.addheaders = [("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36")] # 需要登錄的賬戶和密碼 data = {"email":"賬戶", "password":"密碼"} # 通過urlencode()轉碼 postdata = urllib.urlencode(data) # 構建Request請求對象,包含需要發送的用戶名和密碼 request = urllib2.Request("http://www.renren.com/PLogin.do", data = postdata) # 通過opener發送這個請求,並獲取登錄后的Cookie值, opener.open(request) # opener包含用戶登錄后的Cookie值,可以直接訪問那些登錄后才可以訪問的頁面 response = opener.open("http://www.renren.com/410049765/profile") # 打印響應內容 print response.read()
這里可以使用requests簡化代碼,具體如下:
import requests # 創建session對象,可以保存Cookie值 ssion = requests.session() # 處理 headers headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} # 3需要登錄的用戶名和密碼 data = {"email":"賬戶", "password":"密碼"} # 發送附帶用戶名和密碼的請求,並獲取登錄后的Cookie值,保存在ssion里 ssion.post("http://www.renren.com/PLogin.do", data = data) # ssion包含用戶登錄后的Cookie值,可以直接訪問那些登錄后才可以訪問的頁面 response = ssion.get("http://www.renren.com/410049765/profile") # 打印響應內容 print response.text
注:這里使用的是人人網的老版接口http://www.renren.com/PLogin.do如果使用的是http://www.renren.com/這個接口登錄將會失敗,因為新的接口需要的不僅僅是賬戶和密碼,還要有一些
動態生成的數據需要一起傳送過去,這個也可以通過先抓包獲取再和賬戶密碼一起發生。
這種方式模擬登錄需要注意的問題:
1、登錄一般都會先有一個HTTP GET,用於拉取一些信息及獲得Cookie,然后再HTTP POST登錄。
2、HTTP POST登錄的鏈接有可能是動態的,從GET返回的信息中獲取。
3、password 有些是明文發送,有些是加密后發送。有些網站甚至采用動態加密的,同時包括了很多其他數據的加密信息,只能通過查看JS源碼獲得加密算法,再去破解加密,非常困難。
4、大多數網站的登錄整體流程是類似的,可能有些細節不一樣,所以不能保證其他網站登錄成功
三、使用Selenium和PhantomJS模擬登錄
這種登錄方式和在瀏覽器登錄一樣,代碼如下:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.PhantomJS() driver.get("http://www.renren.com/") # 輸入賬號密碼 driver.find_element_by_name("email").send_keys("賬戶") driver.find_element_by_name("password").send_keys("密碼") # 模擬點擊登錄 driver.find_element_by_xpath("//input[@class='input-submit login-btn']").click() # 等待3秒 time.sleep(3) # 生成登陸后快照 driver.save_screenshot("renren.png")
運行程序后就可以得到登錄后頁面的截圖了,也可以使用driver.page_source拿到頁面源碼。