数据采集作业2

课程链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology
作业链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13285
作业1码云链接 https://gitee.com/wd_b/party-soldier-data-collection/tree/master/作业2/作业2-1
作业2码云链接 https://gitee.com/wd_b/party-soldier-data-collection/tree/master/作业2/作业2-2
作业3码云链接 https://gitee.com/wd_b/party-soldier-data-collection/tree/master/作业2/作业2-3
学号姓名 102202157 王党兵

作业1

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

点击查看代码
import requests
from bs4 import BeautifulSoup
import sqlite3
import os
# 创建数据库连接
db_name = 'weather_forecast.db'
conn = sqlite3.connect(db_name)
c = conn.cursor()
# 创建天气表
c.execute('''
    CREATE TABLE IF NOT EXISTS weather_forecast (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        city TEXT,
        date TEXT,
        weather TEXT,
        temp_high TEXT,
        temp_low TEXT,
        wind TEXT
    )
''')
# 爬取天气数据的函数
def get_weather_forecast(city_code, city_name):
    url = f"http://www.weather.com.cn/weather/{city_code}.shtml"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"}
    response = requests.get(url, headers=headers)
    response.encoding = 'utf-8'
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        # 查找7日天气预报信息
        seven_day_forecast = soup.find('ul', class_="t clearfix").find_all('li')
        weather_data = []
        for day in seven_day_forecast:
            date = day.find('h1').text  # 日期
            weather = day.find('p', class_="wea").text  # 天气情况
            temp_high = day.find('p', class_="tem").find('span').text if day.find('p', class_="tem").find(
                'span') else ''  # 最高温度
            temp_low = day.find('p', class_="tem").find('i').text  # 最低温度
            wind = day.find('p', class_="win").find('span')['title']  # 风力
            weather_data.append((city_name, date, weather, temp_high, temp_low, wind)
        # 插入数据到数据库
        c.executemany('''
            INSERT INTO weather_forecast (city, date, weather, temp_high, temp_low, wind) 
            VALUES (?, ?, ?, ?, ?, ?)
        ''', weather_data)
        conn.commit()
        print(f"{city_name}的7日天气数据已成功保存。")
    else:
        print(f"无法获取{city_name}的天气数据,状态码: {response.status_code}")
# 你可以在这里添加多个城市的代码
cities = {
    "北京": "101010100",
    "上海": "101020100",
    "广州": "101280101",
    "深圳": "101280601"
}
# 遍历城市并爬取天气数据
for city_name, city_code in cities.items():
    get_weather_forecast(city_code, city_name)
# 关闭数据库连接
conn.close()
# 确认数据库文件已生成
if os.path.exists(db_name):
    print(f"数据库文件 '{db_name}' 已成功创建。")

效果截图

2.心得体会
1.技术挑战与成长
在完成这个作业的过程中,我遇到了不少技术挑战,也从中获得了极大的成长。
从网页爬取数据是一个全新的领域。通过使用requests库发送 HTTP 请求,我学会了如何与外部网站进行交互并获取所需的信息。同时,BeautifulSoup库的运用让我能够解析复杂的 HTML 页面结构,精准地提取出 7 日天气预报的关键数据,如日期、天气情况、温度和风力等。这个过程锻炼了我的数据提取和处理能力,让我更加熟悉网页结构和数据抓取的技巧。
数据库操作也是一个重要的环节。使用sqlite3库创建数据库和表,并将爬取到的天气数据存储其中,让我深入了解了数据库的设计和操作。从创建表结构到执行插入语句,每一个步骤都需要仔细考虑数据的完整性和准确性。通过这个作业,我不仅掌握了基本的数据库操作技能,还学会了如何有效地管理和存储数据。
2.问题解决与思考
在作业过程中,也遇到了一些问题,这些问题促使我进行深入的思考和探索。
例如,在爬取网页数据时,可能会遇到网络连接不稳定、页面结构变化或者反爬机制等问题。为了解决这些问题,我需要不断地调整代码,添加错误处理机制,以确保程序的稳定性和可靠性。同时,在数据库操作中,也可能会出现插入数据失败、数据重复等问题,这需要我仔细检查 SQL 语句的正确性,并考虑数据的唯一性和完整性。
通过解决这些问题,我学会了如何分析问题、寻找解决方案,并在实践中不断优化代码。这种问题解决的能力将对我今后的学习和工作产生积极的影响。

作业2

1.数据采集实验
要求:用 requests 和 BeautifulSoup 库方法定向爬取股票相关信息,并存储在数据库中。
候选网站:东方财富网:https://www.eastmoney.com/ 新浪股票:http://finance.sina.com.cn/stock/
示例代码

点击查看代码
import requests
import sqlite3
import json
import os
# 创建数据库连接
db_name = 'stock_data.db'
conn = sqlite3.connect(db_name)
c = conn.cursor()
# 创建股票数据表
c.execute('''
    CREATE TABLE IF NOT EXISTS stock_data (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        stock_code TEXT,
        stock_name TEXT,
        current_price REAL,
        change_percent REAL,
        change_amount REAL
    )
''')
# 东方财富网的股票数据API
url = "http://push2.eastmoney.com/api/qt/clist/get"
params = {
    "pn": "1",  # 页数
    "pz": "20",  # 每页显示股票数目
    "po": "1",
    "np": "1",
    "ut": "bd1d9ddb04089700cf9c27f6f7426281",
    "fltt": "2",
    "invt": "2",
    "fid": "f3",
    "fs": "m:0+t:6",  # 市场和类别
    "fields": "f1,f2,f3,f4,f12,f14"
}
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
# 发送请求并获取响应
response = requests.get(url, params=params, headers=headers)
data = response.json()
# 解析返回的JSON数据
if data and data['data']:
    stock_list = data['data']['diff']
    # 准备插入的数据
    stock_data = []
    for stock in stock_list:
        stock_code = stock['f12']  # 股票代码
        stock_name = stock['f14']  # 股票名称
        current_price = stock['f2']  # 当前价格
        change_percent = stock['f3']  # 涨跌幅
        change_amount = stock['f4']  # 涨跌额
        stock_data.append((stock_code, stock_name, current_price, change_percent, change_amount))
    # 插入数据到数据库
    c.executemany('''
        INSERT INTO stock_data (stock_code, stock_name, current_price, change_percent, change_amount) 
        VALUES (?, ?, ?, ?, ?)
    ''', stock_data)
    conn.commit()
    print("股票数据已成功保存到数据库。")
# 关闭数据库连接
conn.close()
# 确认数据库文件已生成
if os.path.exists(db_name):
    print(f"数据库文件 '{db_name}' 已成功创建。")

效果截图

2.心得体会
1.技术探索与挑战
在这个任务中,我深入探索了网页爬取和数据存储的技术领域。选择使用requests和BeautifulSoup库进行股票信息的定向爬取,既充满了挑战,也带来了许多收获。
通过谷歌浏览器的 F12 调试模式进行抓包是关键的一步。在这个过程中,我需要仔细分析股票列表加载所使用的 URL 以及 API 返回的值。这要求我对网络请求和响应有更深入的理解,学会解读各种参数的含义和作用。例如,根据 URL 中参数f1和f2的不同取值,可以获取不同的股票信息,这需要我根据实际需求进行适当的调整和删减请求参数。这个过程锻炼了我的数据分析和问题解决能力。
2.BeautifulSoup 的强大之处
BeautifulSoup库在解析 HTML 页面方面表现出了强大的功能。它能够轻松地从复杂的网页结构中提取出所需的股票信息。通过选择合适的标签和属性,我可以准确地定位到股票代码、名称、价格等关键数据。这个过程让我更加熟悉 HTML 结构和 CSS 选择器的使用,提高了我的数据提取技巧。
3.数据库存储的重要性
将爬取到的股票信息存储在数据库中,为数据的管理和后续分析提供了便利。通过使用sqlite3库,我能够创建数据库表,并将提取的股票数据插入其中。这不仅保证了数据的持久性,还方便了后续的查询和分析操作。同时,我也学会了如何设计合理的数据库表结构,以确保数据的完整性和一致性。
4.问题解决与优化
在爬取过程中,我遇到了一些问题,如网络连接不稳定、页面结构变化等。为了解决这些问题,我采取了多种措施。例如,添加错误处理机制,以应对网络请求失败的情况;定期检查页面结构的变化,及时调整数据提取的方法。此外,我还考虑了性能优化的问题,如合理设置请求间隔,避免对目标网站造成过大的负担。

作业3

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

点击查看代码
import requests
import re
import sqlite3
class DB:
    #创建空的schoolrank.db
    def open(self):
        self.connection=sqlite3.Connection('school.db')
        self.cursor=self.connection.cursor()
        try:
            self.cursor.execute(
                'create table schoolrank(排行 Integer primary key autoincrement,学校 vachar(16),省市 vachar(16),类型 vachar(16),总分 real)'
            )
        except:
            self.cursor.execute('delete from schoolrank')
    #关闭weather.db
    def close(self):
        self.connection.commit()
        self.cursor.close()
    #插入数据
    def insert(self,name,province,cata,score):
        self.cursor.execute(
            'insert into schoolrank(学校,省市,类型,总分) values(?,?,?,?)',(name,province,cata,score)
        )
url=r'https://www.shanghairanking.cn/_nuxt/static/1728872418/rankings/bcur/2021/payload.js'
req=requests.get(url)
req.raise_for_status()
req.encoding=req.apparent_encoding
data=req.text
func_data_key=data[len('__NUXT_JSONP__("/rankings/bcur/2021", (function('):data.find(')')].split(',')
print(data)
#正则获取univerCn,province,univerCategory,score
univerCnlist=re.findall('univNameCn:"(.*?)",',data)
provincelist=re.findall('province:(.*?),',data)
univerCategorylist=re.findall('univCategory:(.*?),',data)
scorelist=re.findall('score:(.*?),',data)
print(univerCnlist)
print(len(univerCnlist))

#获取func_data_value为[vlaue,value,....]
func_data_value=data[data.rfind('(')+1:-4].split(',')
#将二者配对
cnt=0
mydict={}
for key in func_data_key:
    value=func_data_value[cnt]
    mydict[key]=value
    cnt+=1
#提取其中有用的信息
name=univerCnlist
province=[]
for item in provincelist:
    province.append(mydict[item])
cate=[]
for item in univerCategorylist:
    cate.append(mydict[item])
print(len(univerCnlist))
print(len(province))
print(len(scorelist))
db=DB()
db.open()
for i in range(len(name)):
    db.insert(name[i],province[i],cate[i],scorelist[i])
db.close()

效果截图

抓包截图

2.心得体会
1.网页爬取技能提升
通过这个任务,更加熟练地掌握了使用requests库发送 HTTP 请求来获取网页内容。学会了处理各种请求状态码,确保能够准确地获取到目标网页的数据。同时,也了解到如何设置请求头和处理编码问题,以提高爬取的成功率和数据的准确性。
深入理解了正则表达式在网页数据提取中的强大作用。能够根据网页内容的特定格式,编写合适的正则表达式来精确地提取所需的大学信息,如学校名称、省份、类别和分数等。这一过程提高了对正则表达式语法和匹配规则的掌握程度。
2.数据库操作能力增强
学会了使用sqlite3库来创建和操作 SQLite 数据库。能够熟练地创建数据库表、插入数据以及进行事务处理,确保数据的完整性和一致性。通过这个任务,对数据库的基本操作有了更深入的理解,为以后处理更复杂的数据存储需求打下了基础。
3.问题解决能力锻炼
在任务过程中,遇到了各种问题,如数据提取不准确、数据库插入失败、网页结构变化等。通过不断地调试和分析,学会了使用打印错误信息、检查变量值等方法来快速定位问题所在,并采取相应的解决措施。这一过程提高了问题解决的能力和应对突发情况的能力。
4.对数据价值的认识
存储在数据库中的大学信息为进一步的数据分析提供了基础。可以通过对这些数据进行统计分析,了解大学排名的分布情况、不同省份的教育实力对比、各类大学的特点等。这有助于深入挖掘数据背后的价值,为教育研究和决策提供有力支持。

posted @ 2024-10-17 16:23  布若  阅读(19)  评论(0编辑  收藏  举报