python学习笔记之爬虫 -2-拉取github工程列表

需求

在命令行登录github,获取其账号下的仓库列表和相关信息

分析

就这个爬虫来看,其编码过程应该是这样的,第一步是分析网页,因为这里涉及到登录的问题,所以需要去登录页面查看其登录操作都发送了那些数据,使用什么来认证你的登录行为,然后利用代码模拟这种行为,就可以保持登录状态,然后在访问个人仓库的页面,分析其返回的网页内容,提取信息即可
观察github登录页面数据
python学习笔记之爬虫 -2-拉取github工程列表可以看到登录页面发送的数据除了用户名密码等还包含这样一个token,这个token显然不是自己有的,应该是github在其那面的操作中返回的,回退到login页面观察其response
python学习笔记之爬虫 -2-拉取github工程列表可以看到在你访问login页面的时候其返回的reponse中是包含了这个键值对的,因此我们可以先访问login页面,根据其返回的数据提取这个token,然后携带着这个token,以及上面的formdata,发送至session页面,保存期返回的cookies,每次访问时附加这个cookies,这样就能保持我们 的登录状态,即访问私人的页面不会受到登录的阻碍了。当然,最好是每一次访问的返回的cookies都更新到cookies中,再次发送时携带在发送中,模拟一个连续的网络行为

代码

import requests
from bs4 import BeautifulSoup
from bs4.element import Tag
#获取login页面的返回值,保存期cookies
log_in_ret = requests.get(url="https://github.com/login")
cookie1 = log_in_ret.cookies
#对象化其返回文本,分析得到token标签对象
login_code = BeautifulSoup(log_in_ret.text, features='html.parser')
token=login_code.find(name="input", attrs={'name' : "authenticity_token"})
print(token)
#post发送的字典
log_in_dict={
    'commit': 'Sign in',
    'utf8': '✓',
    'authenticity_token': token.get('value'),
    'login': 'xxxxx',
    'password': 'sssssss'
}
#想session页面发送登录数据,并将返回的cookies更新至最初的cookies
session = requests.post(url='https://github.com/session',data=log_in_dict,cookies=cookie1)
cookie1.update(session.cookies)
#获取个人仓库的页面,分析其返回值并打印
resps = requests.get(url='https://github.com/settings/repositories',cookies=cookie1)
soup = BeautifulSoup(resps.text, features='html.parser')
respList = soup.find(name='div', class_= 'listgroup js-collaborated-repos mb-4').children
for i in respList:
    if isinstance(i, Tag):
        a = i.find('a')
        print(a.text)