文章目录

  • 1.分析登录过程
  • 2.代码实现

1.分析登录过程

我们以github为例,分析登录的过程

打开 GitHub 的登录页面,链接为 https://github.com/login ,输入 GitHub 的用户名和密码,打开开发者工具,将 Preserve Log 选项勾选上,这表示显示持续日志,如下图所示。

点击登录按钮,这时便会看到开发者工具下方显示了各个请求过程,如下图所示。


点击第一个请求,进入其详情页面,如下图所示。

可以看到请求的 URL 为 https://github.com/session ,请求方式为 POST。再往下看,我们观察到它的 Form Data 和 Headers 这两部分内容:

Headers 里面包含了 Cookies、Host、Origin、Referer、User-Agent 等信息。Form Data 包含了 5 个字段,commit 是固定的字符串 Sign in,utf8 是一个勾选字符,authenticity_token 较长,其初步判断是一个 Base64 加密的字符串,login 是登录的用户名,password 是登录的密码。

综上所述,我们现在无法直接构造的内容有 Cookies 和 authenticity_token。下面我们再来探寻一下这两部分内容如何获取。

在登录之前我们会访问到一个登录页面,此页面是通过 GET 形式访问的。输入用户名密码,点击登录按钮,浏览器发送这两部分信息,也就是说 Cookies 和 authenticity_token 一定是在访问登录页的时候设置的。

这时再退出登录,回到登录页,重新访问登录页,截获发生的请求:


访问登录页面的请求如图所示,Response Headers 有一个 Set-Cookie 字段。这就是设置 Cookies 的过程。

另外,我们发现 Response Headers 没有和 authenticity_token 相关的信息,所以可能 authenticity_token 还隐藏在其他的地方或者是计算出来的。我们再从网页的源码探寻,搜索相关字段,发现源代码里面隐藏着此信息,它是一个隐藏式表单元素,如下图所示:


现在我们已经获取到所有信息,接下来实现模拟登录。

2.代码实现

首先我们定义一个 Login 类,初始化一些变量:

class Login(object):def __init__(self):self.headers = {'Referer': 'https://github.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36','Host': 'github.com'}self.login_url = 'https://github.com/login'self.post_url = 'https://github.com/session'self.logined_url = 'https://github.com/settings/profile'self.feed_url = 'https://github.com/dashboard-feed'self.session = requests.Session()

这里最重要的一个变量就是 requests 库的 Session,它可以帮助我们维持一个会话,而且可以自动处理 Cookies,我们不用再去担心 Cookies 的问题。

接下来,访问登录页面要完成两件事:一是通过此页面获取初始的 Cookies,二是提取出 authenticity_token

在这里我们实现一个 token() 方法,如下所示:

def token(self):response = self.session.get(self.login_url, headers=self.headers)selector = pq(response.text)token = selector('input[name="authenticity_token"]').attr('value')

我们用 Session 对象的 get() 方法访问 GitHub 的登录页面,然后用 XPath 解析出登录所需的authenticity_token` 信息并返回。

现在已经获取初始的 Cookiesauthenticity_token,开始模拟登录,实现一个 login() 方法,如下所示:

def login(self, email, password):post_data = {'commit': 'Sign in','utf8': '✓','authenticity_token': self.token(),'login': email,'password': password}response = self.session.post(self.post_url, data=post_data, headers=self.headers)response = self.session.get(self.feed_url, headers=self.headers)if response.status_code == 200:self.dynamics(response.text)response = self.session.get(self.logined_url, headers=self.headers)if response.status_code == 200:self.profile(response.text)

首先构造一个表单,复制各个字段,其中 email 和 password 是以变量的形式传递。然后再用 Session 对象的 post() 方法模拟登录即可。现在的github 关注人动态是通过ajax加载的,要向’https://github.com/dashboard-feed’ 发送请求。由于 requests 自动处理了重定向信息,我们登录成功后就可以直接跳转到首页,首页会显示所关注人的动态信息,得到响应之后我们用 dynamics() 方法来对其进行处理。接下来再用 Session 对象请求个人详情页,然后用 profile() 方法来处理个人详情页信息。

其中,dynamics() 方法和 profile() 方法的实现如下所示:

def dynamics(self, html):selector = pq(html)#print(selector.text())dynamics = selector('div[class="d-flex flex-items-baseline"] div')dynamics.find('span').remove()#print(dynamics.text())for item in dynamics.items():dynamic = item.text().strip()print(dynamic)def profile(self, html):selector = pq(html)#print(selector.text())name = selector('input[id="user_profile_name"]').attr('value')email = selector('select[id="user_profile_email"] option[selected="selected"]').text()print(name,email)

我们新建一个 Login 对象,记住下面要输入自己的邮箱和密码,然后运行程序,如下所示:

if __name__ == "__main__":login = Login()login.login(email='email', password='password')

完整代码如下:

import requests
from pyquery import PyQuery as pqclass Login(object):def __init__(self):self.headers = {'Referer': 'https://github.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36','Host': 'github.com'}self.login_url = 'https://github.com/login'self.post_url='https://github.com/session'self.feed_url = 'https://github.com/dashboard-feed'self.logined_url = 'https://github.com/settings/profile'## 维持会话,自动处理cookiesself.session = requests.Session()## 解析出登录所需要的def token(self):response = self.session.get(self.login_url, headers=self.headers)selector = pq(response.text)token = selector('input[name="authenticity_token"]').attr('value')return tokendef login(self, email, password):#print(self.token())post_data = {'commit': 'Sign in','utf8': '✓','authenticity_token': self.token(),'login': email,'password': password}response = self.session.post(self.post_url, data=post_data, headers=self.headers)response = self.session.get(self.feed_url, headers=self.headers)if response.status_code == 200:self.dynamics(response.text)#print(response.text)print("================================")response = self.session.get(self.logined_url, headers=self.headers)if response.status_code == 200:self.profile(response.text)## 关注人的动态信息def dynamics(self, html):selector = pq(html)#print(selector.text())dynamics = selector('div[class="d-flex flex-items-baseline"] div')dynamics.find('span').remove()#print(dynamics.text())for item in dynamics.items():dynamic = item.text().strip()print(dynamic)## 详情页面def profile(self, html):selector = pq(html)#print(selector.text())name = selector('input[id="user_profile_name"]').attr('value')email = selector('select[id="user_profile_email"] option[selected="selected"]').text()print(name,email)
if __name__ == "__main__":login = Login()login.login(email='2685764101@qq.com', password='password')

运行结果如下:

模拟登陆——以github为例相关推荐

  1. python github登陆_用Python模拟登陆GitHub并获取信息

    最近在研究如何对搜狗搜索公众号文章进行爬取,由于需要用到Cookies,所以这回先了解下Cookies的相关知识. 搜狗的反爬有点厉害,即使我用了高匿代理,它还是会提醒我IP访问过于频繁,然后跳转验证 ...

  2. 【转】使用C#发送Http 请求实现模拟登陆(以博客园为例)

    [转]使用C#发送Http 请求实现模拟登陆(以博客园为例) 模拟登陆的原理很简单,就是发送一个Http 请求服务器获得响应,然后客户端获取到cookie即可实现模拟登陆,比如一些抢票软件的原理无非也 ...

  3. python模拟登陆 验证码el_python 模拟登陆github的示例

    # -*- coding: utf-8 -*- # @Author: CriseLYJ # @Date: 2020-08-14 12:13:11 import re import requests c ...

  4. 使用C#发送Http 请求实现模拟登陆(以博客园为例)

    使用C#发送Http 请求实现模拟登陆(以博客园为例) 原文:使用C#发送Http 请求实现模拟登陆(以博客园为例) 模拟登陆的原理很简单,就是发送一个Http 请求服务器获得响应,然后客户端获取到c ...

  5. python怎么读取github_如何通过Python模拟登陆Github?

    当我们访问一个网站,输入账号密码进入网页之后,再点击网页中的其他链接,跳转到另一个网页时,浏览器并不要求我们重新再输入一次账号密码,这是为什么呢? 原因是,当我们第一次输入账号密码后,服务器会返回给我 ...

  6. php正方系统抓取课表,以正方教务系统为例,用php模拟登陆抓取课表、空教室,抓取课表...

    以正方教务系统为例,用php模拟登陆抓取课表.空教室,抓取课表 课程格子和超级课程表这两个应用,想必大学生都很熟悉,使用自己的学号和教务系统的密码,就可以将自己的课表导入,随时随地都可以在手机上查看. ...

  7. 以豆瓣网为例,模拟登陆爬虫以及验证码处理

    在利用scrapy框架爬各种网站时,一定会碰到某些网站是需要登录才能获取信息. 最近在学天善智能课堂韦玮老师的课程,python数据挖掘与分析实战 ,通过自己部分的代码和借鉴老师的项目,多次试验改进调 ...

  8. python爬虫爬网站数据登录_使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)...

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  9. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

最新文章

  1. cpu计算机兼容,电脑升级之CPU篇:给CPU升级主要是兼容性问题,其他方法也用不上...
  2. 微信公众号监听返回按钮问题解决
  3. Matlab 图论最短路问题模型代码
  4. linux网络报文接收发送浅析_Docker容器网络-基础篇
  5. 学计算机广东2B大学,2017年广东2B大学最新排名情况
  6. MongoDB的Java驱动使用整理 (转)
  7. 计算机硬件课题,课题:计算机硬件结构介绍
  8. 计算机应用节能环保,计算机应用的节能环保问题研究
  9. MySQL length函数使用详解
  10. 安卓开发:用ImageView放上图片后上下有间隙
  11. 哪些SQL语句会引起全表扫描
  12. 转转首席架构师 孙玄:如何成为一个有情怀的工程师?
  13. linux 终端使用aplay播放wav
  14. 杨森翔人日诗词;人日书法
  15. make_blobs
  16. 【侠客行】Lombok深度解析
  17. 逆袭之路——python进阶基础之 网络编程【day32】
  18. uni-app设置页面的背景图片
  19. jquery给按钮赋值_jQuery给div,Span, a ,button, radio 赋值与取值
  20. 5个帮你改掉坏习惯的方法

热门文章

  1. 【JPA 级联保存/级联删除】@OneToMany (双向) 一对多【转】
  2. shiro框架的UsernamePasswordToken与对应Realm中的AuthenticationToken的一点比较
  3. Quartz.NET的使用(附源码)
  4. 码表的理解(ASCII,GBK,Unicode,UTF-8等)。
  5. 45.分支算法练习:  7622:求排列的逆序数
  6. SharePoint 2013 Reporting Service 部署配置图文教程
  7. strncpy 用法
  8. HDU4619--Warm up 2
  9. 【ElasticSearch 学习笔记】Java API
  10. 《菜菜的机器学习sklearn课堂》sklearn入门与决策树