【csdn】数据工程实践:从网络抓取到API调用,解析共享单车精准投放所需要的数据

共享单车作为一种便捷的出行方式,有效缓解了“最后一公里”难题,同时促进了绿色出行。然而,在高峰时段,供需不均和停车难成为普遍挑战,尤其是在通勤时间,热门地点如地铁站附近和办公区常常面临车辆短缺或停车位紧张的问题。为解决这一矛盾,借助数据分析与智能调度系统显得尤为重要。

数据工程师在此过程中扮演关键角色,他们能通过挖掘多源数据,包括天气状况、节假日、工作日模式、特殊活动安排以及地理位置信息,来预测特定时间和地点的共享单车需求与停放空间需求。这一过程不仅涉及从网络抓取数据,如利用爬虫技术收集城市区域特征,还包括调用API接口获取实时天气数据,综合分析这些因素对共享单车使用行为的影响,从而实现更精准的车辆投放与调度策略。

本文将以共享单车调度与天气因素的关联为例,深入探讨如何结合网络数据抓取技术和API应用,从百科网站抓取城市基础数据,并利用气象API实时获取天气信息,以此为基础推导出共享单车运营的优化方案,确保在用户需求最旺盛的时刻和地点,实现共享单车资源的高效配置,同时优化停放管理,提升用户体验。

网络抓取与API调用:数据工程的工具箱

网络抓取是一种数字化的信息检索方式,它类似于在网络上获取数据的智能助手。想象一下,我们在杂志中寻找与人工智能、机器学习、网络安全等相关的信息,而不是手动记录这些词汇,我们可以使用网络抓取工具,例如 Python 爬虫工具 BeautifulSoup ,能够快速、高效地完成这项任务。

API 是软件应用程序间相互交互的规则和协议集合,它们在软件背后扮演着重要角色,实现了应用程序间无缝集成和数据共享。这就像餐馆的菜单,提供了可选择的菜品清单和详细描述,用户点菜就如同发出数据请求,而厨房则为之准备菜品。在这个类比中,API 就是菜单,而订单则是对数据的请求。

API 的应用场景多种多样:

  • 服务之间的通信:不同软件系统能够相互通信。
  • 数据获取:API 允许应用程序从服务器获取数据,为用户提供动态内容。
  • 功能共享:它们还允许服务与其他应用程序共享其功能,比如地图集成到多个应用程序中的情况。

这些 API 之于软件的重要性不言而喻,它们促成了跨应用程序的交互和数据共享,为用户提供了更加丰富和便捷的体验。相比之下,网页抓取则是一种从网页中提取信息的方式,通常是将网页内容转化成可用的数据格式。虽然两者都涉及数据的获取和处理,但 API 更多地关注于应用程序间的交互和数据共享,而网页抓取则更专注于从网页中提取信息。

下图中展示了使用 GET 请求的客户端和 API 服务器之间的基本交互。理解这个过程对于了解数据在 Web 应用程序中的交换和利用至关重要。

image-2.png

在此关系图的起点,API 服务器充当中介。它接收 GET 请求,对其进行处理,并根据请求的参数确定适当的响应。
GET 请求表示来自客户端(如网站或应用程序)向 API 服务器请求特定数据的查询,在请求之后,图中显示了服务器的响应。首先,发出响应代码,例如 200 表示成功,404 表示未找到。然后,返回响应数据,其中包含客户端请求的信息。

由此可以看出,API 与网页抓取的主要区别在于它们访问数据的方式:

  • API 是访问数据的官方渠道。这就像有一张 VIP 通行证可以进入一场音乐会,在那里你可以直接获得某些信息。
  • 另一方面,网络抓取就像坐在观众席上,记下正在播放的歌曲的歌词。这是一种无需使用官方 API 即可从网站提取数据的方法。

回到最开始提到的案例中。

城市信息可以从多个途径获取。一种方法是从官方统计等渠道的网站下载 CSV 文件。但要注意的是,城市信息可能会变动频繁,但网站更新的频率无法保障。

另一个方法是使用百科的数据。大量的用户在定期更新这些信息,所以只需要专注于选择正确的数据。

接下来,以使用 BeautifulSoup 进行网络抓取为案例。目标是什么?提取关键细节,例如名称、纬度、经度和人口数量,两个充满活力的城市:AAA 和 XXX。

此处作者使用的是 Jupyter Notebook 开发环境,对于交互式编程和数据可视化非常出色。当然,其他工具如 Atom、Visual Studio Code 或 IntelliJ IDEA 也有自己的优势。

分步Python指南:抓取数据实践

首先,让我们看一下用于推断 AAA 和 XXX 数据的代码。在本节中,将介绍构成项目骨干的 Python 库。

import requests

我们的第一个工具是 requests 库。这是互联网的关键——它帮助我们向网站发送 HTTP 请求。

from bs4 import BeautifulSoup

接下来,我们从 bs4 包中介绍 BeautifulSoup 。一旦我们有了目标网页,BeautifulSoup 就会解析 HTML 内容。

import pandas as pd

接下来是 pandas,这是数据科学中不可或缺的库。我们可以将抓取的数据转换为可读的表格,非常适合分析和可视化。

Python 中另一个常用的模块是 re 模块。它是一个用于处理正则表达式的库。

import reheaders = {'Accept-Language': 'en-US,en;q=0.8'}

第一步是准备 Python 环境来接收来自web的数据。我们使用 requests 库来做到这一点,通过将“Accept-Language”设置为英语来确保我们的请求被普遍理解。

接下来,确定城市的 URL -AAA。这个 URL 将成为我们获取丰富信息的门户:

url_aaa = "https://en.wikipedia.org/wiki/aaa"
aaa = requests.get(url_aaa, headers=headers)

发送请求后,检查请求是否成功是至关重要的。状态码为 200 表示连接成功。

aaa.status_code # Should return 200

现在使用 BeautifulSoup 解析 AAA 的网页,将 HTML 内容转换为我们可以使用的格式。

soup_aaa = BeautifulSoup(aaa.content, "html.parser")

当提取特定数据时,就可以获得我们想要的结果:

  • 检索到城市名称和国家,指向我们的研究主题
  • 经纬度给了我们地理坐标
  • 从人口数量可以看出城市的规模

下面是如何仔细检索这些细节的流程:

A_city = soup_aaa.select(".mw-page-title-main")[0].get_text()
A_country = soup_aaa.select('a[href="/wiki/CCC"]')[0].get_text()
A_latitude = soup_aaa.select(".latitude")[0].get_text()
A_longitude = soup_aaa.select(".longitude")[0].get_text()
A_population = soup_aaa.select('td.infobox-data')[10].get_text()

在成功抓取 AAA 的数据后,我们将注意力转向 XXX,使用相同的技术提取其城市名称、人口、纬度和经度。
和前面一样,使用 BeautifulSoup 解析 XXX 的百科页面,收集必要的数据并创建一个 DataFrame。

data = {"City": [FR_city, BR_city],"Population": [FR_population, BR_population],"Latitude": [FR_latitude, BR_latitude],"Longitude": [FR_longitude, BR_longitude],"Country": [FR_country, BR_country]
}df = pd.DataFrame(data)

接下来,我们通过微调来优化 DataFrame 以获得更好的可读性和准确性,以确保我们的数据干净且易于理解。

df['Population'] = pd.to_numeric(df['Population'], errors='coerce')
df['Latitude'] = pd.to_numeric(df['Latitude'], errors='coerce')
df['Longitude'] = pd.to_numeric(df['Longitude'], errors='coerce')
df['City'] = df['City'].astype(str)
# Display the DataFrame
print(df.head)

如果您的目标是在编码过程中获得高水平的舒适性和准确性,并且您有兴趣将方法改进到完美,那么这里有一段利用函数的 Python 代码。这种方法不仅简化了过程,而且提高了代码的可读性和可重用性。

def scrape_city_data(url):response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.content, "html.parser")city = soup.title.get_text().split(' - ')[0]country = soup.select('td.infobox-data a')[0].get_text()latitude = soup.select('span.latitude')[0].get_text()longitude = soup.select('span.longitude')[0].get_text()# Find the population data using provided codepopulation_element = soup.select_one('th.infobox-header:-soup-contains("Population")')if population_element:population = population_element.parent.find_next_sibling().find(string=re.compile(r'\d+'))if population:population = int(population)else:population = Nonedata = {'City': [city],'Country': [country],'Latitude': [latitude],'Longitude': [longitude],'Population': [population],}city_df = pd.DataFrame(data)return city_dfelse:print("Error:", response.status_code)return None# List of German cities ( herre you can add more cities)
german_cities = ['Berlin', 'Frankfurt']# Create an empty DataFrame with specified columns
german_cities_df = pd.DataFrame(columns=['City', 'Country', 'Latitude', 'Longitude', 'Population'])# Iterate and scrape data for German cities
for city_name in german_cities:wiki_link = f"https://en.wikipedia.org/wiki/{city_name}"city_data = scrape_city_data(wiki_link)# Append the data to the tableif city_data is not None:german_cities_df = pd.concat([german_cities_df, city_data], ignore_index=True)# Display the DataFrame
print(german_cities_df)

通过专业的天气预报 API 来获取数据

有了地理位置,接下来看下影响共享单车的另一个方面——天气。这部分我们采用调用
天气 API 的方式来获取数据。

下面是我们准备的 Python 函数。这个简洁的代码片段展示了如何以精炼的方式实现强大的功能,无缝地融合了技术性与易用性之间的隔阂。

def fetch_weather_data(API_key, city):import requestsimport pandas as pdfrom datetime import datetimefrom keys import weather_keyurl = f"http://api.openweathermap.org/data/2.5/forecast?q={city}&appid={API_key}&units=metric"response = requests.get(url)if response.status_code == 200:weather_json = response.json()if "list" in weather_json:temperature = weather_json["list"][0]["main"]["temp"]description = weather_json["list"][0]['weather'][0]['description']feels_like = weather_json["list"][0]["main"].get("feels_like")wind_speed = weather_json["list"][0]["wind"].get("speed")return pd.DataFrame({"city": [city],"forecast_time": [datetime.now()],"outlook": [description],"temperature": [temperature],"feels_like": [feels_like],"wind_speed": [wind_speed]})else:print("Unexpected response format: 'list' key not found.")else:print(f"Failed to fetch data for {city}. Status Code: {response.status_code}")return pd.DataFrame()cities = ["Berlin", "Frankfurt"]
API_key = weather_key  # Replace with your actual API key
weather_df = pd.DataFrame()for city in cities:city_weather_df = fetch_weather_data(API_key, city)if not city_weather_df.empty:weather_df = weather_df.append(city_weather_df, ignore_index=True)

为什么这很重要?

这个 DataFrame 不仅仅是天气数据的集合,而是 Python 在将原始数据转换为有意义的见解方面的强大功能。作为一个工具,可以帮助城市居民、旅行者或任何人根据实时天气状况做出决定。

总结

本文介绍了数据工程实践中的网络抓取和API调用,以及如何使用这些技术获取共享单车所需的数据。文章首先解释了API和网页抓取的区别,然后介绍了使用Python的BeautifulSoup进行网络抓取的步骤,并提供了抓取城市数据的代码示例。接着,文章介绍了如何使用API获取天气数据,并提供了使用Python获取天气数据的代码示例。最后,文章强调了数据清洗和转换的重要性,并提供了使用pandas对数据进行处理和可视化的技巧。
声明:本文内容仅做技术学习交流使用。

参考原文及相关资料:

  • 网页抓取和 API:放轻松,这就是数据工程生活方式 |由 Ornela Maloku |2023 年 12 月 |AWS 提示 (awstip.com)
  • BeautifulSoup文档
  • Python教程
  • ScrapingBee博客

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【程序设计和c语言-谭浩强配套】(适合专升本、考研)

一晃大半年没更新了,这一年一直在备考,想着这几天把前段时间学的c语言给大家分享一下,在此做了一个专栏,有需要的小伙伴可私信获取o。 简介:本专栏所有内容皆适合专升本、考研的复习资料,本人手上也有日常…

C# WinForm —— 13 ComboBox下拉框/组合框介绍

1. 简介 ComboBox 是由 textBox 和 listBox 组合而成的,只能选择一项,不能选择多项,其他功能和 listBox类似 ComboBox 下拉框的三种样式:(通过 DropDownStyle属性 设置) Simple: 最简单的样式&#xff0c…

联合有爱,光照未来

随着社会的进步和人们生活水平的提高,越来越多的家庭开始关注儿童的成长和教育。然而,仍有部分地区的儿童因资源匮乏、经济困难等原因,面临着生活和学习上的种种挑战。为了传递社会的温暖和关爱,改善有实际困难的学校及学生的学习…

Win32 API

Win32 API Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形…

【免费Java系列】大家好 ,今天是学习面向对象高级的第十一天点赞收藏关注,持续更新作品 !

这是java进阶课面向对象第一天的课程可以坐传送去学习http://t.csdnimg.cn/Lq3io day11-特殊文件、日志技术、多线程 一、属性文件 1.1 特殊文件概述 同学们,前面我们学习了IO流,我们知道IO流是用来读、写文件中的数据。但是我们接触到的文件都是普通…

QT 小项目:登录注册账号和忘记密码(下一章实现远程登录)

一、环境搭建 参考上一章环境 二、项目工程目录 三、主要源程序如下: registeraccountwindow.cpp 窗口初始化: void registeraccountWindow::reginit() {//去掉?号this->setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButt…

初识指针(4)<C语言>

前言 前面的文章,已经对指针的基础概念以及运用有了初步了解,我们可以进一步探究指针比较深入的知识,下文将主要介绍:使用指针数组模拟二维数组、字符指针变量、数组指针、二维数组传参的本质、函数指针、typedef关键字等。 目录…

怎么让电脑耳机和音响都有声音

电脑耳机音响不能同时用没声音怎么办 一般来说,重新开机后问题能够得到解决。右击“我的电脑”---“属性”---“硬件”---“设备管理器”,打开“声音、视频和游戏控制器”有无问题,即看前面有没有出现黄色的“”。 如果您的 电脑 耳机能正常…

【MsSQL】数据库基础 库的基本操作

目录 一,数据库基础 1,什么是数据库 2,主流的数据库 3,连接服务器 4,服务器,数据库,表关系 5,使用案例 二,库的操作 1,创建数据库 2,创建…

数据结构与算法学习笔记六-二叉树的顺序存储表示法和实现(C语言)

目录 前言 1.数组和结构体相关的一些知识 1.数组 2.结构体数组 3.递归遍历数组 2.二叉树的顺序存储表示法和实现 1.定义 2.初始化 3.先序遍历二叉树 4.中序遍历二叉树 5.后序遍历二叉树 6.完整代码 前言 二叉树的非递归的表示和实现。 1.数组和结构体相关的一些知…

PyQt5中的组件

文章目录 1. 简介2. QCheckBox3. QPushButton4. QSlider5. QProgressBar6. QCalendarWidget7. QPixmap8. QLineEdit9. QSplitter10. QComboBox11. 总结 1. 简介 在PyQt5中,有许多不同类型的组件,可以用于构建各种GUI界面。以下是一些常见的PyQt5组件&am…

NSSCTF中的web学习(md5())

目录 MD5的学习 [BJDCTF 2020]easy_md5 [LitCTF 2023]Follow me and hack me [LitCTF 2023]Ping [SWPUCTF 2021 新生赛]easyupload3.0 [NSSCTF 2022 Spring Recruit]babyphp MD5的学习 md5()函数: md5($a):返回a字符串的散列值 md5($a,TRUE)&…