数据采集与融合技术第二次作业

Gitee地址:https://gitee.com/wang-zi-lian20031002/crawl_project

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

1、核心代码与效果图展示

  • 核心代码
url = "http://www.weather.com.cn/weather/" + self.cityCode[city] + ".shtml"
try:
    req = urllib.request.Request(url, headers=self.headers)
    data = urllib.request.urlopen(req)
    data = data.read()
    dammit = UnicodeDammit(data, ["utf-8", "gbk"])
    data = dammit.unicode_markup
    soup = BeautifulSoup(data, "lxml")
    lis = soup.select("ul[class='t clearfix'] li")
    x = 0
    for li in lis:
        try:
            date = li.select('h1')[0].text
            weather = li.select('p[class="wea"]')[0].text
            if x == 0:  # 为今天只有一个温度做判断 <i>14℃</i>
                x += 1
                temp = li.select('p[class="tem"] i')[0].text
            else:
                temp = li.select('p[class="tem"] span')[0].text + "/" + li.select('p[class="tem"] i')[0].text
            print(city, date, weather, temp)
            self.db.insert(city, date, weather, temp)
        except Exception as err:
            print(err)
except Exception as err:
    print(err)
  • 效果图展示

2、心得体会

这个程序利用递归函数来计算一个数的阶乘。递归是一种强大的编程方法,它通过函数自我调用简化了问题的解决方案。总的来说,这次编程练习不仅加深了我对递归理解,也提醒我在实际应用中要权衡不同的编程方法

二、用requests和BeautifulSoup库方法定向爬取股票相关信息,并存储在数据库中

1、核心代码与效果图展示

  • 核心代码
url = 'https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery112409840494931556277_1633338445629&pn=1&pz=10&po=1&np=1&fltt=2&invt=2&fid=f3&fs=b:MK0021&fields=f12,f14,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f18,f15,f16,f17,f23'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers)

# 去除不必要的字符,提取有效的JSON部分
response_text = response.text.split('(', 1)[1].rsplit(')', 1)[0]

stock_data = json.loads(response_text)['data']['diff']  # 解析JSON并提取有用的字段
return stock_data
# 打印每行数据
for row in rows:
    # 尝试将字段转换为浮点数,如果失败则使用0.0
    latest_price = float(row[3]) if row[3] not in ('-', None) else 0.0
    change_percent = float(row[4]) if row[4] not in ('-', None) else 0.0
    change_amount = float(row[5]) if row[5] not in ('-', None) else 0.0
    amplitude = float(row[8]) if row[8] not in ('-', None) else 0.0
    high = float(row[9]) if row[9] not in ('-', None) else 0.0
    low = float(row[10]) if row[10] not in ('-', None) else 0.0
    open_price = float(row[11]) if row[11] not in ('-', None) else 0.0
    yesterday_close = float(row[12]) if row[12] not in ('-', None) else 0.0

    print(f"{row[0]:<5} {row[1]:<10} {row[2]:<10} "
          f"{latest_price:<10.2f} {change_percent:<10.2f} {change_amount:<10.2f} "
          f"{row[6]:<10} {row[7]:<15} {amplitude:<10.2f} {high:<10.2f} "
          f"{low:<10.2f} {open_price:<10.2f} {yesterday_close:<10.2f}")
  • 效果图展示

2、心得体会

通过模拟获取股票数据的过程,我理解了API在实时数据获取中的重要性。这让我意识到在现代编程和数据科学领域,能够有效地从外部源获取数据是一项基本技能。这个练习让我更加熟悉了Python中json库的使用

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

1、核心代码与效果图展示

  • 核心代码
# 目标网址
url = "https://www.shanghairanking.cn/rankings/bcur/2021"

# 获取网页内容
response = urllib.request.urlopen(url)
web_content = response.read()

# 使用BeautifulSoup解析网页
soup = BeautifulSoup(web_content, 'html.parser')

# 查找包含排名信息的表格或元素
table = soup.find('table')  # 假设排名信息在一个表格里

# 连接到SQLite数据库(如果数据库不存在,会自动创建)
conn = sqlite3.connect('ranking_data.db')
cursor = conn.cursor()
for row in table.find_all('tr')[1:]:  # 跳过表头行
    cols = row.find_all('td')
    rank = cols[0].get_text(strip=True)
    school_name = cols[1].get_text(strip=True)
    province = cols[2].get_text(strip=True)
    school_type = cols[3].get_text(strip=True)
    score = cols[4].get_text(strip=True)
  • 效果图展示

2、心得体会

在这次实践中,我尝试使用Python的urllib.requestBeautifulSoup库来抓取一个网页上的排名信息,并将这些信息存储到SQLite数据库中。这个过程不仅让我对Python的网络爬虫和数据存储技术有了更深入的了解,也让我在实践中遇到了一些挑战,并从中获得了宝贵的经验和教训

posted @ 2024-10-16 17:16  lzwang  阅读(12)  评论(0编辑  收藏  举报