需求:
爬取中国大学排名网站的数据,并将学校名称、英文名称、标签、种类、城市、评分和排名保存到 MySQL 数据库中
编码思路:
- 设置要爬取的网址,以及请求头信息。
- 定义函数 getZHDX(),使用 requests 库发送请求获取网页数据,并将返回的 JSON 数据解析为 Python 对象。然后使用 jsonpath 库对数据进行筛选,获取学校名称、英文名称、标签、种类、城市、评分和排名,并将学校名称保存到名为 "name.json" 的 JSON 文件中。
- 定义函数 saveData(),连接 MySQL 数据库,获取游标,遍历获取到的数据,处理标签和英文名称,并将数据插入到数据库中。最后关闭游标和连接,并提交更改。
- 在主函数中调用 getZHDX() 函数,执行爬取和保存数据的操作。
'''
JsonPath实战-最好的大学
需求:
1.将学校名称存储为name.json
2.名称数据存储
nameList univNameCn
enList univNameEn
tagList univTags
categoryList univCategory
provinceList province
scoreList score
rankList ranking
3.将所获取的信息全部存储到mysql数据库中
caipiao===>univ
id,name,en,tag,category,province,score,rank
'''
import requests,json,jsonpath,pymysql
# 1.设置url
url = "https://www.shanghairanking.cn/api/pub/v1/bcur?bcur_type=11&year=2023"
# 2.设置用户代理
headers ={
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
}
# 3.获取网页的数据
def getZHDX():
# 3.1 获取响应文件对象
response = requests.get(url=url,headers=headers)
# 3.2 解码操作
response.encoding = "utf-8"
# 3.3 获取网页数据
html = response.text
# 3.4 将json格式转换为python的类型
jsonObj = json.loads(html)
# 3.5 查询学校名称
nameList = jsonpath.jsonpath(jsonObj,'$..univNameCn')
# 3.6 查询学校英文名称
enList = jsonpath.jsonpath(jsonObj,'$..univNameEn')
# 3.7 查看学校的标签
tagList = jsonpath.jsonpath(jsonObj,'$..univTags')
# 3.8 查看学校的种类
categoryList = jsonpath.jsonpath(jsonObj, '$..univCategory')
# 3.9 查询学校的城市
provinceList = jsonpath.jsonpath(jsonObj,'$..province')
# 3.10 查看学校的评分
scoreList = jsonpath.jsonpath(jsonObj,'$..score')
# 3.11 查看学校的排名
rankList = jsonpath.jsonpath(jsonObj,'$..ranking')
# 3.12 将学校名称保存到json文件中
json.dump(nameList,open("name.json",'w'),ensure_ascii=False)
# 3.13 将所有的数据进行数据库保存
saveData(nameList,enList,tagList,categoryList,provinceList,scoreList,rankList)
# 4.保存到数据库
def saveData(nameList,enList,tagList,categoryList,provinceList,scoreList,rankList):
# 4.1建立通道
conn = pymysql.connect(
host="127.0.0.1",
user="root",
password="1111"
)
# 4.2选择数据库
conn.select_db("caipiao")
# 4.3 获取游标
cur = conn.cursor()
# 4.4 循环遍历
for i in range(0,len(nameList)):
# 4.4.1 处理学校的标签类型
tagData = ""
for tag in tagList[i]:
tagData += tag
tagData += ","
# 4.4.2 处理学校的英文
en = str(enList[i].replace("'",""))
# 4.4.3 设置sql语句
sql = "insert into univ values(null,'%s','%s','%s','%s','%s',%f,'%s')"\
%(nameList[i],en,tagData,categoryList[i],provinceList[i],scoreList[i],rankList[i])
print(sql)
# 4.4.5 执行
cur.execute(sql)
# 4.5 关闭
cur.close()
conn.commit()
conn.close()
if __name__ == '__main__':
getZHDX()