Python爬虫实例(四)网站模拟登陆
一、获取一个有登录信息的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拿到页面源码。