一、获取一个有登录信息的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拿到页面源码。