爬虫阶段二实战练习题一:模拟登录github获取个人信息复盘

爬虫阶段二实战练习题一:模拟登录github获取个人信息

      • [练习一:模拟登录 GitHub 并获取个人信息](#练习一:模拟登录 GitHub 并获取个人信息)
        • 要求:
        • 分析登录流程:
        • 调试后的代码:
        • 思路分析
          • [1. 我怎么查到登录页的url?](#1. 我怎么查到登录页的url?)
          • [2. 我怎么看到登录的请求方法以及请求参数?](#2. 我怎么看到登录的请求方法以及请求参数?)
          • [3. 代码 `response = session.post(post_url, data=login_data, headers=headers)` 的理解](#3. 代码 response = session.post(post_url, data=login_data, headers=headers) 的理解)
      • 总结:你的解题思路复盘

练习一:模拟登录 GitHub 并获取个人信息

要求:
  • 模拟登录 GitHub(https://github.com/login)
  • 登录成功后访问个人主页(如 https://github.com/你的用户名
  • 提取昵称、仓库数、粉丝数
分析登录流程:
  1. 打开 GitHub 登录页,查看源代码,找到登录表单。
  2. 使用浏览器开发者工具(F12)的 Network 面板,勾选"Preserve log",然后手动登录一次,观察登录请求。
  3. 找到 POST 请求的 URL(通常是 /session),查看请求头、表单数据。
  4. 注意 GitHub 登录需要 authenticity_token(CSRF token),该值隐藏在前一个页面的 HTML 中。
  5. 登录成功后,服务器返回的 Cookie 会自动保存,后续请求携带即可。
调试后的代码:
python 复制代码
import requests
from bs4 import BeautifulSoup

# 创建 Session
session = requests.Session()

# 1. 访问登录页获取 authenticity_token
login_url = 'https://github.com/login'
response = session.get(login_url)
soup = BeautifulSoup(response.text, 'lxml')
token = soup.find('input', {'name': 'authenticity_token'}).get('value')




# 2. 构造登录数据
login_data = {
    'commit': 'Sign in',
    'authenticity_token': token,
    'login': 'admin',
    'password': '123456',
    'webauthn-support': 'supported'
}


# 3. 发送登录 POST 请求
post_url = 'https://github.com/session'
headers = {
    'User-Agent': 'Mozilla/5.0',
    'Referer': 'https://github.com/login'
}
response = session.post(post_url, data=login_data, headers=headers)

# 检查是否登录成功(判断是否有用户名元素)
profile_url = 'https://github.com/admin'
profile_resp = session.get(profile_url)
if 'admin' in profile_resp.text:
    print('登录成功')
    # 提取昵称、仓库数等
    soup2 = BeautifulSoup(profile_resp.text, 'lxml')
    # print(soup2)
    name = soup2.find('span', class_='p-nickname').text.strip()
    repos = soup2.find('span', class_='prc-CounterLabel-CounterLabel-X-kRU').text.strip()
    print(f'昵称:{name},仓库数:{repos}')
else:
    print('登录失败')

里面的账号密码替换成自己的就行,login和password

思路分析

下面我结合你的问题,把这个"解题思路"彻底拆解清楚。

1. 我怎么查到登录页的url?

你的直觉是对的,这个 URL 并非凭空猜测,也不是从浏览器地址栏直接拷贝的登录页面地址(https://github.com/login),而是通过浏览器的"检查"功能(开发者工具)监听 到的、当你点击"登录"按钮那一刻,浏览器真正向服务器提交数据的那个网络请求地址。

操作步骤(正是你刚才做的那样):

  1. 打开开发者工具 :在登录页面按 F12 或右键 -> "检查"。
  2. 准备好监听 :切换到 Network(网络)选项卡,并勾选 Preserve log(保留日志)。这一步很重要,因为它能防止页面跳转时清空你刚刚捕获的请求记录。
  3. 执行登录并捕获:在页面上输入你的账号密码,然后点击"Sign in"按钮。
  4. 寻找关键请求 :在 Network 面板里出现的众多请求中,你需要找到一个请求方法为 POST 的条目。对于 GitHub 来说,这个关键的提交地址就是 https://github.com/session

简单来说,登录页的 URL(你看到的)不等于 登录请求的 URL(代码里用的)。你需要通过开发者工具找到这个真正的"后台接口"。

2. 我怎么看到登录的请求方法以及请求参数?

同样是在刚才那个 Network 面板里找到的 session 请求里查看。

  1. 找到请求 :点击刚才定位到的名为 sessionPOST 请求。
  2. 查看 Headers(请求头)
    • 这里你会看到 Request Method: POST,这就确认了登录动作是用 POST 方法提交的。
    • 向下滚动,你还会看到 Request Headers,里面有 User-AgentReferer 等重要信息。这就是你在代码里构建 headers 字典的依据。
  3. 查看 PayloadForm Data(请求参数)
    • 点击 PayloadParams 标签,这里记录的就是你代码里 login_data 字典的来源。
    • 你会发现,除了你填写的 login(用户名)和 password(密码)外,还有一个叫 authenticity_token 的隐藏参数。
    • 这个 authenticity_token 是怎么来的? 它是服务器在登录页面里埋下的一个"暗号",用于防止恶意网站伪造表单提交。所以,你的代码必须先 GET 一下登录页面 https://github.com/login,然后从返回的 HTML 里把这个 token 的值提取出来,再拼接到 login_data 里一起提交。
3. 代码 response = session.post(post_url, data=login_data, headers=headers) 的理解
  • session.post 是模拟登录动作吗?
    是的,完全正确。 这一行代码,就是你的爬虫程序在精确地模仿你刚才在浏览器里的那个点击"Sign in"按钮的动作。它将你组织好的用户名、密码和那个暗号(authenticity_token)打包,发送到了真正的登录接口(post_url)。

  • session 就可以抓取其他页面的数据了吗?
    完全正确,这正是 requests.Session 的核心妙用!

    HTTP 协议本身是"无状态"的,这意味着服务器处理完你的一次请求后,就会把你忘记。而 Session 对象就像一个聪明的助理,它会在背后自动帮你处理Cookie 。当登录成功时,服务器会在响应中设置一个包含你身份信息的 Set-Cookie 头,Session 对象会自动捕获这个 Cookie,并在之后你通过它发起的任何请求中,自动地、默默地带上去。

    所以,当你写完 session.post 并成功后,这个 session 对象就已经是"已登录状态 "了。接下来,你只需要继续用这个 session 对象去 get 你想要访问的个人信息页面或其他任何需要登录才能看到的页面,服务器通过解析 session 自动携带的 Cookie,就会认出你的身份,并返回正确的数据给你。

总结:你的解题思路复盘

你的思考逻辑是完全正确的,整个过程可以总结为:

步骤 你的角色 做了什么 对应到代码
1. 侦查 数据分析师 打开浏览器开发者工具,监听网络请求,找到真实的登录提交地址 (/session) 和所需的参数 (authenticity_token)。 无(手动操作)
2. 模拟 自动化脚本 先用 session.get 访问登录页,获取 authenticity_token session.get(login_url)
3. 提交 模拟登录者 session.post 带上用户名、密码、token,向真实地址发起登录请求。 session.post(post_url, data=login_data, ...)
4. 保持 已登录用户 session 对象自动保存了服务器下发的身份Cookie。 session 对象内部自动完成
5. 获取 数据消费者 直接用同一个 session.get 去访问个人信息页,获取数据。 session.get(profile_url)

所以,你不仅代码写对了,更关键的是,你已经掌握了爬虫分析中最重要的一环------通过浏览器开发者工具去"观察"和"模仿"浏览器的一举一动。恭喜你!

相关推荐
YMWM_2 小时前
linux命令行测试是否可以访问google、github、huggingface
linux·运维·github
WangJunXiang62 小时前
系统安全及应用
安全·github·系统安全
zhensherlock2 小时前
Protocol Launcher 系列:一键唤起 VSCodium 智能 IDE
javascript·ide·vscode·typescript·开源·编辑器·github
AAA小肥杨2 小时前
OpenClaw 和 GitHub 自动化,用于 PR 审核和 CI 监控
人工智能·ci/cd·自动化·大模型·github·openclaw
喵手3 小时前
Python 爬虫实战:利用 Playwright 攻克 Canva 动态设计模板库
爬虫·python·爬虫实战·playwright·canva·零基础python爬虫教学·搭建动态设计模版库
白白白飘3 小时前
GitHub上运行开源项目(小白友好版)
开源·github
李同学Lino3 小时前
拒绝 500 元智商税!AutoClaw 零门槛安装教程,手把手教你低成本“喂龙虾”
人工智能·ai·github·openclaw·autoclaw
iFeng的小屋3 小时前
【2026最新携程酒店爬虫分享】用Python批量爬取酒店评论,含回复内容一键保存Excel!
开发语言·爬虫·python
AI精钢3 小时前
OpenClaw + GitHub Copilot GPT-5.4 技术修复指南
gpt·github·copilot·github copilot·ai agent·openclaw·gpt-5.4