爬虫阶段二实战练习题一:模拟登录github获取个人信息
-
-
- [练习一:模拟登录 GitHub 并获取个人信息](#练习一:模拟登录 GitHub 并获取个人信息)
- 总结:你的解题思路复盘
-
练习一:模拟登录 GitHub 并获取个人信息
要求:
- 模拟登录 GitHub(https://github.com/login)
- 登录成功后访问个人主页(如
https://github.com/你的用户名) - 提取昵称、仓库数、粉丝数
分析登录流程:
- 打开 GitHub 登录页,查看源代码,找到登录表单。
- 使用浏览器开发者工具(F12)的 Network 面板,勾选"Preserve log",然后手动登录一次,观察登录请求。
- 找到 POST 请求的 URL(通常是
/session),查看请求头、表单数据。 - 注意 GitHub 登录需要
authenticity_token(CSRF token),该值隐藏在前一个页面的 HTML 中。 - 登录成功后,服务器返回的 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),而是通过浏览器的"检查"功能(开发者工具)监听 到的、当你点击"登录"按钮那一刻,浏览器真正向服务器提交数据的那个网络请求地址。
操作步骤(正是你刚才做的那样):
- 打开开发者工具 :在登录页面按
F12或右键 -> "检查"。 - 准备好监听 :切换到
Network(网络)选项卡,并勾选Preserve log(保留日志)。这一步很重要,因为它能防止页面跳转时清空你刚刚捕获的请求记录。 - 执行登录并捕获:在页面上输入你的账号密码,然后点击"Sign in"按钮。
- 寻找关键请求 :在
Network面板里出现的众多请求中,你需要找到一个请求方法为POST的条目。对于 GitHub 来说,这个关键的提交地址就是https://github.com/session。
简单来说,登录页的 URL(你看到的)不等于 登录请求的 URL(代码里用的)。你需要通过开发者工具找到这个真正的"后台接口"。
2. 我怎么看到登录的请求方法以及请求参数?
同样是在刚才那个 Network 面板里找到的 session 请求里查看。
- 找到请求 :点击刚才定位到的名为
session的POST请求。 - 查看
Headers(请求头) :- 这里你会看到
Request Method: POST,这就确认了登录动作是用POST方法提交的。 - 向下滚动,你还会看到
Request Headers,里面有User-Agent、Referer等重要信息。这就是你在代码里构建headers字典的依据。
- 这里你会看到
- 查看
Payload或Form Data(请求参数) :- 点击
Payload或Params标签,这里记录的就是你代码里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) |
所以,你不仅代码写对了,更关键的是,你已经掌握了爬虫分析中最重要的一环------通过浏览器开发者工具去"观察"和"模仿"浏览器的一举一动。恭喜你!