天天看点

requests模块进行人人网模拟登陆

今天代码是对对人人网进行模拟登录

  • 点击登录按钮之后会发起一个POST请求
  • POST请求中会携带登陆之前录入的登陆信息(用户名,密码,验证码。。。)
  • 验证码特性:每次都会动态变化
  • print(response.status_code),查看相应状态码,如果是200,说明模拟登陆成功
  • 如果出错一定是url和携带的参数出错

第二点问题就是当我们直接访问用户个人中心时会发现访问后页面是登陆页面,而不能直接访问到个人主页页面数据,原因如下:

- 发起的第二次基于个人主页页面请求的时候,服务器端并不知道该请求是基于登录状态下的请求。

这时候就要用到Cookie。

  • cookie:本质作用就是用来让服务器端记录客户端的相关状态。
    • 手动处理:通过抓包工具获取其值,并封装到headers中。(通用性不强)
    • 自动处理:
      • Cookie值的来源是哪里?
        • 模拟登陆POST请求后,由服务器端创建的。
      • session会话对象:
        • 作用:1.可以进行请求的发送。

          2.如果请求过程中产生了Cookie,则该Cookie会被自动存储/携带在该session对象中。

cookie操作方法:

1.创建一个session对象:session = requests.Session()

2.使用session对象进行模拟登录POST请求的发送(cookie会被存储在session中)

3.session对象对个人主页对应的get请求进行发送(携带了cookie)

上代码

import  requests
from lxml import etree
from hashlib import md5
#超级鹰示例代码
class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf-8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()
#创建Session对象
session = requests.Session()
#获取数据
headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36'
    }
url = 'http://www.renren.com/SysHome.do'
page_text = requests.get(url=url,headers=headers).text
#实例化解析数据,获取相应的验证码图片
tree = etree.HTML(page_text)
code_img_src = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
code_img_data= requests.get(url=code_img_src,headers=headers).content
with open('./codedata.jpg','wb') as fp:
    fp.write(code_img_data)
#使用超级鹰的示例代码对验证码进行识别
if __name__ == '__main__':
	chaojiying = Chaojiying_Client('a1372431588', '970110yy', '905384')	#用户中心>>软件ID 生成一个替换 96001
	im = open('codedata.jpg', 'rb').read()													#本地图片文件路径 来替换 a.jpg
	a =chaojiying.PostPic(im, 1902)
	print(a)
#post请求的发送(模拟登陆)
login_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20204110256'
data = {
    'email': '18234504765',
    'icode': a,
    'origURL':'http://www.renren.com/home',
    'domain': 'renren.com',
    'key_id': '1',
    'captcha_type': 'web_login',
    'password': '97ea2d9e82a391b42e834975b7a8d552db313437c3646e6b473fe5ab845e858e',
    'rkey': '3f674e5c4940658971a514b5bdb19571',
    'f': 'http%3A%2F%2Fwww.renren.com%2F974497470',
}
#利用下述可以查看响应状态码,如果是200,说明模拟登陆成功,查看状态码是一种通用方式
#使用session进行post请求的发送
response =session.post(url=login_url,headers=headers,data=data)
print(response.status_code)
#爬取当前用户个人主页对应的页面数据
detail_url = 'http://www.renren.com/974497470/profile'
detail_page_text = session.get(url=detail_url,headers=headers).text
with open('yonghu.html','w',encoding='utf-8')  as fp:
    fp.write(detail_page_text)
           

代码中都有详细注释。

运行结果状态码为200,模拟登陆成功。