一、获取一个有登录信息的Cookie模拟登陆

下面以人人网为例,首先使用自己的账号和密码在浏览器登录,然后通过抓包拿到cookie,再将cookie放到请求之中发送请求即可,具体代码如下:

  1. # -*- coding: utf-8 -*-
  2.  
  3. import urllib2
  4. # 构建一个已经登录过的用户的headers信息
  5. headers = {
  6. "Host":"www.renren.com",
  7. "Connection":"keep-alive",
  8. "Upgrade-Insecure-Requests":"1",
  9. "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",
  10. "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
  11. "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6",
  12. # 添加抓包获取的cookie,这个Cookie是保存了密码无需重复登录的用户的Cookie,里面记录了用户名及密码等登录信息(我这里只显示一部分)
  13. "Cookie": "anonymid=j5xitrrwqgbk8; _r01_=1; loginfrom=syshome; wp_fold=0; _de=BF09EE3FED92E6B65F6A4705D973F1383380866D39FF5;
  14. }
  15. # 通过headers里的报头信息(主要是Cookie信息),构建Request对象
  16. request = urllib2.Request("http://www.renren.com/", headers = headers)
  17. # 直接访问renren主页,服务器会根据headers报头信息(主要是Cookie信息),判断这是一个已经登录的用户,并返回相应的页面
  18. response = urllib2.urlopen(request)
  19. # 打印响应内容
  20. print response.read()

这样就可以访问登录后才会呈现的页面。

 

二、使用cookielib库 和 HTTPCookieProcessor处理器

上面的方式固然可行,但是却过于麻烦,我们先需要在浏览器登录账户,并且设置保存密码,并且通过抓包才能获取这个Cookie。下面我们将简化一下,代码如下:

  1. # -*- coding: utf-8 -*-
  2.  
  3. import urllib
  4. import urllib2
  5. import cookielib
  6. # 构建一个CookieJar对象实例来保存cookie
  7. cookie = cookielib.CookieJar()
  8. # 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
  9. cookie_handler = urllib2.HTTPCookieProcessor(cookie)
  10. # 通过 build_opener() 来构建opener
  11. opener = urllib2.build_opener(cookie_handler)
  12. # addheaders 接受一个列表,里面每个元素都是一个headers信息的元祖, opener将附带headers信息
  13. 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")]
  14. # 需要登录的账户和密码
  15. data = {"email":"账户", "password":"密码"}
  16. # 通过urlencode()转码
  17. postdata = urllib.urlencode(data)
  18. # 构建Request请求对象,包含需要发送的用户名和密码
  19. request = urllib2.Request("http://www.renren.com/PLogin.do", data = postdata)
  20. # 通过opener发送这个请求,并获取登录后的Cookie值,
  21. opener.open(request)
  22. # opener包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
  23. response = opener.open("http://www.renren.com/410049765/profile")
  24. # 打印响应内容
  25. print response.read()
  1. 这里可以使用requests简化代码,具体如下:
  1. import requests
  2. # 创建session对象,可以保存Cookie值
  3. ssion = requests.session()
  4. # 处理 headers
  5. 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"}
  6. # 3需要登录的用户名和密码
  7. data = {"email":"账户", "password":"密码"}
  8. # 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
  9. ssion.post("http://www.renren.com/PLogin.do", data = data)
  10. # ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
  11. response = ssion.get("http://www.renren.com/410049765/profile")
  12. # 打印响应内容
  13. print response.text

  1. 注:这里使用的是人人网的老版接口http://www.renren.com/PLogin.do如果使用的是http://www.renren.com/这个接口登录将会失败,因为新的接口需要的不仅仅是账户和密码,还要有一些
    动态生成的数据需要一起传送过去,这个也可以通过先抓包获取再和账户密码一起发生。

    这种方式模拟登录需要注意的问题:
    1、登录一般都会先有一个HTTP GET,用于拉取一些信息及获得Cookie,然后再HTTP POST登录。
    2HTTP POST登录的链接有可能是动态的,从GET返回的信息中获取。
    3password 有些是明文发送,有些是加密后发送。有些网站甚至采用动态加密的,同时包括了很多其他数据的加密信息,只能通过查看JS源码获得加密算法,再去破解加密,非常困难。
    4、大多数网站的登录整体流程是类似的,可能有些细节不一样,所以不能保证其他网站登录成功


    三、使用SeleniumPhantomJS模拟登录
    这种登录方式和在浏览器登录一样,代码如下:
  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from selenium.webdriver.common.keys import Keys
  4. import time
  5. driver = webdriver.PhantomJS()
  6. driver.get("http://www.renren.com/")
  7. # 输入账号密码
  8. driver.find_element_by_name("email").send_keys("账户")
  9. driver.find_element_by_name("password").send_keys("密码")
  10. # 模拟点击登录
  11. driver.find_element_by_xpath("//input[@class=\'input-submit login-btn\']").click()
  12. # 等待3秒
  13. time.sleep(3)
  14. # 生成登陆后快照
  15. driver.save_screenshot("renren.png")

运行程序后就可以得到登录后页面的截图了,也可以使用driver.page_source拿到页面源码。

版权声明:本文为xinyangsdut原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xinyangsdut/p/7627047.html