教程引言:
系统地讲解计算机基础知识,Python的基础知识, 高级知识。关注微信公众号[薯条编程],领取PDF电子书:《Python零基础入门指南》。
7.4.1 github简介
对github最好的了解方式就是打开其官网。现在打开浏览器,并在地址栏中输入github的官网地址:
首页有关于github的这样一句介绍:
"Millions of developers and companies build, ship, and maintain their software on GitHub—the largest and most advanced development platform in the world.software"
大意是说,github是全世界范围内的开发者和企业用来构建和维护软件项目的平台。github本身并不提供软件项目的构建和维护,它更多的是一个代码托管平台,开发者和企业将代码以公有或私有的形式发布在github。
github是广为程序员所知的开源软件托管平台,你所了解到的软件开源项目,几乎都可以在github中找到其源代码。在本节的爬虫实战中,即以github为例,来教同学们实现爬虫的站点登录。
7.4.2 准备工作
既然是模拟登录,那么需要先在 github中注册一个账号。以下是github的注册页地址:
注册成功以后,进入github的登录页:
进入登录页以后,在chrome浏览器中按下键盘的F12进入开发者模式:
7.4.3 分析登录请求参数
模拟登录的第一步是找到登录请求的请求参数。在登录页面中输入账号和密码,随后点击Sign in按钮登录,登录以后点击chrome调试面板中的xhr按钮:
经过观察和分析,XHR中并没有我们需要的登录请求接口。站点向服务器所发起的请求,无非就是异步和同步,既然没有找到发起登录的异步请求,那么继续点击面板中的Doc按钮:
在Doc面板中可以找到login请求,点击login后发现该请求并没有传递登录请求参数:
这种情况必定是站点在发起login请求以后,又发起了其它的请求。现在继续点击session请求:
在session请求中找到了发起登录的请求参数,其中login用来传递登录账号,password用来传递登录密码,authenticity_token用来传递防止CSRF攻击的校验token。学过django框架的同学应该非常清楚,校验token通常被嵌入在HTML源码的隐藏域中。现在退出站点,重新进入登录页面,然后点击chrome调试面板中的Elements菜单,可在页面的源码窗口中搜索到authenticity_token:
7.4.4 模拟github登录
先来梳理github站点登录的请求过程,用户访问登录页面时,站点服务器会render一个校验token到登录页面的隐藏域中,然后前端提取用户在登录页面的输入并解析出校验token,再向站点服务器发起一个session请求,最终实现了登录。
对于校验token的解析,可在发起login请求以后,在响应的登录页面中通过本章所介绍的正则表达式或lxml,BeautifulSoup来进行解析。
代码实例:
# __author__ = 薯条老师 from bs4 import BeautifulSoup import requests if __name__ =='__main__': username = "你的github账号" password = "你的github密码" login_url = 'https://github.com/login' session_url = 'https://github.com/session' settings_profile_url = "https://github.com/settings/profile" # 构建一个请求会话 with requests.session() as session: session.headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36' } # 首先发起登录请求,获取站点响应的登录页面 login_html = session.get(login_url).content.decode() # 通过BeautifulSoup解析登录页面的authenticity_token bs = BeautifulSoup(login_html, features="html.parser") input_label = bs.find(attrs={"name": "authenticity_token"}) authenticity_token = input_label.attrs["value"] # 构建登录接口的请求参数 data = { "commit": "Sign in", "authenticity_token": authenticity_token, "login": username, "password": password, "webauthn-support": "supported" } session.post(session_url, data=data) settings_html = session.get(settings_profile_url).content.decode() bs = BeautifulSoup(settings_html, features="html.parser") print(bs.title.string) # 如果输出的为Your Profile, 则说明模拟登录成功
关注微信公众号:薯条编程,免费领取10本Python电子书。Python弟子班就业培训,学期半年,月薪8000以上,火热报名中,点击了解线下就业培训。