用Python模拟登陆GitHub并获取信息
最近在研究如何对搜狗搜索公众号文章进行爬取,由于需要用到Cookies,所以这回先了解下Cookies的相关知识。
搜狗的反爬有点厉害,即使我用了高匿代理,它还是会提醒我IP访问过于频繁,然后跳转验证码页面。
其实真正的原因不在于IP,而是Cookies,里面的参数如果一直不变的话,他就会封你的Cookies,通俗说就是封你的微信账号。
因为获取Cookies需要用你的微信账号,在短时间内基本上你的Cookies参数不会改变(就是账号退了再登陆也不会变)。
不过方法还是有的,通过其他搜狗搜索网址动态改变(一个账号没办法呀...)。
这里先对GitHub进行模拟登陆,了解会话及Cookies相关知识。
/ 01 / 网页分析
首先看一下登录页,获取authenticity_token参数值,是一个隐藏式表单元素。
查看登录页的Response Headers,这里的Set-Cookie字段,是设置Cookies的过程。这边呢我的理解是,当你在session那个网页填写账号和密码后,这里就会自动生成一个Cookies返回(其实我也很晕...)。
将Preserve Log打开(表示显示持续日志),然后输入账号及密码,找到session这个请求。最后得知请求的网址及请求方式(POST)。
这里是session的请求头和表单信息,能看到生成的Cookies信息。
获取用户动态及个人信息的网页就不说了,简单操作。
需要提的一点就是用户动态的网页是Ajax请求,崔大的代码过时了呀...
/ 02 / 数据获取
实现代码如下所示。
from lxml import etree
import requests
class Login(object):
# Login类继承object对象,高级特性
def __init__(self):
# 特殊的方法,类的构造函数或初始化方法,当创建了Login类的实例时就会调用该方法
# self代表类的实例,self在定义类的方法时是必须有的
self.headers = {
'Referer': 'https: // github.com /',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; 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'
# 这里因为崔大的代码不行了,自己去找用户动态信息的真正请求,又是Ajax
self.get_users_url = 'https://github.com/dashboard-feed'
self.post_url = 'https://github.com/session'
self.logined_url = 'https://github.com/settings/profile'
# 创建一个session对象
self.session = requests.Session()
# 类的方法与普通的函数只有一个特别的区别, 它们必须有一个额外的第一个参数名称, 按照惯例它的名称是self
# self不是python关键字,我们把它换成cool也是可以正常执行的
def token(self):
# 获取authenticity_token参数值
response = self.session.get(self.login_url, headers=self.headers)
result = etree.HTML(response.text)
token = result.xpath('//div//input[2]/@value')[0]
return token
def login(self, email, password):
# 模拟登陆GitHub,POST请求
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)
# 获取我所关注的人的动态
if response.status_code == 200:
response = self.session.get(self.get_users_url, headers=self.headers)
self.dynamics(response.text)
# 获取我的个人信息
response = self.session.get(self.logined_url, headers=self.headers)
if response.status_code == 200:
self.profile(response.text)
def dynamics(self, html):
# 获取我所关注的人的动态
result = etree.HTML(html)
dynamics = result.xpath('//div[@class="d-flex flex-items-baseline"]/div')
for item in dynamics:
# 这里我是直接获取标签所有文字,然后去除换行及空格
print(item.xpath('string(.)').strip().replace('\n', '').replace(' ', ' ').replace(' ', ' ').replace(' ', ' ').replace(' ', ' '))
def profile(self, html):
# 获取我的个人信息
result = etree.HTML(html)
name = result.xpath('//input[@name="user[profile_name]"]/@value')[0]
email = result.xpath('//select[@name="user[profile_email]"]/option[@selected="selected"]/text()')
print(name, email)
if __name__ == '__main__':
# 类的实例化类似函数调用方式
login = Login()
# 使用点号 . 来访问对象的属性
login.login(email='你的账号', password='你的密码')
最后成功登陆,获取动态及个人信息。
/ 03 / 总结
搞了半天,其实对会话和Cookies 还是晕晕的...
这里对类的知识做个总结,平常函数用的多一点,类都没怎么接触,需要好好回忆一下。
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
实例变量:定义在方法中的变量,只作用于当前实例的类。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
这回我也用上了GitHub,其实好几月前就注册了,慢慢了解吧,以后源码网盘、GitHub都会放。
文末点个赞,比心!!!
推荐阅读
··· END ···