原标题:解放双手,用Python自动登录25个主流网站
用 Python 写爬虫脚本是大家经常遇到的需求。在这个过程中,避开不了登录这一关。
使用 Python 一般会用 request 库,补充 header 中的 post 要素,有些还会有 隐藏的 hidden 参数,可以通过浏览器 F12 或者元素审查来发现,对于初学者来说都是一个坑。
还有需要解决验证码的问题,一种方法是下载验证码图片识别验证码再次post,或者使用云打码平台。当然,有些验证码及其变态就不那么容易解决了,比如选字顺序、滑块、12306那种正常人都会选错的。
本篇我们分享一个GitHub项目《awesome-python-login-model》,主要就是利用 Python 解决模拟登录这个问题。截至目前已经实现了25个主流平台,在GitHub上收到12.1k个星。
Github链接:https://github.com/Kr1s77/awesome-python-login-model
▍已完成的主流网站
上面是作者已经完成的一些主流网站了,其中有的是通过selenium登录,有的是通过抓包直接模拟登录,有的是利用scrapy 框架。
这个很容易理解,因为有的网站设计比较复杂,通过抓包很难实现模拟登录,这样用 selenium+webdriver 就会相对轻松一些。
虽然在登录的时候采用的是selenium,为了效率, 我们可以在登录过后得到的cookie维护起来,然后调用requests或者scrapy等进行数据采集,这样数据采集的速度可以得到保证。
▍模拟登录GitHub
这里给大家展示一个模拟登录GitHub的代码。
"""
github第二种登录方式
info:
author:CriseLYJ
github:https://github.com/CriseLYJ/
update_time:2019-3-7
"""
importre
importrequests
fromlxml importetree
classLogin(object):
classGithubLogin(object):
def__init__(self, email, password):
# 初始化信息
self.headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Referer': 'https://github.com/',
'Host': 'github.com'
}
self.session = requests.Session
self.login_url = 'https://github.com/login'
self.post_url = 'https://github.com/session'
self.session = requests.Session
self.email = email
self.password = password
# 模拟登录
deflogin_GitHub(self):
# 登录入口
post_data = {
'commit': 'Sign in',
'utf8': '✓',
'authenticity_token': self.get_token,
'login': self.email,
'password': self.password
}
resp = self.session.post(
self.post_url, data=post_data, headers=self.headers)
print( 'StatusCode:', resp.status_code)
ifresp.status_code != 200:
print( 'Login Fail')
match = re.search( r'"user-login" content="(.*?)"', resp.text)
user_name = match.group( 1)
print( 'UserName:', user_name)
response = self.session.post(self.post_url, data=post_data, headers=self.headers)
print(response.status_code)
print(post_data)
ifresponse.status_code == 200:
print( "登录成功!")
else:
print( "登录失败!")
# 获取token信息
# Get login token
defget_token(self):
response = self.session.get(self.login_url, headers=self.headers)
html = etree.HTML(response.content.decode)
token = html.xpath( '//input[@name="authenticity_token"]/@value')[ 0]
returntoken
ifresponse.status_code != 200:
print( 'Get token fail')
returnNone
match = re.search(
r'name="authenticity_token" value="(.*?)"', response.text)
ifnotmatch:
print( 'Get Token Fail')
returnNone
returnmatch.group( 1)
if__name__ == '__main__':
email = input( '请输入您的账号: ')
password = input( '请输入您的密码: ')
email = input( 'Account:')
password = input( 'Password:')
login = Login(email, password)
login = GithubLogin(email, password)
login.login_GitHub
相信这对初学爬虫的朋友是一个很好的教程。
但提示一下,模拟登录的代码随时都有可能失效,因为前端的网页HTML、CSS、JS等结构可能会根据公司业务调整之类的发生变化。
所以,重点是通过实例掌握背后的实现原理和绕过反爬的技巧,学会这些就可以自己调试完成登录,那时候你也可以成为 contributor 了!
Github链接:https://github.com/Kr1s77/awesome-python-login-model
作者:Boy哥
来源:GitHuboy(Handsome_Coder)
爬虫必备工具,掌握它就解决了一半的问题 返回搜狐,查看更多
责任编辑: