Python爬虫教程

第一章: 初学乍练-Python快速入门

第二章: 初窥门径-从全局把握网络爬虫

第三章: 爬虫数据-网页与JSON

第四章: 爬虫核心-HTTP协议

第五章: 手到擒来-数据的抓包

第六章: 利刃出鞘-HTTP请求库

第七章: 尘埃落定-数据的解析

第八章: 逆向初探-JS逆向

第九章: 爬虫进阶-Selenium, 中间人拦截

第十章:斗转星移-常用的反爬策略及应对方法

首页 > Python爬虫教程 > 第七章: 尘埃落定-数据的解析 > 7.4节:爬虫实战-模拟github登录

7.4节:爬虫实战-模拟github登录

薯条老师 2021-06-17 08:37:52 233904 0

编辑 收藏

教程引言:

系统地讲解计算机基础知识,Python的基础知识, 高级知识。关注微信公众号[薯条编程],领取PDF电子书:《Python零基础入门指南》。

7.4.1 github简介

对github最好的了解方式就是打开其官网。现在打开浏览器,并在地址栏中输入github的官网地址:

https://github.com/

首页有关于github的这样一句介绍:

图片.png 

"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的注册页地址:

https://github.com/join

注册成功以后,进入github的登录页:

https://github.com/login

进入登录页以后,在chrome浏览器中按下键盘的F12进入开发者模式:

图片.png 

 

7.4.3 分析登录请求参数

模拟登录的第一步是找到登录请求的请求参数。在登录页面中输入账号和密码,随后点击Sign in按钮登录,登录以后点击chrome调试面板中的xhr按钮:

图片.png

经过观察和分析,XHR中并没有我们需要的登录请求接口。站点向服务器所发起的请求,无非就是异步和同步,既然没有找到发起登录的异步请求,那么继续点击面板中的Doc按钮:

图片.png 

在Doc面板中可以找到login请求,点击login后发现该请求并没有传递登录请求参数:

图片.png 

这种情况必定是站点在发起login请求以后,又发起了其它的请求。现在继续点击session请求:

图片.png

在session请求中找到了发起登录的请求参数,其中login用来传递登录账号,password用来传递登录密码,authenticity_token用来传递防止CSRF攻击的校验token。学过django框架的同学应该非常清楚,校验token通常被嵌入在HTML源码的隐藏域中。现在退出站点,重新进入登录页面,然后点击chrome调试面板中的Elements菜单,可在页面的源码窗口中搜索到authenticity_token

 图片.png

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以上,火热报名中,点击了解线下就业培训。



欢迎 发表评论: