Python实战案例,requests模块,Python模拟登陆GitHub并获取信息

这里先对GitHub进行模拟登陆,了解会话及Cookies相关知识。


/ 01 / 网页分析


首先看一下登录页,获取authenticity_token参数值,是一个隐藏式表单元素。


Python实战案例,requests模块,Python模拟登陆GitHub并获取信息的图1

查看登录页的Response Headers,这里的Set-Cookie字段,是设置Cookies的过程。这边呢我的理解是,当你在session那个网页填写账号和密码后,这里就会自动生成一个Cookies返回(其实我也很晕...)。


Python实战案例,requests模块,Python模拟登陆GitHub并获取信息的图2


将Preserve Log打开(表示显示持续日志),然后输入账号及密码,找到session这个请求。最后得知请求的网址及请求方式(POST)。


Python实战案例,requests模块,Python模拟登陆GitHub并获取信息的图3


这里是session的请求头和表单信息,能看到生成的Cookies信息。


Python实战案例,requests模块,Python模拟登陆GitHub并获取信息的图4

获取用户动态及个人信息的网页就不说了,简单操作。


需要提的一点就是用户动态的网页是Ajax请求,崔大的代码过时了呀...

Python腾讯大牛直播预约:

Python实战案例,requests模块,Python模拟登陆GitHub并获取信息的图5


/ 02 / 数据获取


实现代码如下所示。


from lxml import etree
import requests


class Login(object):
    # Login类继承object对象,高级特性
    def __init__(self):
        # 特殊的方法,类的构造函数或初始化方法,当创建了Login类的实例时就会调用该方法
        # self代表类的实例,self在定义类的方法时是必须有的
        self.headers = {
            'Referer''https: // github.com /',
            'User-Agent''Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
            'Host''github.com'
        }
        self.login_url = 'https://github.com/login'
        # 这里因为崔大的代码不行了,自己去找用户动态信息的真正请求,又是Ajax
        self.get_users_url = 'https://github.com/dashboard-feed'
        self.post_url = 'https://github.com/session'
        self.logined_url = 'https://github.com/settings/profile'
        # 创建一个session对象
        self.session = requests.Session()

    # 类的方法与普通的函数只有一个特别的区别, 它们必须有一个额外的第一个参数名称, 按照惯例它的名称是self
    # self不是python关键字,我们把它换成cool也是可以正常执行的
    def token(self):
        # 获取authenticity_token参数值
        response = self.session.get(self.login_url, headers=self.headers)
        result = etree.HTML(response.text)
        token = result.xpath('//div//input[2]/@value')[0]
        return token

    def login(self, email, password):
        # 模拟登陆GitHub,POST请求
        post_data = {
            'commit''Sign in',
            'utf8''✓',
            'authenticity_token': self.token(),
            'login': email,
            'password': password
        }
        response = self.session.post(self.post_url, data=post_data, headers=self.headers)
        # 获取我所关注的人的动态
        if response.status_code == 200:
            response = self.session.get(self.get_users_url, headers=self.headers)
            self.dynamics(response.text)
        # 获取我的个人信息
        response = self.session.get(self.logined_url, headers=self.headers)
        if response.status_code == 200:
            self.profile(response.text)

    def dynamics(self, html):
        # 获取我所关注的人的动态
        result = etree.HTML(html)
        dynamics = result.xpath('//div[@class="d-flex flex-items-baseline"]/div')
        for item in dynamics:
            # 这里我是直接获取标签所有文字,然后去除换行及空格
            print(item.xpath('string(.)').strip().replace('\n''').replace('                          ''   ').replace('            ''   ').replace('      ''   ').replace('     ''   '))

    def profile(self, html):
        # 获取我的个人信息
        result = etree.HTML(html)
        name = result.xpath('//input[@name="user[profile_name]"]/@value')[0]
        email = result.xpath('//select[@name="user[profile_email]"]/option[@selected="selected"]/text()')
        print(name, email)


if __name__ == '__main__':
    # 类的实例化类似函数调用方式
    login = Login()
    # 使用点号 . 来访问对象的属性
    login.login(email='你的账号', password='你的密码')


最后成功登陆,获取动态及个人信息。


Python实战案例,requests模块,Python模拟登陆GitHub并获取信息的图6

默认 最新
当前暂无评论,小编等你评论哦!
点赞 2 评论 收藏 1
关注