엑셀 테이블에 사천 연도에 대한 파이썬 3 크롤 국가 대학 입학 데이터 (ARTS 지방 제어 라인, 전문 라인 ARTS) (재)

원본 글 주소 : https://blog.csdn.net/memory_qianxiao/article/details/82388370

내 친구의 많은 데이터를 필요로하기 때문에, 출시 이후, 많은 사람들이 소스 코드에 대한 부탁이있다, 나는 3 월 10 일 하루 이상까지, 나는 시험도 있고, 실행 후 데이터가없는 들었다 준 정말 다음 간단한 조사가이 URL이 준비 .... 파란색 다리로 인해 컵을 변경 요청 질문 할 것을 발견, 데이터없는, 더 조심 조사, 나중에는 URL이 변경 요청 발견주의 조사는 한 가지입니다, 초점은 아약스 기술을 사용하여 사이트에, 데이터는 주소 아약스 요청에 필요한 ... 그래서, 다음 웹 페이지에 현지로드 내부 페이지 소스 코드, 아약스를 통해 요청 데이터없는 데이터 분석을 얻을 수 있습니다. . . 그런 다음 문제가 해결하지만,에 ... 불과 200 개 라인과 같은 코드의 양을 줄일 수 있지만, 재건의 과정을 설명합니다.

개발 환경 : 파이썬 3.6 + pycahrm 

셋째 방전 라이브러리 : 요청 (요청 페이지 수준 라이브러리), xlwt (엑셀 조작 라이브러리), JSON (파이썬 및 JSON 라이브러리 시스템 변환)

원래 문서 크롤링 프로세스 상세 작성하기 때문에,이 시간이 너무 상세하게 작성하고, 원래의 문서를 참조하십시오, 배우고, 이해하는 것이 더 배우고 싶어하지 않습니다 https://blog.csdn.net/memory_qianxiao/article/details/82388370 코드 만 ( 내가 사용하지만 중요한, 모든, 가장 중요한 학습 아이디어 후, 코드 로직이 자신의 생각의 표현이다 생각 할 수 없음)

참고 : 인해 다시 사이트 업데이트에 있지만,이 업데이트는 새 이름이의 API 변경 요청은 코드를 생성하여 사용할 수 없습니다 만 아약스 요청에 주소 변경을 요청해야 장쑤 성에서 원래 경로 같은 :( 덕분에 다음 이순신 웨이) 학생들 지적했다. (4 월 (30) 7월 19일 업데이트하면 코드를 업데이트의 마지막 코드의 무결성, 다음 수 GitHub의 :)를 클릭하십시오.

가 요청의 요청 헤더는, 같은 다음에 올 때 증가도 필요하므로 한편, 사이트 좀 더 안티 등반 조치를, 우리는 브라우저로 위장 요청해야합니다 :

업데이트 : 19 년 7 월 최신 GitHub의 포털에 2019 원본 클릭 : I 입력 점, GitHub의 포털 ~

excel4 페이지 과학 전문 라인, 라인 교양, 과학 지방 제어 라인, 제어 라인 문부 과학성 : 오래된 규칙, 타운 하우스도는 (크롤링 부분)을 다음과

 A : 분석은 다음과 같습니다 URL 요청 쓸모 있도록 업데이트 사이트의 변화 때문에, 아약스 데이터는, 논리 분석은 아래와 같습니다 :

F12 키를 눌러이 개발자 모드를 입력 네트워크를 눌러 클릭을 길게 XHR, 단지 지점에있는 대학에서 올해의 모든 지점 또는 예술과 과학을 발견하는 API가있을 것입니다 위해, 데이터 API 키 내부에 반환, 다음 분석하는 방법이다 분석 API는 데이터 내부를 얻을 수 있습니다.

II : 헤더는 다음과 같이 내부 분석 API를 :

요청 URL은 다음과 같습니다 https://gkcx.eol.cn/api

신청 방법 : POST! POST! POST! 그것은 중요하지 get 메소드입니다.

요청 매개 변수 : 포스트 요청 매개 변수는

그리고 우리는 여기에서 가장 중요한 것은 요청 매개 변수 인 데이터를 얻을 :

local_province_id : 사이트 업데이트, 당신이 요청 매개 변수를 변경할 수 있습니다, 그것은 당신이 다른 곳에서 크롤링 데이터를 필요 그렇다면, 위치가 자동으로 입력 후 코드라는 현재의 위치 위치 IP를 선택합니다, 자동 위치 코드의 지방입니다입니다 지방 자신의 코드는, 그래서 우리는 시도 할 필요가있다.

local_type : 코드 이름은 교양 과목이며, 과학 시험을 갈 수있는 1, 2 교양이다, 클릭 할 때마다 라인에 볼 수있는 새로운 API를해야합니다.

school_id : 라인에 ID를 변경하는 학교를 확인하는 데 필요한 학교의 ID입니다

URI : "hxsjkqt / API / GK / 점수 /도"지방 컨트롤 라인은 hxsjkqt / API / GK / 점수 / 특수 전문 라인

년 : 올해는 매개 변수 크롤링 할 필요가있는 올해 연도를 준 무엇인가 크롤링

따라서, 상기 매개 변수의 요구 request.POST 때 () 메소드와 패스.

여기에 해당하는 코드뿐만 아니라 국가의 34 개 지방의 이름을 첨부 :

北京:11
天津:12
河北:13
山西:14
内蒙古:15
辽宁:21
吉林:22
黑龙江:23
上海:31
江苏:32
浙江:33
安徽:34
福建:35
江西:36
山东:37
河南:41
湖北:42
湖南:43
广东:44
广西:45
海南:46
重庆:50
四川:51
贵州:52
云南:53
西藏:54
陕西:61
甘肃:62
青海:63
宁夏:64
新疆:65
台湾:71
香港:81
澳门:82


세 : 나는 학교에 ID를 알고 있거나 다음 URL 요청을 바느질, 폭력 (30) 학교 ID주기의 시작으로 3000에서, 폭력의 형태를 취할하지 않기 때문에.

또는 세 가지 기능, main () 함수 항목, get_html () 요청 정보의 get_info () 학교 정보를 얻기 위해, 저장 내부를 엑셀을 정의합니다. 메모를 가지고 코드, 음의 반복되지가 없을 것, 그것은 동일합니다. 이 경우, 그래서 여전히 오류가 무엇인지 시간주기의 시작 지점에 변화가 계속되면, 학교 ID 뒤에 인쇄 URL마다입니다 브레이크 포인트 등반을 사용하고, 더 적은 오류가있을 수 있습니다, 그렇게 큰 하나님은 오류 솔루션, 환영을 알고있다 메시지 지침 감사.

 전체 코드는 그대로 다음과 엑셀은 자신의 파일 경로 확인에 경로를 저장합니다.

# -*- coding: utf-8 -*-
# @Filename: 全国高校录取数据重构.py
# @Time    : 2019/3/22 16:49
# @Author  : LYT
"""

"""
import requests,re,xlwt,json
from bs4 import BeautifulSoup
def Get_html(url,data):
    try:
        headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3676.400 QQBrowser/10.4.34"
        }#更新后添加的请求头,伪装成浏览器
        r=requests.post(url,params=data,headers=headers)#带请求参数params,同时把headers传进去
        r.encoding=r.apparent_encoding
        print("请求服务成功!")
        print(r.text)
        return r.text
    except:
        print("请求失败")
def Get_info(url,id):
    url_api = "https://gkcx.eol.cn/gkcx/api"#更新后请求ajax api  
    #请求参数信息
    data = {
        'local_province_id': '51',  # 省份 51为四川  默认是自动定位的地方
        'local_type_id': 1,  # 理科为1,文科为2,
        'school_id': '30',  # 学校id
        'uri': "hxsjkqt/api/gk/score/province",  # 专业线special     省线province
        'year': 2018  # 年份 网站更新后 省录取线2014 -2018  专业录取线2014-2017
    }
    info_like=[]#存理科省线信息列表
    info_wenke=[]#存文科省线信息列表
    special_like=[]#存理科专业信息列表
    special_wenke=[]#存文科专信息业表
    name=""
    for i in range(2014,2019):#请求2014-2018的省控线信息

        data['year']=i #更换参数年份
        data['school_id']=id#更换学校id
        data['local_type_id']=1#更换为理科
        infoes=json.loads(Get_html(url_api,data))
        # print(info)
        # print(info['data']['item'])
        #存理科省录取线
        if len(infoes['data']['item'])==0:
            l=[]
            l.append(name)  # 没有数据就填充--
            l.append(str(i))
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            info_like.append(l)
        for j in range(len(infoes['data']['item'])):  # 可能有多个省录取线,比如提前批,一批,二批等
            l = []
            info = infoes['data']['item'][j]
            name = info['name']
            l.append(info['name'])#存学校名字
            l.append(info['year'])#存年份
            l.append(info['local_type_name'])  # 科类
            l.append(info['max'])#最大录取分数
            l.append(info['average'])#平均分
            l.append(info['min']) #最低分
            l.append(info['proscore']) #省控线
            l.append(info['local_batch_name'])#批次
            info_like.append(l)

        #存文科录取线
        data['local_type_id']=2#更换为文科
        infoes = json.loads(Get_html(url_api,data))
        if len(infoes['data']['item'])==0:
            l=[]
            l.append(name)  # 没有数据就填充--
            l.append(str(i))
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            info_wenke.append(l)
        for j in range(len(infoes['data']['item'])):#可能有多个省录取线,比如提前批,一批,二批等
            l=[]
            info = infoes['data']['item'][j]
            name=info['name']
            l.append(info['name'])  # 存学校名字
            l.append(info['year'])  # 存年份
            l.append(info['local_type_name'])#科类
            l.append(info['max'])   #最大录取分数
            l.append(info['average']) #平均分
            l.append(info['min'])      #最低分
            l.append(info['proscore']) #省控线
            l.append(info['local_batch_name'])#批次
            info_wenke.append(l)

        print(info_like)
        print(info_wenke)

    for i in range(2014,2018):#请求2014-2017的专业录取信息
        # 请求参数信息
        data['year'] = i  # 更换参数年份
        data['school_id'] = id  # 更换学校id
        data['local_type_id'] = 1  # 更换为理科
        data['uri']='/'.join(data['uri'].split('/')[0:-1])+"/special"#更换为请求参数为专业录取线的参数网址
        infoes = json.loads(Get_html(url_api,data))
        #存理科专业信息
        if len(infoes['data']['item']) == 0:
            l = []
            l.append(name)
            l.append(str(i))
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            info_like.append(l)
        for j in range(len(infoes['data']['item'])):
            l=[]
            info=infoes['data']['item'][j]
            name=info['name']
            l.append(info['name'])#学校名字
            l.append(info['year'])#年份
            l.append(info['spname'])#专业名称
            l.append(info['local_type_name'])#科类
            l.append(info['average'])#专业平均分
            l.append(info['max'])#最高分
            l.append(info['min'])#最低分
            l.append(info['local_batch_name'])#录取批次
            special_like.append(l)
        #存文科专业录取信息
        data['local_type_id']=2#更换为文科
        infoes = json.loads(Get_html(url_api, data))
        if len(infoes['data']['item']) == 0:
            l = []
            l.append(name)   #没有信息就填充--符号
            l.append(str(i))
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            l.append('--')
            info_like.append(l)
        for j in range(len(infoes['data']['item'])):
            l=[]
            info=infoes['data']['item'][j]
            name=info['name']
            l.append(info['name'])#学校名字
            l.append(info['year'])#年份
            l.append(info['spname'])#专业名称
            l.append(info['local_type_name'])#科类
            l.append(info['average'])#专业平均分
            l.append(info['max'])#最高分
            l.append(info['min'])#最低分
            l.append(info['local_batch_name'])#录取批次
            special_wenke.append(l)
        print(special_like)
        print(special_wenke)
    #*******************保存数据到excel**************************
    print("*************正在写入Excrl数据***************")
    # 创建excel簿指定编码
    file=xlwt.Workbook(encoding='utf-8')
    #创建表 一个表有4个sheet
    print("*************正在写入Excrl理科专业线数据***************")
    table1=file.add_sheet(name+'理科专业线')
    value = ['学校名称', '年份','专业名称','科类', '平均分', '最高分', '最低分', '批次']
    for i in range(len(value)):
        table1.write(0,i,value[i])
    for i in range(len(special_like)):
        for j in range(len(special_like[i])):
            table1.write(i+1,j,special_like[i][j])

    print("*************正在写入Excrl文科专业线数据***************")
    table2 = file.add_sheet(name + '文科专业线')
    value = ['学校名称', '年份', '专业名称', '科类', '平均分', '最高分', '最低分', '批次']
    for i in range(len(value)):
        table2.write(0, i, value[i])
    for i in range(len(special_wenke)):
        for j in range(len(special_wenke[i])):
            table2.write(i + 1, j, special_wenke[i][j])

    print("*************正在写入Excrl理科省控线数据***************")
    table3 = file.add_sheet(name + '理科省控线')
    value = ['学校名称', '年份', '科类', '最高分', '平均分', '最低分', '省控线', '批次']
    for i in range(len(value)):
        table3.write(0, i, value[i])
    for i in range(len(info_like)):
        for j in range(len(info_like[i])):
            table3.write(i + 1, j, info_like[i][j])

    print("*************正在写入Excrl文科省控线数据***************")
    table4 = file.add_sheet(name + '文科省控线')
    value = ['学校名称', '年份', '科类', '最高分', '平均分', '最低分', '省控线', '批次']
    for i in range(len(value)):
        table4.write(0, i, value[i])
    for i in range(len(info_wenke)):
        for j in range(len(info_wenke[i])):
            table4.write(i + 1, j, info_wenke[i][j])

    # ***********指定保存路径******************
    file.save('D:\QQPCMgr(1)\Desktop\高校/' + name + '录取数据.xls')
    print("****************"+name+"所有数据爬取成功"+"*********************")
def main():
    for id in range(30,3000):
        url="https://gkcx.eol.cn/school/"+str(id)
        print(url)
        Get_info(url,id)

if __name__ == '__main__':
    main()

 

게시 된 395 개 원래 기사 · 원 찬양 (126) ·은 20 만 + 조회수

추천

출처blog.csdn.net/memory_qianxiao/article/details/88767327