python模拟登录

3 篇文章 0 订阅
1 篇文章 0 订阅
本文详细介绍了如何使用Python的requests库和Scrapy框架模拟登录GitHub。首先,讲解了cookies与session的区别,然后通过requests的Session维持会话并构造表单数据进行登录。接着,展示了Scrapy中如何利用FormRequest从响应中获取表单数据并进行登录。最后,通过正则表达式验证登录成功。注意,由于网络问题,GitHub网址可能有时无法访问。
摘要由CSDN通过智能技术生成

一、原理

比较cookies和session的区别:

cookies的数据信息存放在客户端浏览器上,而session的数据信息存放在服务器上。

通过获取session可实现以登录的状态获取用户资料

本次模拟登录对象为:https://github.com/,以开发者模式登录账号获取一个session

在这里插入图片描述
以下为表单数据,需要传入网址
在这里插入图片描述
原理不难,现在可着手开始工作

二、普通requests获取session进行登录

import requests
import re
from lxml import etree

class Login(object):
    def __init__(self):
        self.headers={
            'referer':'https://github.com/',
            'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) '
                         'Chrome/91.0.4472.114 Mobile Safari/537.36',
            'host':'github.com'
        }
        self.login_url='https://github.com/login'#登录地址
        self.post_url='https://github.com/session'#会话地址
        
        self.session=requests.Session()#维持会话
    def token(self):
        resp=self.session.get(self.login_url,headers=self.headers)
        selector=etree.HTML(resp.text)
        token=selector.xpath('//*[@id="login"]/div[4]/form/input[1]/@value')[0]#获取表单数据中authenticity_token参数
        return token
    def login(self,email,password):
        post_data={
            'commit':'Sign in',
            'authenticity_token':self.token(),
            'login':email,
            'password':password
        }#构造表单,传入网址
        resp=self.session.post(self.post_url,data=post_data,headers=self.headers)
        print(re.findall('lx-2021', resp.body.decode()))#正则表达式输出内容
if __name__=='__main__':
    login=Login()
    login.login(email='账号',password='密码')#输入自己的github账号以及密码

三、Scrapy模拟登录

import scrapy
import re
from scrapy import FormRequest

class GtSpider(scrapy.Spider):
    name = 'gt'
    allowed_domains = ['github.com']
    start_urls = ['http://github.com/login']

    '''
    注释内容也可以实现模拟登录,通过FormRequest.from_response
    自动获取action,即跳转页面。
    '''
    # def parse(self, response):
    #     yield FormRequest.from_response(
    #         response,
    #         formdata={'login':'123456789','password':'123456789'},
    #         callback=self.parse_item #回调函数
    #
    #     )
    def parse(self, response):
        authenticity_token=response.xpath('//input[@name="authenticity_token"]/@value').extract_first()
        commit=response.xpath('//input[@name="commit"]/@value').extract_first()
        formdata=dict(
            login='',#账号
            password='',#密码
            authenticity_token= authenticity_token,
            commit=commit
        )
        yield FormRequest(
            'http://github.com/session',
            formdata=formdata,
            callback=self.parse_item
        )

    def parse_item(self,response):
        print(re.findall('lx-2021',response.body.decode()))

通过正则获取到了个人昵称,表示登录成功!

在这里插入图片描述
注意:GitHub网址打开看运气,有时候打得开,有时候打不开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值