zoukankan      html  css  js  c++  java
  • 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拿到页面源码。

  • 相关阅读:
    null in ABAP and nullpointer in Java
    SAP ABAP SM50事务码和Hybris Commerce的线程管理器
    Hybris service layer和SAP CRM WebClient UI架构的横向比较
    SAP ABAP和Linux系统里如何检查网络传输的数据量
    SAP CRM WebClient UI和Hybris的controller是如何被调用的
    SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
    SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
    SAP BSP和JSP页面里UI元素的ID生成逻辑
    微信jsapi支付
    微信jsapi退款操作
  • 原文地址:https://www.cnblogs.com/xinyangsdut/p/7627047.html
Copyright © 2011-2022 走看看