• 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拿到页面源码。

  • 相关阅读:
    实现一个电话号码生成器
    SQL查询--关于查询的练习题
    SQL查询--内连接、外连接、自连接查询
    SQL查询--约束
    SQL查询--索引
    SQL查询--简单了解SQL(结构化查询语言)
    使用python做一个爬虫GUI程序
    postman(十二):发送携带md5签名、随机数等参数的请求
    对比3种接口测试的工具:jmeter+ant;postman;python的requests+unittest或requests+excel
    (四十八)c#Winform自定义控件-下拉按钮-HZHControls
  • 原文地址:https://www.cnblogs.com/xinyangsdut/p/7627047.html
Copyright © 2020-2023  润新知