102302104刘璇-数据采集与融合技术实践作业2

作业1:

要求:在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。
输出信息:Gitee文件夹链接
核心代码设计逻辑:
  模拟浏览器访问天气网站,获取北京7天天气预报页面;用BeautifulSoup解析HTML,找到包含天气数据的列表项;从每个天气条目中提取日期、天气状况和温度信息;把提取的数据清洗整理后存入SQLite数据库

2-1.1
2-1.2

核心代码:
点击查看代码
    for li in lis:
        try:
            date=li.select_one('h1').text #日期,h1标签
            weather=li.select_one('p.wea').text #天气状况,p.wea
            tem_p=li.select_one('p.tem') #温度,span标签
            tem_span=tem_p.select_one('span')  #白天温度
            tem_i=tem_p.select_one('i').text  #夜间温度
            temp=f"{tem_span.text}/{tem_i}" if tem_span else tem_i #拼接温度
            print(f"{date} {weather} {temp}")
运行结果:

2-1.3
2-1.4

Gitee文件夹链接:https://gitee.com/liuxuannn/data-acquistion-and-fusion-practice_-project1/blob/master/作业2/2.1.py
心得体会:
  温度数据拼接时要注意格式统一,避免因数据缺失导致报错。存储的数据库文件不能直接打开,数据库文件为二进制,故利用DB Browser连接文件再查看才不会乱码。

作业2:

要求–用requests和BeautifulSoup库方法定向爬取股票相关信息,并存储在数据库中。东方财富网:https://www.eastmoney.com/
输出信息:Gitee文件夹链接
核心代码设计逻辑:
  通过参数控制分页和返回字段,使用requests发送HTTP请求,从JSONP格式中提取纯JSON数据,将API返回的字段映射到数据库表字段,批量插入SQLite数据库,查询数据结果。

2-2.1
2-2.2

核心代码:
点击查看代码
#数据爬取函数
        response=requests.get(url)
        response.raise_for_status()
        json_data=response.text[response.text.find("{"):response.text.rfind("}") + 1]
        data=json.loads(json_data)
        if "data" in data and "diff" in data["data"]:
            return data["data"]["diff"]

#数据存储函数
def save_to_database(stock_list):
    conn=sqlite3.connect("stock_database.db")
    cursor=conn.cursor()
    #创建表
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS stock_info (...)
    ''')
    #插入数据
    for stock in stock_list:
        cursor.execute('''
            INSERT INTO stock_info VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ''', (stock.get("f12", ""), stock.get("f14", ""), ...))

    conn.commit()
运行结果:

2-2.3
2-2.4
2-2.5

Gitee文件夹链接:https://gitee.com/liuxuannn/data-acquistion-and-fusion-practice_-project1/blob/master/作业2/2.2.py
心得体会:
  直接json.loads()会报错,必须精确截取{到}之间的内容。有次漏了+1就少了个括号,解析一直失败。

作业3:

要求:–爬取中国大学2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)

所有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加入至博客中。

输出信息: Gitee文件夹链接
排名 学校 省市 类型 总分
1 清华大学 北京 综合 969.2
核心代码设计逻辑:
  通过直接下载包含原始数据的js文件,利用正则表达式提取其中的大学信息,并通过js文件最后部分的变量映射将压缩的变量名转换为可读的中文名称,再将结构化信息存储到SQLite数据库中。
核心代码:
点击查看代码
def crawl_university_ranking_from_js():
    js_url="https://www.shanghairanking.cn/_nuxt/static/1762223212/rankings/bcur/2021/payload.js"
    #发送HTTP请求获取JS文件
    req=urllib.request.Request(js_url)
    with urllib.request.urlopen(req) as response:
        js_content=response.read().decode('utf-8')
    #变量映射表
    variable_mapping={
        'e': '理工', 'f': '综合', 'g': '师范', 'h': '农业',
        'm': '林业', 'S': '医药',
        'q': '北京', 'D': '上海', 'x': '浙江', 'k': '江苏',
        # ... 更多映射
    }
    all_schools=[]
    #核心正则表达式匹配
    pattern = r'univNameCn:"([^"]+)".*?univCategory:([a-zA-Z0-9_$]+).*?province:([a-zA-Z0-9_$]+).*?score:([\d.]+)'
    matches = re.findall(pattern, js_content, re.DOTALL)
    #数据处理和转换
    for i, match in enumerate(matches, 1):
        school_name, category_var, province_var, score = match
        #变量名转换为实际意义
        province = variable_mapping.get(province_var, province_var)
        category = variable_mapping.get(category_var, category_var)
        #构建数据结构
        all_schools.append({
            '排名': str(i),
            '学校名称': school_name,
            '省市': province,
            '类型': category,
            '总分': score
        })
    return all_schools
运行结果:

2-3.1
2-3.2
2-3.3
2-3.4
2-3.5

Gitee文件夹链接:https://gitee.com/liuxuannn/data-acquistion-and-fusion-practice_-project1/blob/master/作业2/2.3.py
心得体会:
  进行网页分析的时候发现了包含数据源的js文件,但是文件里面的数据都会用变量压缩,所以又找了一遍,最后在文件最后发现了省份,学科等变量压缩之后的映射关系;因为本身爬取的就是排行榜,所以排行的变量找不到映射也没关系,直接用爬取文件顺序作为排行就可以了。
posted @ 2025-11-06 15:42  今天不想说话  阅读(22)  评论(0)    收藏  举报