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

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

码云链接:2022级数据采集与融合技术 - 码云 (gitee.com)


作业①:

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

·输出信息: Gitee 文件夹链接


(1)实验过程

通过F12寻找相关信息

部分代码:

定义了名为 WeatherDB 的类,管理 weathers.db数据库。

class WeatherDB:
    def openDB(self):
        self.con=sqlite3.connect("weathers.db")
        self.cursor=self.con.cursor()
        try:
            self.cursor.execute("create table weathers (wCity varchar(16),wDate varchar(16),wWeather varchar(64),wTemp varchar(32),constraint pk_weather primary key (wCity,wDate))")
        except:
            self.cursor.execute("delete from weathers")

    def closeDB(self):
        self.con.commit()
        self.con.close()


    def insert(self, city, date, weather, temp):
        try:
            self.cursor.execute("insert into weathers (wCity,wDate,wWeather,wTemp) values (?,?,?,?)",
                                (city, date, weather, temp))
        except Exception as err:
            print(err)

    def show(self):
        self.cursor.execute("select * from weathers")
        rows = self.cursor.fetchall()
        print("%-16s%-16s%-32s%-16s" % ("city", "date", "weather", "temp"))
        for row in rows:
            print("%-16s%-16s%-32s%-16s" % (row[0], row[1], row[2], row[3]))

定义 WeatherForecast 类,用于从特定城市的天气网站抓取未来几天的天气预报,并将这些信息存储到数据库中,最后输出数据库中的所有天气记录。

class WeatherForecast:
    def __init__(self):
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
        self.cityCode = {"北京": "101010100", "上海": "101020100", "广州": "101280101", "深圳": "101280601","福州":"101230101"}

    def forecastCity(self, city):
        if city not in self.cityCode.keys():
            print(city + " code cannot be found")
            return
        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")

            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)

    def process(self, cities):
        self.db = WeatherDB()
        self.db.openDB()

        for city in cities:
            self.forecastCity(city)

        print("\n")
        print("开始输出数据库:\n")

        self.db.show()
        self.db.closeDB()

ws = WeatherForecast()
ws.process(["北京", "上海", "广州", "深圳","福州"])
print("completed")
print("输出数据库完成")

输出结果:


(2)心得体会

作业①:中国气象网7日天气预报数据采集与数据库存储

通过这次作业,我学会了如何利用Python的requests和BeautifulSoup库来爬取中国气象网的7日天气预报数据。在这个过程中,我学会了如何分析和处理HTML页面结构此外,我还熟练掌握了SQLite数据库的基本操作,包括创建表、插入数据和查询数据。通过实际操作,我对数据库的工作原理有了更深入的理解


作业②:

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

·候选网站:东方财富网:https://www.eastmoney.com/ 新浪股票:http://finance.sina.com.cn/stock/

·技巧:在谷歌浏览器中进入F12调试模式进行抓包,查找股票列表加 载使用的url,并分析api返回的值,并根据所要求的参数可适当更改 api 的请求参数。根据URL可观察请求的参数f1、f2可获取不同的数值,根据情况可删减请求的参数。

·参考链接:https://zhuanlan.zhihu.com/p/50099084

·输出信息: Gitee 文件夹链接


(1)实验过程

通过F12抓包结果:

部分代码:

从指定的 URL 获取股票数据,解析这些数据,并将解析出的数据插入到数据库中。

def getData(url, gupiao, db):
    response = requests.get(url)
    database = []
    daima = re.findall('f12":"(.*?)",', response.text)
    name = re.findall('f14":"(.*?)",', response.text)
    newprice = re.findall('f2":(.*?),', response.text)
    diezhanfu = re.findall('f4":(.*?),', response.text)
    diezhane = re.findall('f3":(.*?),', response.text)
    cjl = re.findall('f5":(.*?),', response.text)
    cje = re.findall('f6":(.*?),', response.text)
    zf = re.findall('f7":(.*?),', response.text)
    zg = re.findall('f15":(.*?),', response.text)
    zd = re.findall('f16":(.*?),', response.text)
    jk = re.findall('f17":(.*?),', response.text)
    zs = re.findall('f18":(.*?),', response.text)
    for i in range(0, len(zs)):
        data = []
        data.append(str(i+1))
        data.append(name[i])
        data.append(daima[i])
        data.append(newprice[i])
        data.append(diezhanfu[i])
        data.append(diezhane[i])
        data.append(cjl[i])
        data.append(cje[i])
        data.append(zf[i])
        data.append(zg[i])
        data.append(zd[i])
        data.append(jk[i])
        data.append(zs[i])
        database.append(data)
        db.insert(i+1, daima[i], name[i], newprice[i], diezhanfu[i], diezhane[i], cjl[i], cje[i], zf[i], zg[i], zd[i], jk[i], zs[i])
    print("已保存数据到数据库")

输出结果:

(2)心得体会

作业②:东方财富网股票信息定向爬取与数据库存储

在完成这个作业的过程中,我深入学习了如何使用requests库和正则表达式来爬取东方财富网上的股票信息。这个任务让我更加熟悉了HTTP请求的过程,以及如何处理和解析JSON数据。我还学会了如何使用F12开发者工具进行网页抓包,这对于我来说是一个全新的技能。通过这个项目,我对网络请求和响应的处理有了更深入的了解,并且提高了我的问题解决能力。同时,我也加深了对数据库存储机制的理解,特别是在设计数据库结构和优化查询性能方面。


作业③:

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

·技巧:分析该网站的发包情况,分析获取数据的api

·输出信息: Gitee 文件夹链接

排名 学校 省市 类型 总分

1 清华大学 北京 综合 969.2

(1)实验过程

通过F12抓包


部分代码:

部分数据使用字母代替,也需要把数据爬取出来,一一对应。


定义 parse_data 的方法,解析包含大学信息的文本数据,并提取出各个大学的名称、分数、类别和省份等信息。具体实现步骤:

  1. 使用正则表达式 re.findall 从输入的文本 text 中提取大学名称(name)、分数(score)、类别(category)和省份(province)。
  2. 同样使用正则表达式提取出 code_name,这是一段包含编码的字符串,用于映射省份、类别和分数的索引。
  3. 再次使用正则表达式提取出 value_name,这是一段包含实际省份、类别名称和分数的字符串。
  4. 初始化一个空列表 universities,用于存储解析后的大学信息。
  5. 遍历提取出的大学名称列表,对于每个大学:
    • 使用 code_name.index(province[i]) 获取省份的索引,并用它从 value_name 中获取对应的省份名称。
    • 同样方法获取类别名称。
    • 尝试将分数 score[i] 转换为浮点数。如果转换失败(即分数是字符串形式的非数字内容),则尝试从 value_name 中获取对应的分数,并再次尝试转换为浮点数。
  6. 将每个大学的信息(排名、名称、省份、类别和分数)作为一个元组添加到 universities 列表中。
  7. 返回包含所有大学信息的 universities 列表。
    def parse_data(self, text):
        name = re.findall(',univNameCn:"(.*?)",', text)
        score = re.findall(',score:(.*?),', text)
        category = re.findall(',univCategory:(.*?),', text)
        province = re.findall(',province:(.*?),', text)
        
        code_name = re.findall('function(.*?){', text)
        start_code = code_name[0].find('a')
        end_code = code_name[0].find('pJ')
        code_name = code_name[0][start_code:end_code].split(',')

        value_name = re.findall('mutations:(.*?);', text)
        start_value = value_name[0].find('(')
        end_value = value_name[0].find(')')
        value_name = value_name[0][start_value+1:end_value].split(",")

        universities = []
        for i in range(len(name)):
            province_name = value_name[code_name.index(province[i])][1:-1]
            category_name = value_name[code_name.index(category[i])][1:-1]
            # 尝试将成绩转换为浮点数,如果失败则保留原字符串
            try:
                score_value = float(score[i])
            except ValueError:
                score_value = score[i]
                score_value = value_name[code_name.index(score[i])].strip().strip('"').strip("'")
                score_value = float(score[i])

            universities.append((i+1, name[i], province_name, category_name, score_value))
        return universities

输出结果:

(2)心得体会

作业③:中国大学排名信息爬取与数据库存储

这个作业让我学会了如何爬取复杂网站上的数据,并且处理了数据中的编码问题。我使用了Python的requests库来发送网络请求,并利用正则表达式来解析返回的JavaScript代码。这个过程中,我学会了如何分析网站的API请求,并从中提取有用的数据。此外,我还掌握了如何处理和存储大量数据到SQLite数据库中,通过这个项目,我不仅提高了我的编程能力,还增强了我的数据分析和处理能力。同时,我面临了一个特别的挑战:部分数据使用字母代替,这要求我在爬取数据时必须更加细致和精确。这个任务教会了我如何识别和处理非结构化数据,以及如何确保数据的完整性和准确性。对F12开发者工具进行网页抓包的过程更加熟练,通常都是通过对应页面的文字来确定js文件。

posted on 2024-10-16 11:07  耶~  阅读(22)  评论(0编辑  收藏  举报