爬取某届学生实习单位


注意事项:

  1. token需要post获取然后在前面加上个"Bearer "
  2. 请求公司名称的时候需要先使用options请求一次通过安全检查后才能get到数据。
image.png

Options:

在 CORS 中,可以使用 OPTIONS 方法发起一个预检请求,以检测实际请求是否可以被服务器所接受。预检请求报文中的 Access-Control-Request-Method 首部字段告知服务器实际请求所使用的 HTTP 方法;Access-Control-Request-Headers请求首部 Access-Control-Request-Headers 出现于 preflight request (预检请求)中,用于通知服务器在真正的请求中会采用哪些请求首部。") 首部字段告知服务器实际请求所携带的自定义首部字段。服务器基于从预检请求获得的信息来判断,是否接受接下来的实际请求。

import requests,pymysql,re,json,csv
data={
'type': 'username',
'username':'stu_id',
'password':'password'
}
id=''
Token=''
db = pymysql.connect("localhost","root","password","test")
cursor = db.cursor()

# 全过程
def raw_num():
    cs=open("paiming.csv","r",errors="ignore")
    reader=csv.reader(cs)
    for line in enumerate(reader): 
        #print(index)
        try:
            get_Token(line[1][1])
        except Exception as e:
            print(e)
        #print(line[1][1])
    cs.close()

# sql存储到mysql
def store(id,company,adds):
    #print(company)
    h='Insert into stu(id,company,another) values(%s,"%s","%s")'%(id,company,adds)
    print(h)
    cursor.execute(h)
    db.commit()

# 获取实习单位
def get_Token(stu_id):
    data['username']=stu_id
    url='https://api.xsix103.cn/prac_manage/v1/token'
    r=requests.post(url,data)
    
    # 提取token
    Token=re.findall('"accessToken":[^,]*',r.text)[0]
    Token=Token[15:-1]
    
    T=re.findall('"id":[^,]*',r.text)[0]
    id=T[5:-2]
    
    heads='Bearer '

    payload={'Referer':'https://www.xsix103.cn/prac-manage/index/student/stuInfo','Origin':'https://www.xsix103.cn','Accept':'application/json, text/plain, */*','Authorization':heads+Token}

    print(payload)

r=requests.options('https://api.xsix103.cn/prac_manage/v1/info/'+id)
    r=requests.get('https://api.xsix103.cn/prac_manage/v1/info/'+id,headers=payload)

    print(r.text)
    b=json.loads(r.text)

    company=str(b['phiCompany'])
    add=str(b['phiRemark'])
    store(stu_id,company,add)
try:
    raw_num()
except Exception as e:
    print(e)
db.close()

你可能感兴趣的:(爬取某届学生实习单位)