Python爬虫学习笔记之模拟登录并爬去GitHub

(1)环境准备:html

        请确保已经安装了requests和lxml库git

(2)分析登录过程:github

    首先要分析登录的过程,须要探究后台的登录请求是怎样发送的,登录以后又有怎样的处理过程。浏览器

     若是已经登录GitHub,则须要先退出登录,同时清除Cookiescookie

     打开GitHub的登录页面,连接为https://github.com/login,输入GitHub的用户名和密码,打开开发者工具session

     ,将Preserver Log选项勾选上,这表示持续日志,以下图所示函数

 

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

 

     点击session请求,进入其详情,以下图所示:post

 

      能够看到请求的URL为https://www.github.com/session,请求方式为POST。再往下看,咱们观察到他的Form Data和Headers这两部份内容,加密

   以下图所示:

     Headers里面包含了Cookies,Host,Origin,Refer,User-Agent等信息。Form Data包含了5个字段,commit是固定的字符串Sign in,utf8

是一个勾选字符,authenticity_token较长,其初步判断是一个Base64加密的字符串,login是登录的用户名,password是登录的密码。

     综上所述,咱们如今没法直接构造的内容有Cookies和authenticity_token。下面咱们再来探寻一下这部份内容如何获取。

在登录以前咱们会访问到一个登录页面,此页面是经过GET形式访问的。输入用户名和密码,点击登陆按钮,浏览器发送这两部分信息,也就是

说Cookies和authenticity_token必定在访问扥估页面时候设置的。

     这时在退出登录,回到登陆页,同时清除Cookies,从新访问登陆页,截获发生的请求,以下图所示:

   

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

     另外,咱们发现Response Headers没有和authenticity_token相关的信息,因此可能authenticity_token还隐藏在其余的地方或者是计算出来的

。咱们再从网页的源码探寻,搜索相关字段,发现源代码里面还隐藏着此信息,他是一个隐藏式表单元素,以下图所示:

 

     如今咱们已经获取到网页全部信息,接下来让咱们 实现模拟登录

(3)代码以下:

 1 import requests
 2 from lxml import etree
 3 
 4 class Login(object):
 5     def __init__(self):
 6         self.headers = {
 7             'Refer': 'https://github.com',
 8             'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
 9                           'Chrome/68.0.3440.75 Safari/537.36',
10             'Host': 'github.com'
11         }
12         self.login_url = 'https://github.com/login'
13         self.post_url = 'https://github.com/session'
14         self.logined_url = 'https://github.com/settings/profile'
15         self.session = requests.Session()   # 此函数能够帮助咱们维持一个会话,并且能够自动处理cookies,咱们不用再去担忧cookies的问题
16 
17     def token(self):
18         response = self.session.get(self.login_url, headers=self.headers)  # 访问GitHub的登陆页面
19         selector = etree.HTML(response.text)
20         token = selector.xpath('//div//input[2]/@value')[0]   # 解析出登录所需的authenticity_token信息
21         return token
22 
23     def login(self, email, password):
24         post_data = {
25             'commit': 'Sign in',
26             'utf-8': '',
27             'authenticity_token': self.token(),
28             'login': email,
29             'password': password
30         }
31         response = self.session.post(self.post_url, data=post_data, headers=self.headers)
32         if response.status_code == 200:
33             self.dynamics(response.text)
34 
35         response = self.session.get(self.logined_url, headers=self.headers)
36         if response.status_code == 200:
37             self.profile(response.text)
38 
39     def dynamics(self, html):  # 使用此方法提取全部动态信息
40         selector = etree.HTML(html)
41         dynamics = selector.xpath('//div[contains(@class, "news")]//div[contains(@class, "alert")]')
42         for item in dynamics:
43             dynamics = ' '.join(item.xpath('.//div[@class="title"]//text()')).strip()
44             print(dynamics)
45 
46     def profile(self, html):  # 使用此方法提取我的的昵称和绑定的邮箱
47         selector = etree.HTML(html)
48         name = selector.xpath('//input[@id="user_profile_name"]/@value')[0]
49         email = selector.xpath('//select[@id="user_profile_email"]/option[@value!=""]/text()')
50         print(name, email)
51 
52 if __name__ == "__main__":
53     login = Login()
54     login.login(email='', password='')  # 此处填本身的
相关文章
相关标签/搜索