用python写爬虫整的很方便,弄了个模拟登陆,登陆后带上token和cooke请求页面
就拿gitlab练下手了,这个还是有一丢丢麻烦的
一、登陆界面
获取隐藏域中的token,构建表单的时候需要
获取到这个_gitlab_session,登陆校验时需要带着这个信息
准备好token和cookie,当然还需要一个能登陆用户名和密码
二、登陆验证
登陆验证就是构建表单,不知为何还要传一个utf-8参数
按说应该可以登陆进去的,但是....登陆进去后页面会重定向到一个界面。接着呢,只好看fiddle里抓包的信息
之前一直以为没有登陆成功,其实已经登陆成功,但是请求需要登陆页面,还是会跳转到登陆界面。。
原来登陆成功后会获取一个新的session,然后需要调整 Headers里面的信息
再用这个headers去请求需要登陆的页面,发现都可以了
代码如下,写得很随意:
"""
http://code.t-appagile.com/users/sign_in
http://code.t-appagile.com/users/sign_in
"""
import requests
import json
import string
from bs4 import BeautifulSoup
login = "http://code.t-appagile.com/users/sign_in"
call = "http://code.t-appagile.com/users/auth/ldapmain/callback"
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
'Cache-Control': 'no-cache',
# 'Content-Length':'183',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': '',
'Host': 'code.t-appagile.com',
'Origin': 'http://code.t-appagile.com',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://code.t-appagile.com/users/sign_in',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
}
def HttpPost(apiUrl, data):
try:
global headers
r = requests.post(apiUrl,headers=headers, data=data)
cook = r.request.headers["Cookie"].split('=')
lowCook = headers["Cookie"].split('=')
newCook=lowCook[0]+'='+lowCook[1]+'='+cook[2]
headers["Cookie"] = newCook
print("登陆成功:",newCook)
return r
except:
return
def HttpGet(apiUrl):
try:
global headers
r = requests.get(apiUrl)
cook = ""
for c in r.cookies:
cook += c.name + "="+c.value + ";"
headers["Cookie"] = cook
print("登陆前的:",cook)
return r.text
except:
return
def HttpGetLcmm(apiUrl):
try:
r = requests.get(apiUrl,headers=headers)
return r.text
except:
return
res = HttpGet(login)
html = BeautifulSoup(res,"html.parser")
token = html.find_all(type="hidden")[1]["value"]
postData ={}
postData["utf8"] ="✓"
postData["authenticity_token"] =token
postData["username"] ="你的账号"
postData["password"] ="你的密码"
res = HttpPost(call,postData)
# print(res.status_code)
# print(res.text)
# print(html)
res = HttpGetLcmm("http://code.t-appagile.com/SI.Web/lcmm-web")
print('ok!')
发现,写模拟登陆需要很耐心,对比真实的http请求headers里面的信息,再去构建模拟请求的
有时间再弄个有验证码的,应该也简单,毕竟都有验证码识别的Api了