Python网络爬虫数据提取神器 Selector 的用法

我们先以一个最简单的实例来了解模拟登录后页面的抓取过程,其原理在于模拟登录后 Cookies 的维护 。
1. 本节目标私信小编01即可获取大量的Python学习资料
本节将讲解以 GitHub 为例来实现模拟登录的过程,同时爬取登录后才可以访问的页面信息,如好友动态、个人信息等内容 。
我们应该都听说过 GitHub,如果在我们在 Github 上关注了某些人,在登录之后就会看到他们最近的动态信息,比如他们最近收藏了哪个 Repository,创建了哪个组织,推送了哪些代码 。但是退出登录之后,我们就无法再看到这些信息 。
如果希望爬取 GitHub 上所关注人的最近动态,我们就需要模拟登录 GitHub 。
2. 环境准备请确保已经安装好了 requests 和 lxml 库,如没有安装可以参考第 1 章的安装说明 。
3. 分析登录过程首先要分析登录的过程,需要探究后台的登录请求是怎样发送的,登录之后又有怎样的处理过程 。
如果已经登录 GitHub,先退出登录,同时清除 Cookies 。
【Python网络爬虫数据提取神器 Selector 的用法】打开 GitHub 的登录页面,链接为 https://github.com/login,输入 GitHub 的用户名和密码,打开开发者工具,将 Preserve Log 选项勾选上,这表示显示持续日志,如图 10-1 所示 。

Python网络爬虫数据提取神器 Selector 的用法

文章插图
 
图 10-1 开发者工具设置
点击登录按钮,这时便会看到开发者工具下方显示了各个请求过程,如图 10-2 所示 。
Python网络爬虫数据提取神器 Selector 的用法

文章插图
 
图 10-2 请求过程
点击第一个请求,进入其详情页面,如图 10-3 所示 。
Python网络爬虫数据提取神器 Selector 的用法

文章插图
 
图 10-3 详情页面
可以看到请求的 URL 为 https://github.com/session,请求方式为 POST 。再往下看,我们观察到它的 Form Data 和 Headers 这两部分内容,如图 10-4 所示 。
Python网络爬虫数据提取神器 Selector 的用法

文章插图
 
图 10-4 详情页面
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 一定是在访问登录页的时候设置的 。
这时再退出登录,回到登录页,同时清空 Cookies,重新访问登录页,截获发生的请求,如图 10-5 所示 。
Python网络爬虫数据提取神器 Selector 的用法

文章插图
 
图 10-5 截获请求
访问登录页面的请求如图所示,Response Headers 有一个 Set-Cookie 字段 。这就是设置 Cookies 的过程 。
另外,我们发现 Response Headers 没有和 authenticity_token 相关的信息,所以可能 authenticity_token 还隐藏在其他的地方或者是计算出来的 。我们再从网页的源码探寻,搜索相关字段,发现源代码里面隐藏着此信息,它是一个隐藏式表单元素,如图 10-6 所示 。
Python网络爬虫数据提取神器 Selector 的用法

文章插图
 
图 10-6 表单元素
现在我们已经获取到所有信息,接下来实现模拟登录 。
4. 代码实战首先我们定义一个 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.session = requests.Session()


推荐阅读