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


核心代码:
点击查看代码
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}")
运行结果:


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数据库,查询数据结果。


核心代码:
点击查看代码
#数据爬取函数
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()
运行结果:



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['总分']))
运行结果:





浙公网安备 33010602011771号