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

news/2024/10/24 20:53:57

作业①:7日天气预报爬取

1. 作业代码与实现步骤

我们将在中国气象网爬取北京、上海、广州的7日天气预报,并将数据保存到数据库中。以下是实现步骤。

步骤详解

  1. 打开中国天气网:在浏览器中访问中国天气网。

  2. 搜索城市:输入“北京”并打开其天气页面。

  3. 检查网页结构:使用浏览器的开发者工具(按F12)查看网页的HTML结构。

    • 每天天气信息存放在一个ul元素的li元素中。
    • 日期在li下的h1元素中。
    • 天气状态在li下的class为'wea'p元素文本中。
    • 温度信息在class为'tem'下的p元素中的spani元素中。
  4. 获取城市编码:北京的城市编码为101010100,据此我们再分别获得上海和广州的城市编码,我们将其存储在字典中,以便构造URL使用。

  5. 使用BeautifulSoup进行数据爬取:使用CSS选择器查找HTML元素并提取信息。

代码示例

# 给定城市集的城市ID列表(北京、上海、广州)
cities = {"北京": "101010100","上海": "101020100","广州": "101280101"
}# 爬取每个城市的7日天气数据
for city_name, city_id in cities.items():url = f"http://www.weather.com.cn/weather/{city_id}.shtml"try:headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}req = urllib.request.Request(url, headers=headers)data = urllib.request.urlopen(req)data = data.read()dammit = UnicodeDammit(data, ["utf-8", "gbk"])data = dammit.unicode_markupsoup = BeautifulSoup(data, "lxml")# 获取7天天气预报信息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_high = li.select('p[class="tem"] span')[0].text if li.select('p[class="tem"] span') else "N/A"temp_low = li.select('p[class="tem"] i')[0].texttemperature = temp_high + "/" + temp_low  # 获取温度(高温/低温)# 打印天气信息print(f"{city_name} - {date}: {weather}, {temperature}")# 将数据插入数据库c.execute("INSERT INTO weather (city, date, weather, temperature) VALUES (%s, %s, %s, %s)",(city_name, date, weather, temperature))conn.commit()# 关闭数据库连接
conn.close()print("所有城市的天气数据已保存到数据库!")

图片展示

打印结果

数据库结果

2. 作业心得

在这个作业中,我深入了解了如何从网页中提取结构化数据。通过分析HTML结构,我能够高效地使用CSS选择器定位所需信息,并将其存储在数据库中。此外,学习到城市编码的管理,使我能够灵活处理不同城市的天气数据。这些知识对我今后的学习与实践都大有裨益。


作业②:股票信息爬取

1. 作业代码与实现步骤

接下来,我们将使用requests和BeautifulSoup库爬取东方财富网的股票相关信息,并将其存储到数据库中。

步骤详解

  1. 选择股票信息网站:以东方财富网为例,访问 东方财富网。
  2. 分析网页结构:打开开发者工具(F12),观察股票列表的加载情况。
  3. 查找数据API:通过网络请求(Network)标签,寻找股票数据的API地址,并分析请求返回的数据格式。
  4. 提取url,获取单页数据:直接通过requests库的get就可以直接加载数据,对应的文件数据如下。通过分析,我们可以得到单只股票的数据都以字符串的形式被存放在“data”下面,而且控制翻页的参数主要是p参数,所以只要用一个page变量来替代页码,构造新的URL,再通过for循环就能实现提取多页数据。

代码示例

def get_html(cmd, page):url = f"https://7.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112409467675731682619_1703939377395&pn={page}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid={cmd}&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1703939377396"response = requests.get(url, headers=header)data = response.textleft_data = re.search(r'^.*?(?=\()', data).group()  # Extracting the callback function namedata = re.sub(left_data + '\(', '', data)  # Removing the callback function namedata = re.sub('\);', '', data)  # Removing the endingdata = eval(data)  # Evaluating the string as a Python expressionreturn datacmd = {"沪深京A股": "f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048",
}null = "null"
for market, command in cmd.items():page = 0stocks = []while True:page += 1data = get_html(command, page)if data['data'] != null:print(f"正在爬取 {market} 第 {page} 页")df = data['data']['diff']for index in df:# 处理数据,确保插入时不出错#插入的数据会有“-”的出现latest_price = float(index['f2']) if index['f2'] != '-' else None change_rate = float(index['f3']) if index['f3'] != '-' else Nonechange_amount = float(index['f4']) if index['f4'] != '-' else Nonevolume = float(index['f5']) if index['f5'] != '-' else Noneamount = float(index['f6']) if index['f6'] != '-' else Noneamplitude = float(index['f7']) if index['f7'] != '-' else Nonehighest = float(index['f15']) if index['f15'] != '-' else Nonelowest = float(index['f16']) if index['f16'] != '-' else Noneopen_price = float(index['f17']) if index['f17'] != '-' else Noneclose_price = float(index['f18']) if index['f18'] != '-' else Nonevolume_ratio = index['f10'] if index['f10'] != '-' else Noneturnover_rate = float(index['f8']) if index['f8'] != '-' else Nonepe_ratio = index['f9'] if index['f9'] != '-' else Nonepb_ratio = index['f23'] if index['f23'] != '-' else Nonestock_dict = {"代码": index["f12"],"名称": index['f14'],"最新价": latest_price,"涨跌幅": change_rate,"涨跌额": change_amount,"成交量(手)": volume,"成交额": amount,"振幅(%)": amplitude,"最高": highest,"最低": lowest,"今开": open_price,"昨收": close_price,"量比": volume_ratio,"换手率": turnover_rate,"市盈率(动态)": pe_ratio,"市净率": pb_ratio,}stocks.append(stock_dict)# 将数据插入数据库c.execute("INSERT INTO stocks (code, name, latest_price, change_rate, change_amount, volume, amount, amplitude, highest, lowest, open, close, volume_ratio, turnover_rate, pe_ratio, pb_ratio) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",(index["f12"], index['f14'], latest_price, change_rate, change_amount, volume, amount, amplitude,highest, lowest, open_price, close_price, volume_ratio, turnover_rate, pe_ratio, pb_ratio))conn.commit()else:break# 关闭数据库连接
conn.close()print("所有股票数据已保存到数据库!")

图片展示

打印结果

数据库结果

2. 作业心得

通过爬取股票信息,我更加熟悉了网络数据的获取和处理过程。在分析网页结构和API请求时,我掌握了如何有效提取和存储数据。这不仅增强了我的编程能力,还让我对金融数据的实时更新有了更深的理解。


作业③:中国大学2021主榜爬取

1. 作业代码与实现步骤

最后,我们将爬取中国大学2021主榜的所有院校信息,并将其存储到数据库中。

步骤详解

  1. 访问目标网站:前往 中国大学2021主榜。

  2. 检查网页结构:使用F12打开开发者工具,分析表格结构。

  3. 循环遍历提取:使用BeautifulSoup提取排名、学校名称、所在城市、类型和总分。

  4. 存储数据:将提取的数据保存到MySQL数据库中。

代码示例

def printUnivList(ulist, html, num):data = json.loads(html)  # 对数据进行解码# 提取 数据 rankings 包含的内容content = data['data']['rankings']# 把学校的相关信息放到 ulist 里面for i in range(num):index = content[i]['rankOverall']  # 排名name = content[i]['univNameCn']  # 学校名称province = content[i]['province']  # 省市score = content[i]['score']  # 总分category = content[i]['univCategory']  # 类型ulist.append([index, name, province, score, category])# 将数据插入数据库c.execute("INSERT INTO university_ranking (`rank`, name, province, score, category) VALUES (%s, %s, %s, %s, %s)",(index, name, province, score, category))conn.commit()# 打印前 num 名的大学tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}\t{4:^10}\t{5:^10}"  # {1:{3}^10} 中的 {3} 代表取第三个参数print(tplt.format("排名", "学校名称", "省市", chr(12288), "总分", "类型"))  # chr(12288) 代表中文空格for i in range(num):u = ulist[i]print(tplt.format(u[0], u[1], u[2], chr(12288), u[3], u[4]))  # chr(12288) 代表中文空格def main():uinfo = []url = 'https://www.shanghairanking.cn/api/pub/v1/bcur?bcur_type=11&year=2020'html = getHTMLText(url)  # 获取大学排名内容printUnivList(uinfo, html, 30)  # 输出排名前30的大学内容main()# 关闭数据库连接
conn.close()

图片展示

打印结果

数据库结果

2. 作业心得

通过爬取中国大学的排名信息,我对数据的结构化处理有了更深入的理解。整个过程让我认识到数据获取和整理的重要性,并掌握了如何有效地将这些数据存储到数据库中。记录调试过程也让我对每一步的操作有了直观的了解,这为我后续的学习奠定了良好的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/75618.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

clickhouse安装部署使用

一、安装 下载地址https://packages.clickhouse.com/rpm/stable/上传文件到Linux中开始安装1、进入到文件所在目录cd /usr/local/soft/clickhouse-rpms/2、使用rpm命令安装sudo rpm -ivh *.rpm3、查看状态systemctl status clickhouse-server4、启动服务systemctl start clickh…

拦截器和过滤器的区别

在软件开发中,拦截器(Interceptors)和过滤器(Filters)是两种常用的用于处理请求和响应的机制,但它们在功能、使用场景和实现方式上有着明显的区别。主要区别有:1.设计模式和工作原理;2.实现方式和配置;3.功能和使用场景;4.控制流程和灵活性;5.性能和效率;6.选择和应…

Clickhouse的安装

一、官网下载 下载地址: https://packages.clickhouse.com/rpm/stable/ 一共需要下载这下面四个 注:一个页面没有的需要点击next进入下一个界面二、下载之后使用Xterminal打开所需要建立连接的虚拟机出现如下界面之后说明连接成功三、创建一个自己的文件夹,将先前下好的rpm文…

Oracle 排序

在Oracle中,使用 ORDER BY 语法按字符串进行排序 ASC或DESC关键字:指定升序或降序排序,默认情况下,排序是升序的。 NULLS FIRST 或 NULLS LAST 关键字:指定对空值的处理方式,默认情况下,空值排在最后。 -- 按升序排序,空值排在最后 SELECT column_name FROM table_name…

代码随想录算法训练营第24天(补第12天)| 递归遍历,迭代遍历,统一迭代

前置知识 二叉树的定义: struct BNode{int val;BNode* lchild;BNode* rchild;BNode():lchild(NULL),rchild(NULL){}BNode(int val){val=val;lchild=rchild=NULL;} };递归遍历文章链接:https://programmercarl.com/二叉树的递归遍历.html#思路 题目链接:https://leetcode.cn/…

20222403 2024-2025-1 《网络与系统攻防技术》实验三实验报告

1. 实验内容 1.1.实践内容 (1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程(2)通过组合应用各种技术实现恶意代码免杀 如果成功实现了免杀的,简单语…

Camunda中的Execution listeners和Task listeners

在Camunda中大多数节点元素都可以设置执行监听器(Execution listeners),例如事件、顺序流、用户任务、服务任务和网关。其中用户任务除了可以设置执行监听器,还可以设置独有的用户任务监听器,相比于执行监听器,用户任务监听器可以设置更加细粒度的事件类型。 下面针对执行…

AMD Ryzen 5700X黑苹果运行Docker和Virtualization(虚拟化)

最近把我的AMD Ryzen黑苹果系统升级到Sequoia 15.01 发现virtualbox不能用了,遂重新分区又安装了一个Sonoma 14.7AMD Ryzen Run Virtualization展示 Virtualization Limit系统要求: BigSur <= 当前运行系统版本 <= Sonoma 虚拟化软件: virtualbox 6.1.50 安全要求:关…