前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫百战穿山甲(3):全国高校的自我介绍,快来找找你的大学吧!!!

爬虫百战穿山甲(3):全国高校的自我介绍,快来找找你的大学吧!!!

作者头像
看、未来
发布2021-09-18 10:42:41
2460
发布2021-09-18 10:42:41
举报
文章被收录于专栏:CSDN搜“看,未来”

郑重申明:本文仅为研究学习使用。

网页分析

网址:https://gkcx.eol.cn/school/search

一页20个学校,总共一百多页:

我估摸着有近三千个学校吧。


接触一个陌生网站做爬虫,先拿源码试试水嘛,源码要是都拿不下来那就,懂得都懂。

源码拿下来之后,做一下Xpath提取标签?一看就不专业。 这个是动态网页,要提取标签要用post方法来提。 那你这一百多页,PO一百多次,可能第一次就直接失败了。反正我post这么多次成功次数两只手熟的过来。

而且要PO,那就是找到包了嘛,那我直接解析json不好吗?


我就不多说怎么找包了吧,XHR下面就三个包,一个一个开业很快。

不过我还是要提个醒,最近谷歌浏览器被报出漏洞,所以访问陌生网站会有一定的风险,反正你们自己选择嘛,我是用谷歌的。

看一下json的url啊,这要是没有规律咱可不能蛮干,一百四十多页呢!!!

json数据网址: https://api.eol.cn/gkcx/api/?access_token=&admissions=&central=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page=2&province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&type=&uri=apidata/api/gk/school/lists

眼尖的一下就看到了哈。

那还说啥,开始干活儿呗。


开工

代码语言:javascript
复制
#coding:utf-8		
# 我们李老师说了,这个的意思是:告诉解释器,本段代码获取的数据皆以utf-8编码,解码的时候以utf-8解码即可


import requests    
import json
import time
from lxml import etree
import random
import openpyxl

#使用时请自行寻找四五个可用的请求头
header_list = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"]


def get_html(url,sleep_time):
    '''
    获取网页源码
    :param url: 目标网址
    :param header_list: 请求头列表
    :param sleep_time:  友好时间
    :return: 网页源码,未经任何处理
    '''
    times = 3
    try:
        res = requests.get(url=url, headers={"User-Agent":random.choice(header_list)})
        if res.status_code >= 200 and res.status_code<300:
            time.sleep(sleep_time)
            return res
        else:
            return None
    except Exception as e:
        print(e)
        if times>0:
            print("机会次数:"+str(times))
            get_html(url,sleep_time)
        else:
            print("无法爬取")


def get_xpath_data(html_data,xpath):
    '''
    解析网页源码,获取标签数据
    :param html_data: 网页源码
    :param xpath: Xpath路径
    :return: 标签数据列表
    '''
    data = html_data.content  # 这里要使用content,而不是text
    data = data.decode().replace("<!--","").replace("--!>","")  # 对数据进行转码操作
    tree = etree.HTML(data) # 创建element对象
    el_list = tree.xpath(xpath)
    return el_list

wb = openpyxl.Workbook()
ws = wb.active

ws.append(['address', 'admissions', 'answerurl', 'belong', 'central', 'city_id', 'city_name', 'code_enroll', 'colleges_level', 'county_id', 'county_name', 'department', 'doublehigh', 'dual_class', 'dual_class_name', 'f211', 'f985', 'id', 'is_recruitment', 'is_top', 'level', 'level_name', 'name', 'nature', 'nature_name', 'province_id', 'province_name', 'rank', 'rank_type', 'school_id', 'school_type', 'single_province', 'type', 'type_name', 'view_month', 'view_month_number', 'view_total', 'view_total_number', 'view_week', 'view_week_number', 'view_year'])

for i in range(1,143):
    url = 'https://api.eol.cn/gkcx/api/?access_token=&admissions=&central=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page='+str(i)+'&province_id=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&type=&uri=apidata/api/gk/school/lists'

    try:
        res = get_html(url,2)
        j_data = json.loads(res.content)["data"]['item']
        for data in j_data:
            ws.append([data['address'], data['admissions'], data['answerurl'], data['belong'], data['central'], data['city_id'],
                data['city_name'], data['code_enroll'],
                data['colleges_level'], data['county_id'], data['county_name'], data['department'], data['doublehigh'],
                data['dual_class'], data['dual_class_name'],
                data['f211'], data['f985'], data['id'], data['is_recruitment'], data['is_top'], data['level'],
                data['level_name'], data['name'], data['nature'],data[ 'nature_name'],data[ 'province_id'],data['province_name'],data['rank'],data[ 'rank_type'],data['school_id'],data['school_type'],
                data['single_province'],data['type'],data['type_name'],data['view_month'],data['view_month_number'],data['view_total'],
                data['view_total_number'],data['view_week'],data['view_week_number'],data['view_year']])

            print("Success")

    except:
        print(url)

wb.save('test.xlsx')
wb.close()

事后会获取到一批的网址,至于批量获取网址打开之后的内容,就需要用到并发编程了,后面专门出一套,先关注,不迷路。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 网页分析
  • 开工
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档