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

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

总仓库链接
(每题后面附带具体的两个链接)

作业1:

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

代码和结果

思路:
设计数据库,用于存储爬取的天气预报数据。这个模型包括城市、日期、天气状况和温度等字段。

class WeatherDB:
    def __init__(self):
        self.con = sqlite3.connect("weathers.db")
        self.cursor = self.con.cursor()
        self.cursor.execute(
            "CREATE TABLE weathers (wCity VARCHAR(16), wDate VARCHAR(16), Weather VARCHAR(64), wTemp VARCHAR(32), PRIMARY KEY (wCity, wDate))")

编写爬虫

try:
            req = urllib.request.Request(url, headers=self.headers)
            data = urllib.request.urlopen(req).read()
            dammit = UnicodeDammit(data, ["utf-8", "gbk"])
            data = dammit.unicode_markup
            soup = BeautifulSoup(data, "lxml")
            lis = soup.select("ul[class='t clearfix'] li")
            for li in lis:
                try:
                    date = li.select('h1')[0].text
                    weather = li.select('p[class="wea"]')[0].text
                    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)

运行结果:

代码地址

运行结果地址

心得体会:

通过这次作业,我不仅学会了如何使用Python进行网页爬取和数据提取,还学会了如何设计数据库此外,遇到的问题是我想下载navicat以方便查看数据库但是没有找到可行的破解版。

作业2

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

代码和结果

思路:
先进行抓包

设计数据库模型
根据API返回的数据结构,我设计了一个SQLite数据库模型,包括股票的ID、名称、价格、涨跌幅、成交量等字段。这些字段能够全面地描述一只股票的基本信息。

class EquityMarketDB:
    def openDB(self):
        self.con = sqlite3.connect("equity_market.db")
        self.cursor = self.con.cursor()
        try:
            self.cursor.execute(
                "CREATE TABLE IF NOT EXISTS equity (
                    sID VARCHAR(16), 
                    sName VARCHAR(64), 
                    sPrice VARCHAR(16),
                    sRFExtent VARCHAR(16),
                    sRFQuota VARCHAR(16),
                    sNum VARCHAR(16),
                    sQuota VARCHAR(16),
                    sExtent VARCHAR(16),
                    sHigh VARCHAR(16),
                    sLow VARCHAR(16),
                    sToday VARCHAR(16),
                    sYesterday VARCHAR(16),
                    PRIMARY KEY (sID, sName)
                )"
            )
        except Exception as e:
            print(f"Error creating table: {e}")

编写爬虫逻辑,我使用了requests库来发送HTTP请求,获取API返回的数据。然后,使用re模块中的正则表达式来解析这些数据,提取出所需的信息。

def getHTMLText(url, loginheaders):
    try:
        r = requests.get(url, headers=loginheaders, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except Exception as e:
        print(f"Error fetching data from {url}: {e}")
        return ""

运行结果:

代码地址

运行结果地址

心得体会:

加深了我对抓包的理解,现在能比较快地找到所需要的url,学习了使用正则表达式解析数据,以及如何设计和操作SQLite数据库

作业3:

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

代码和结果

抓包

编写爬虫逻辑

def fetch_data(self, url):
    print("正在获取数据...")
    response = requests.get(url)
    if response.status_code != 200:
        print("Failed to retrieve data")
        return ""
    print("数据获取成功")
    return response.text

我使用了正则表达式来匹配和提取大学排名的关键信息。

def parse_data(self, text):
    print("正在解析数据...")
    matches = re.findall(r'"Rank"\s*:\s*(\d+),\s*"Name"\s*:\s*"(.*?)",\s*"Province"\s*:\s*"(.*?)",\s*"Score"\s*:\s*(\d+\.\d+)', text)
    universities = [(int(match[0]), match[1], match[2], float(match[3])) for match in matches]
    print(f"解析完成,共找到 {len(universities)} 条数据")
    return universities

运行结果

代码地址

运行结果地址

心得体会:

发现没有打印出数据的情况,将已创建好的数据库删掉后就出现了,应该是不能覆盖,加深了我对数据库的处理

posted on 2024-10-15 19:42  102202107  阅读(26)  评论(0编辑  收藏  举报