本篇属于技术应用文章,因此省略一些知识点,有疑问的可以在评论区留言。
- 寻找目标
找到目标网站:https://gkcx.eol.cn/ - 分析页面,找到学校请求连接
这里使用Fiddler工具查看网站的请求链接,过程自不必说直接定位到https://api.eol.cn/gkcx/api/?access_token=&admissions=¢ral=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page=2&province_id=11&ranktype=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&type=&uri=apidata/api/gk/school/lists
这个链接
这里我们分析page这个请求参数是我们下一步需要动态变化的参数。
- 使用scrapy爬虫框架进行请求获取数据
1.创建爬虫项目工程,在工程下使用命令创建名为scrapy genspider gkcx gkcx.eol.cn
的爬虫文件。
2.增加start_requests
方法,在这里进行cookie的设置,请求url的构建。cookie可以在浏览器中进行查找copy即可。url的构建完毕后,通过循环进行请求。这个请求有点慢耐心等待。
3.通过请求的json数据进行分析筛选我们需要的数据。返回数据还是挺全的,咱们全部保存下来。
gkcx.py
具体代码,这里我就构造了2页的数据。直接copy的注意进行修改start_urls中的range(2)
import json
import scrapy
import os
class GkcxSpider(scrapy.Spider):
name = 'gkcx'
allowed_domains = ['gkcx.eol.cn','eol.cn']
def start_requests(self):
cookies={
"UM_distinctid":"17880acb4efff-01cd940f9dbbf6-5c3f1e49-1fa400-17880acb4f08ed",
"gr_user_id":"19fc3b7b-a1fe-4f68-8484-1d5abbbe4ff2",
"CNZZDATA1254843834":"491458528-1617069302-%7C1617087618",
"areaid":"15",
"cityid":"1502",
"Hm_lvt_9b4517aa97b6b67e7c396bef15886cef":"1617066505,1617259881",
"Hm_lpvt_9b4517aa97b6b67e7c396bef15886cef":"1617323594",
"88025341dda01c5f_gr_session_id":"bfe0e3c2-efab-4bb8-b6ca-ec9178caecde",
"88025341dda01c5f_gr_session_id_bfe0e3c2-efab-4bb8-b6ca-ec9178caecde":"true",
"CNZZDATA4696252":"cnzz_eid%3D1247075774-1617065693-%26ntime%3D1617319297"
}
start_urls = ['https://api.eol.cn/gkcx/api/?access_token=&admissions=¢ral=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page={}&province_id=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&type=&uri=apidata/api/gk/school/lists'.format(num) for num in range(2)]
self.cookies=cookies
for url in start_urls:
yield scrapy.Request(url=url, cookies=cookies, callback=self.parse)
def parse(self, response):
jsonSchool = json.loads(response.text)
for item in jsonSchool['data']['item']:
yield item
- 保存需要的数据
保存数据的位置我们写在Pipeline.py
这个文件中,存储方式我们以文件形式保存数据。在open_spider
方法中我们定义我们的文件变量,在process_item
这个接受item的数据方法中我们进行保存数据的处理。最后我们在close_spider
中关闭文件流。
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
import json
import pymongo
from itemadapter import ItemAdapter
class GkzsscrapyPipeline:
def open_spider(self,spider):
self.filename=open('schooldata.txt','a',encoding='utf-8')
mogoclient = pymongo.MongoClient()
self.db = mogoclient.gkcx
def process_item(self, item, spider):
# print(item)
self.filename.write(json.dumps(dict(item),ensure_ascii=False)+'\n')
# self.db.special.update({'id': item['id']}, {'$set': dict(item)}, True) # 向数据库插入一条记录
return item
def close_spider(self,spider):
self.filename.close()
- 爬取结果
这里我就构造了两页的数据所以想知道结果的,自己可以爬一下。最后附上官方的数据。
2020年官方全国普通高等学校数据参考
不清楚的欢迎留言!!!