GitHub模拟登录

参考书籍:python3网络爬虫开发与实战     作者个人博客https://cuiqingcai.com/

需要的工具:requests库puquery库

概要:打开网页然后模拟登录,实际上是在客户端生成了Cookies,而cookies里面保存了SessionID的信息,登录之后的后续请求都会携带生成后的Cookies发送给服务器。服务器就会根据Cookies判断出对应的SessionID,进而找到会话。

开始:

1、第一张图片是GitHub登录界面,可以看到authenticity_token表单元素,该元素被隐藏起来呢,是一个Base64加密的字符串,因为在Headers里看不到该元素。第二张图片是用账号和密码登录后的,可以看到Form Data的表单信息,其中有authenticity_token表单元素,是一模一样的。该元素在登录账号前就已经产生,每次登录前该元素都会变化。

 

2、写代码,先将authenticity_token表单元素打印出来,能爬取到该元素才能进行后面的账号登录操作。可以看到能打印出该表单元素,为什么与上面的值不一样,因为点击一次GitHub登录界面,该表单元素就会变化一次。 

import requests
from pyquery import PyQuery as pq
#定义一个Login类,初始化一些变量
class Login(object):
    def __init__(self):
        self.headers = {
            'Host': 'github.com',
            'Referer': 'https://github.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
        }
        self.login_url = 'https://github.com/login'       #GitHub登录界面
        self.post_url = 'https://github.com/session'      #GitHub账号密码登录后的界面
        #requests库的Session,它可以帮助我们维持一个会话,而且可以自动处理Cookies
        self.session = requests.Session()
    #获取初始的Cookies和authenticity_token
    def token(self):
        response = self.session.get(self.login_url, headers=self.headers)
        selector = pq(response.text)
        token = selector('input[name="authenticity_token"]').attr('value')
        return token
    #打印出authenticity_token表单信息
    def login(self):
        print(self.token())

if __name__ == '__main__':
    login = Login()
    login.login()

 

3、拿到了重要的表单信息,现在可以实现模拟登录,爬取登录后的信息,并且打印出来。这里注意一下,看一下自己爬取打印出来的是GitHub登录时的源代码,还是登录后的源代码。pyquery库是处理ajax动态加载的解析库,会使用selector选择器。

import requests
from pyquery import PyQuery as pq

#定义一个Login类,初始化一些变量
class Login(object):
    def __init__(self):
        self.headers = {
            'Host': 'github.com',
            'Referer': 'https://github.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
        }
        self.login_url = 'https://github.com/login'         #GitHub登录界面
        self.post_url = 'https://github.com/session'        #GitHub账号密码登录后界面
        #requests库的Session,它可以帮助我们维持一个会话,而且可以自动处理Cookies
        self.session = requests.Session()
    #获取初始的Cookies和authenticity_token
    def token(self):
        response = self.session.get(self.login_url, headers=self.headers)
        selector = pq(response.text)
        token = selector('input[name="authenticity_token"]').attr('value')
        return token

    #构造一个表单,复制各个字段
    def login(self):
        print(self.token())
        post_data = {
            'ga_id': '1487034071.1569382557',
            'commit': 'Sign in',
            'utf8': '✓',
            'authenticity_token': self.token(),
            'login': '写自己的账号',
            'password': '写自己的密码',
            'webauthn-support': 'supported',
            'webauthn-iuvpaa-support': 'unsupported',
            'required_field_cab0': ' '
        }
        #用Session对象的post()方法模拟登录即可,自动处理重定向信息,登录成功直接跳转到首页,首页会显示源代码信息,根据自己需求爬取相对应的数据
        response = self.session.post(self.post_url, data=post_data, headers=self.headers)
        if response.status_code == 200:
            print(response.text)

if __name__ == '__main__':        #运行程序,该代码块被执行
    login = Login()
    login.login()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章