数据采集第二次作业

作业①:爬取并保存指定城市的7日天气预报

代码与展示

import requests
from bs4 import BeautifulSoup
import sqlite3
import os

def create_database(db_name):
    """
    创建SQLite数据库并建立天气预报表
    """
    db_connection = sqlite3.connect(db_name)
    db_cursor = db_connection.cursor()
    # 创建表格
    db_cursor.execute('''
        CREATE TABLE IF NOT EXISTS WeatherForecast (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            city TEXT,
            date TEXT,
            weather TEXT,
            temperature TEXT
        )
    ''')
    db_connection.commit()
    return db_connection, db_cursor

def fetch_weather_data(city_code, city_name):
    """
    获取指定城市的7日天气预报
    """
    url = f"http://www.weather.com.cn/weather/{city_code}.shtml"
    headers = {
        "User-Agent": "Mozilla/5.0"
    }
    response = requests.get(url, headers=headers)
    response.encoding = 'utf-8'
    soup = BeautifulSoup(response.text, "html.parser")
    forecast_list = soup.find('ul', class_='t clearfix')
    weather_data = []
    if forecast_list:
        days = forecast_list.find_all('li')
        for day in days:
            date = day.find('h1').get_text()
            weather_desc = day.find('p', class_='wea').get_text()
            temp_high = day.find('p', class_='tem').find('span')
            temp_high = temp_high.get_text() if temp_high else ''
            temp_low = day.find('p', class_='tem').find('i').get_text()
            temperature = f"{temp_high}/{temp_low}"
            weather_data.append({
                'city': city_name,
                'date': date,
                'weather': weather_desc,
                'temperature': temperature
            })
    return weather_data

def save_weather_data(db_cursor, weather_list):
    """
    将天气数据保存到数据库中
    """
    for weather in weather_list:
        db_cursor.execute('''
            INSERT INTO WeatherForecast (city, date, weather, temperature)
            VALUES (?, ?, ?, ?)
        ''', (weather['city'], weather['date'], weather['weather'], weather['temperature']))

if __name__ == "__main__":
    database_name = 'weather_data.db'
    if not os.path.exists(database_name):
        connection, cursor = create_database(database_name)
    else:
        connection = sqlite3.connect(database_name)
        cursor = connection.cursor()
    cities = [
        {'code': '101230101', 'name': '福州'},
        # 可以在这里添加更多城市
    ]
    for city in cities:
        city_code = city['code']
        city_name = city['name']
        weather_info = fetch_weather_data(city_code, city_name)
        save_weather_data(cursor, weather_info)
        for info in weather_info:
            print(f"城市: {info['city']}, 日期: {info['date']}, 天气: {info['weather']}, 温度: {info['temperature']}")
    connection.commit()
    connection.close()

运行结果:

Gitee文件夹链接:
https://gitee.com/lan-minlong/crawl_project_2024/tree/master/作业2

作业心得

在这个作业中,我学习了如何使用 requestsBeautifulSoup 库从中国气象网获取指定城市的天气预报,并将数据存储到 SQLite 数据库中。

  • 网页解析: 使用 BeautifulSoup 提取网页中的天气信息,包括日期、天气状况和温度。
  • 数据存储: 通过 sqlite3 库创建本地数据库,实现数据的持久化存储。
  • 代码规范: 注意了代码的模块化和函数封装,增强了代码的可读性和维护性。

作业②:爬取股票信息并存储到数据库

代码与展示

import requests
import pandas as pd
import json
import sqlite3

def get_stock_info(page_number):
    """
    爬取指定页码的股票信息
    """
    base_url = "http://44.push2.eastmoney.com/api/qt/clist/get"
    params = {
        'cb': 'jQuery112406854618710877052_1696660618066',
        'pn': page_number,
        'pz': 20,
        'po': 1,
        'np': 1,
        'ut': 'bd1d9ddb04089700cf9c27f6f7426281',
        'fltt': 2,
        'invt': 2,
        'wbp2u': '|0|0|0|web',
        'fid': 'f3',
        'fs': 'm:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048',
        'fields': 'f2,f3,f4,f5,f6,f7,f12,f14',
        '_': '1696660618067'
    }
    response = requests.get(base_url, params=params)
    content = response.text
    start_index = content.find('(') + 1
    end_index = content.rfind(')')
    json_str = content[start_index:end_index]
    data_json = json.loads(json_str)
    stock_items = data_json['data']['diff']
    stock_list = []
    for idx, item in enumerate(stock_items):
        stock_info = [
            idx + 1,
            item['f12'],
            item['f14'],
            item['f2'],
            item['f3'],
            item['f4'],
            item['f5'],
            item['f6'],
            item['f7']
        ]
        stock_list.append(stock_info)
    return stock_list

def store_data_to_db(stock_data):
    """
    将股票数据存储到SQLite数据库
    """
    connection = sqlite3.connect('stock_info.db')
    cursor = connection.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS stock_data (
            序号 INTEGER,
            代码 TEXT,
            名称 TEXT,
            最新价 REAL,
            涨跌幅 REAL,
            涨跌额 REAL,
            成交量 INTEGER,
            成交额 REAL,
            振幅 REAL
        )
    ''')
    cursor.executemany('INSERT INTO stock_data VALUES (?,?,?,?,?,?,?,?,?)', stock_data)
    connection.commit()
    connection.close()

def main():
    """
    主函数,执行数据获取和存储操作
    """
    total_stock_data = []
    page_input = int(input("请输入要爬取的页数:"))
    for page in range(1, page_input + 1):
        page_stock_data = get_stock_info(page)
        total_stock_data.extend(page_stock_data)
    store_data_to_db(total_stock_data)
    df = pd.DataFrame(total_stock_data, columns=['序号','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额','振幅'])
    print(df)

if __name__ == "__main__":
    main()

运行结果:


Gitee文件夹链接:
https://gitee.com/lan-minlong/crawl_project_2024/tree/master/作业2

作业心得

通过这个作业,我学会了如何使用 requests 库结合浏览器的开发者工具来分析网络请求,从而获取动态加载的数据。

  • 接口分析: 利用浏览器的 F12 开发者工具,抓取网络请求,找到数据接口。
  • 数据解析: 处理返回的 JSONP 格式数据,提取出有效的 JSON 内容。
  • 数据存储: 使用 sqlite3 将获取的股票信息保存到本地数据库中,方便后续的数据分析。

作业③:爬取中国大学2021主榜并存储到数据库

代码与展示

import requests
from bs4 import BeautifulSoup
import sqlite3
import re

def get_html_content(url):
    """
    获取指定URL的HTML内容
    """
    response = requests.get(url)
    response.raise_for_status()
    response.encoding = response.apparent_encoding
    return response.text

def parse_university_info(html_text):
    """
    解析HTML内容,提取大学信息列表
    """
    soup = BeautifulSoup(html_text, "html.parser")
    university_list = []
    tbody = soup.find('tbody')
    rows = tbody.find_all('tr')
    for row in rows:
        columns = row.find_all('td')
        rank = columns[0].text.strip()
        name_tag = columns[1].find('a')
        if name_tag:
            name = name_tag.text.strip()
        else:
            name = columns[1].text.strip()
        labels_to_remove = ['双一流', '985工程', '211工程', '985', '211']
        for label in labels_to_remove:
            name = name.replace(label, '')
        name = re.sub(r'[A-Za-z]', '', name)
        name = re.sub(r'[^\u4e00-\u9fa5]', '', name)
        province = columns[2].text.strip()
        category = columns[3].text.strip()
        score = columns[4].text.strip()
        university_list.append([rank, name, province, category, score])
    return university_list

def save_to_database(data_list):
    """
    将大学信息存储到SQLite数据库中
    """
    conn = sqlite3.connect('university_rankings.db')
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS UniversityRanking (
            Rank TEXT,
            Name TEXT,
            Province TEXT,
            Category TEXT,
            Score TEXT
        )
    ''')
    cursor.executemany('INSERT INTO UniversityRanking VALUES (?,?,?,?,?)', data_list)
    conn.commit()
    conn.close()

def display_university_list(universities, count):
    """
    打印大学信息列表
    """
    template = "{0:^6}\t{1:{5}<20}\t{2:^6}\t{3:^8}\t{4:^6}"
    print(template.format("排名", "学校", "省份", "类型", "总分", chr(12288)))
    for i in range(count):
        uni = universities[i]
        print(template.format(uni[0], uni[1], uni[2], uni[3], uni[4], chr(12288)))

def main():
    """
    主函数,执行数据获取、解析、存储和显示操作
    """
    url = "https://www.shanghairanking.cn/rankings/bcur/2021"
    html_content = get_html_content(url)
    university_data = parse_university_info(html_content)
    save_to_database(university_data)
    display_university_list(university_data, 10)

if __name__ == '__main__':
    main()

F12调试分析过程:

运行结果:


Gitee文件夹链接:
https://gitee.com/lan-minlong/crawl_project_2024/tree/master/作业2

作业心得

在这个作业中,我掌握了以下技能:

  • 动态分析: 使用浏览器的 F12 开发者工具,分析网页的网络请求,了解数据是如何加载的。
  • 数据清洗: 通过正则表达式和字符串处理,清洗爬取的数据,去除不必要的字符和标签。
  • 数据持久化: 将整理后的大学排名数据保存到 SQLite 数据库中,方便日后的查询和分析。
posted @ 2024-10-17 20:57  LEML  阅读(13)  评论(0编辑  收藏  举报