查看原文
其他

用Python模拟登陆GitHub并获取信息

法纳斯特 法纳斯特 2019-03-31
有态度地学习

最近在研究如何对搜狗搜索公众号文章进行爬取,由于需要用到Cookies,所以这回先了解下Cookies的相关知识。


搜狗的反爬有点厉害,即使我用了高匿代理,它还是会提醒我IP访问过于频繁,然后跳转验证码页面。


其实真正的原因不在于IP,而是Cookies,里面的参数如果一直不变的话,他就会封你的Cookies,通俗说就是封你的微信账号。


因为获取Cookies需要用你的微信账号,在短时间内基本上你的Cookies参数不会改变(就是账号退了再登陆也不会变)。


不过方法还是有的,通过其他搜狗搜索网址动态改变(一个账号没办法呀...)。


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



/ 01 / 网页分析


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


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



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



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


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


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



/ 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='你的密码')


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




/ 03 / 总结


搞了半天,其实对会话和Cookies 还是晕晕的...


这里对类的知识做个总结,平常函数用的多一点,类都没怎么接触,需要好好回忆一下。


类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。


类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。


实例变量:定义在方法中的变量,只作用于当前实例的类。


实例化:创建一个类的实例,类的具体对象。


方法:类中定义的函数。


对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。


这回我也用上了GitHub,其实好几月前就注册了,慢慢了解吧,以后源码网盘、GitHub都会放。


文末点个赞,比心!!!



推荐阅读




···  END  ···


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存