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
核心代码设计逻辑:
  通过定位网页中的排名表格,逐行提取每个大学的排名、名称、省市、类型和总分数据,经过正则表达式清洗校名后,将结构化信息存储到SQLite数据库中。
核心代码:
点击查看代码
#表格定位
ranking_table = parser.find('table', class_='rk-table')

#数据提取循环
for row in ranking_table.find_all('tr')[1:]:
    cells = row.find_all('td')
    rank_num = cells[0].text.strip()
    full_name = cells[1].get_text(strip=True, separator=" ")
    chinese_name = re.findall(r'[\u4e00-\u9fa5]+', full_name)
    school_name = ''.join(chinese_name)

#数据存储
cursor.execute('''
    INSERT OR IGNORE INTO university_2021 
    (ranking, school_name, province, school_type, total_score)
    VALUES (?, ?, ?, ?, ?)
''', (item['排名'], item['学校名称'], item['省市'], item['类型'], item['总分']))
运行结果:

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

Gitee文件夹链接:https://gitee.com/liuxuannn/data-acquistion-and-fusion-practice_-project1/blob/master/作业2/2.3.py
心得体会:
  一开始用find_all('tr')遍历所有行,结果把表头也当数据解析了,导致数据库插入报错。后来加上[1:]从第二行开始才跳过表头,这个问题 让我知道了网页解析时不能想当然地认为所有都是数据行,一定要考虑表头、表尾这些边界情况。
posted @ 2025-11-06 15:41  今天不想说话  阅读(13)  评论(0)    收藏  举报