数据采集与融合技术作业2

学号姓名 102202111 刘哲睿
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13285
这个作业的目标 爬取天气网、股票相关信息、中国大学2021主榜所有院校信息,并存储在数据库中
实验二仓库地址 https://gitee.com/qweasdzxc123-456/crawl_project/tree/master/数据采集实验2

作业①:

要求:在中国气象网(http://www.weather.com.cn)给定城市集的 7日天气预报,并保存在数据库。

1)实验过程:

  • 1.1核心代码:

get_weather 函数:提取天气信息:找到包含天气信息的元素,遍历每个元素以获取日期、天气情况、温度信息。

import requests
from bs4 import BeautifulSoup
import csv
def get_weather(city_name, city_code):
weather_url = f'https://www.weather.com.cn/weather/{city_code}.shtml'
try:
# 请求天气页面
weather_response = requests.get(weather_url)
weather_response.encoding = 'utf-8'
weather_soup = BeautifulSoup(weather_response.text, 'html.parser')
# 找到天气数据的父元素并提取每一天的天气信息
weather_elements = weather_soup.find('ul', class_='t clearfix').find_all('li')
weather_data = [] # 保存天气数据
for element in weather_elements:
date_str = element.find('h1').text.strip() if element.find('h1') else None
weather = element.find('p', class_='wea').text.strip() if element.find('p', class_='wea') else None
# 获取温度信息
temperature_info = element.find('p', class_='tem').text.strip() if element.find('p', class_='tem') else None
if temperature_info:
if '/' in temperature_info and '℃' in temperature_info:
temperature_high, temperature_low = temperature_info.split('/')
temperature_high = temperature_high.replace('℃', '').strip()
temperature_low = temperature_low.replace('℃', '').strip()
else:
temperature_high = temperature_low = temperature_info.replace('℃', '').strip()
else:
temperature_high = temperature_low = None
if date_str:
if '(' in date_str:
date_str = date_str.split('(')[0]
weather_data.append([city_name, date_str, weather, temperature_high, temperature_low])
  • 1.2输出结果:

2)心得体会:

在实验中,通过运用 BeautifulSoup 库对 HTML 文档进行解析,我能够高效地提取所需的气象数据。这一过程强调了如何定位特定标签和类名,从而实现数据提取的精确性。在数据抓取过程中,数据的解析至关重要。在处理温度信息时,需考虑不同格式的可能性(如高低温用斜杠分隔),并进行相应的处理。这一过程凸显了数据科学中数据预处理的重要性。

作业②

用 requests 和 BeautifulSoup 库方法定向爬取东方财富网(http://quote.eastmoney.com/center/gridlist.html#hk_sh_stocks) 的股票相关信息,并存储在数据库中。

– 技巧:在谷歌浏览器中进入 F12 调试模式进行抓包,查找股票列表加载使用的 url,并分析 api 返回的值,并根据所要求的参数可适当更改api 的请求参数。根据 URL 可观察请求的参数 f1、f2 可获取不同的数值,根据情况可删减请求的参数

1)实验过程:

  • 1.1抓包界面:

  • 1.2 核心代码:

writer.writerow(['序号', '代码', '名称', '最新价', '涨跌幅', '涨跌额', '成交量', '成交额', '涨幅'])
# 移除回调函数包裹的部分,解析为 JSON
data_str = response.text.split("(", 1)[1].split(")", 1)[0]
data = json.loads(data_str)
# 获取当前页的股票信息列表
stocks = data['data']['diff']
for i, stock in enumerate(stocks):
code = stock['f12'] # 代码
name = stock['f14'] # 名称
price = stock['f2'] # 最新价
change_percent = stock['f3'] # 涨跌幅
change_amount = stock['f4'] # 涨跌额
volume = stock['f5'] # 成交量
turnover = stock['f6'] # 成交额
amplitude = stock['f7'] # 涨幅
  • 1.3 输出结果:

2)心得体会:

  • API抓包的必要性
    在当今数据驱动的时代,通过对API进行抓包,可以高效、系统地获取所需数据,而无需通过传统的网页解析方式。抓取东财网的股票信息时,API提供了标准化的数据格式,使得后续的数据处理和分析变得更加简便和高效。
  • 数据采集的复杂性
    在本实验中,东财网的数据返回形式并非直接的 JSON 格式,而是通过 JavaScript 回调函数进行封装。这要求我必须通过字符串处理的方式提取出有效的数据部分,才能进行后续的分析。

作业③:

要求:爬取中国大学 2021 主榜(https://www.shanghairanking.cn/rankings/bcur/2021 )所有院校信息,并存储在数据库中,同时将浏览器 F12 调试分析的过程录制 Gif 加入至博客中。

– 技巧:分析该网站的发包情况,分析获取数据的 api
– 输出信息:
排名 学校 省市 类型 总分
1 清华大学 北京 综合 969.2

1)实验过程:

  • 1.1 F12调试分析:


payload.js的头尾字母对应关系:

  • 1.2 核心代码:

获取payload数据

第一步:获取 payload.js 文件内容
url = "https://www.shanghairanking.cn/_nuxt/static/1728872418/rankings/bcur/2021/payload.js"
response = requests.get(url)
payload_js = response.text

解析字母映射:

json_data_match = re.search(r'__NUXT_JSONP__\("/rankings/bcur/2021",(.+?)\);', payload_js)
if json_data_match:
json_data_str = json_data_match.group(1)
data = json.loads(json_data_str) # 解析 JSON 数据
else:
raise Exception("未找到有效的 JSON 数据")
# 第三步:解析字母对应关系(假设映射关系)
letter_mapping = {
'a': "",
'b': False,
'c': None,
'd': 0,
'e': "理工",
'f': "综合",
'g': True,
'h': "师范",
'i': "双一流",
'j': "211",
'k': "江苏",
'l': "985",
'm': "农业",
'n': "山东",
# ... 其他映射
}
  • 输出结果:

2)心得体会:

在这次实验中,我抓取了2021年大学排名数据这不仅让我提升了技术能力,还让我对数据处理和分析有了更深的理解。通过使用 Python 的 requests 和 BeautifulSoup 库,我体验到了数据爬虫的强大与灵活。爬取数据的过程让我认识到,现代数据科学的核心在于能够快速获取并处理海量信息。
该api返回的数据以 JavaScript 对象的形式呈现,而非传统的 JSON 格式。数据是一次性加载且 URL 是固定的,这为大规模的数据爬取提供了便利。主要字段包括大学名称、省市、大学类型、总分等。为了有效提取这些字段,我们需要使用正则表达式,并在解析时对字段映射和数值异常进行处理。

本文作者:Con1427

本文链接:https://www.cnblogs.com/Con1427/p/18475012

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Con1427  阅读(30)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起