需求:
爬取中国大学排名网站的数据,并将学校名称、英文名称、标签、种类、城市、评分和排名保存到 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.设置urlurl = "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()