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

news2024/11/17 21:43:33

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

数据工程师在此过程中扮演关键角色,他们能通过挖掘多源数据,包括天气状况、节假日、工作日模式、特殊活动安排以及地理位置信息,来预测特定时间和地点的共享单车需求与停放空间需求。这一过程不仅涉及从网络抓取数据,如利用爬虫技术收集城市区域特征,还包括调用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 code
        population_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 = None

        data = {
            'City': [city],
            'Country': [country],
            'Latitude': [latitude],
            'Longitude': [longitude],
            'Population': [population],
        }

        city_df = pd.DataFrame(data)
        return city_df

    else:
        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 table
    if 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 requests
    import pandas as pd
    from datetime import datetime
    from keys import weather_key
    url = 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.coloradmin.cn/o/1665115.html

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

相关文章

【C语言】/*操作符(上)*/

目录 一、算数操作符:、-、*、/、% 1.1 和 - 1.2 * 1.3 / 1.4 % 二、赋值操作符: 和符合赋值 2.1 连续赋值 2.2 复合赋值(自操作) 三、单目操作符:、--、(正号)、-(负号) 3.1 和 -- 3.1.1 前置 3.1.2 后置 3.1.3 前置-- …

汽车EDI:安通林Antolin EDI 项目案例

安通林(Antolin)是一家全球性的汽车零部件制造商,专注于汽车内饰系统和零部件的生产,致力于创新和采用先进的技术。近年来 安通林Antolin 推动其供应商部署EDI系统,使得双方能够通过EDI传输业务单据,极大提…

IDEA使用技巧2—发布web项目

作者:私语茶馆 1.War包类型 发布Web项目有两种模式:war和war exploded, war模式:将WEB工程以包的形式上传到服务器 ;war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器; war ex…

java日历类概述

Java中的Calendar类位于java.util包下,它是一个抽象类,用于表示和管理日期及时间。Calendar类并不是直接实例化的,而是通过其提供的静态方法来获取实例。通常情况下,当你尝试创建一个Calendar实例时,实际上你得到的是G…

在 Navicat 17 中探索表配置文件

距离 Navicat 17(英文版)的发布还有不到一周的时间,现在是深入研究新的表配置文件功能的最佳时机。它允许我们保存经常用于表的筛选、排序和列显示的不同组合。所以,事不宜迟,让我们开始吧! 创建表配置文件…

LeetCode 106.从中序与后序遍历序列构造二叉树

LeetCode 106.从中序与后序遍历序列构造二叉树 1、题目 题目链接:106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并…

思维导图在线怎么制作?推荐这些工具

思维导图在线怎么制作?在如今的快节奏时代中,思维导图作为一种高效的信息组织与思考工具,受到了广泛的应用。在线制作思维导图成打破了时间和空间的限制,使得团队协作变得更加便捷,个人创作也更为灵活。以下是四款备受…

2024年生物医学、医学图像与信号处理国际会议(ICBMISP2024)

2024年生物医学、医学图像与信号处理国际会议(ICBMISP2024) 会议简介 2024年国际生物医学、医学成像和信号处理会议(ICBMISP2024)很高兴邀请您提交主题为“生物医学、医学图像和信号处理的当前挑战和未来前景”的原稿。通过ICBMISP2024,生物…

鸿蒙开发接口Ability框架:【DataAbilityHelper模块(JS端SDK接口)】

DataAbilityHelper模块(JS端SDK接口) 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 本模块接口仅可在FA模型下使用。 使用说明 使用前根据具体情况引入如下模块 import featureAbility from …

i春秋-Backdoor

题目 考点 git源码泄露 Linux文件恢复 代码审计 http 解题 参考wp https://blog.csdn.net/cbhjerry/article/details/105791056https://www.pianshen.com/article/19461342501/扫描 题目给出提示:敏感文件泄漏 于是使用dirsearch扫一下 python dirsearch.py -…

ASP.NET一个简单的媒体播放器的设计与实现

摘 要 本论文所描述的播放器是在Microsoft Visual Studio .NET 2003平台下利用Visual Basic.NET语言完成的。使用Visual Basic.NET提供的Windows Media Player控件以及文件处理,最终实现一款别致的,贴近用户操作习惯的媒体播放器。 该播放器实现了对WAV…

原子学习笔记4——GPIO 应用编程

一、应用层如何操控 GPIO 与 LED 设备一样,GPIO 同样也是通过 sysfs 方式进行操控,进入到/sys/class/gpio 目录下,如下所示: gpiochipX:当前 SoC 所包含的 GPIO 控制器,我们知道 I.MX6UL/I.MX6ULL 一共包…

设计模式——行为型模式——策略模式(含实际业务使用示例、可拷贝直接运行)

目录 策略模式 定义 组成和UML图 代码示例 实际业务场景下策略模式的使用 策略模式优缺点 使用场景 JDK中使用策略模式示例 参考文档 策略模式 定义 策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化…

PC端与bluetooth蓝牙虚拟串口通信

应该采用RFCOMM虚拟串口方式来进行通信,原理跟socket通信类似,不同的是使用的通信协议不同,本人结合相关的API,做了以下最简单的封装。 1、获取本地蓝牙设备与附近蓝牙设备信息 2、通信类 /* 通信类:只是对于客户端通…

Live800:企业营销利用利用社区建设培养忠诚粉丝

社区建设是一种与顾客建立长期关系的活动,在社区中顾客可以在有限的时间和空间里,与企业的营销人员进行互动。通过企业提供的各种资源,例如产品、服务、促销活动、信息等,吸引顾客参与社区建设。与顾客建立长期关系,从…

【碳化硅】陷阱(traps)对SiC MOSFET阈值电压漂移的影响

这篇文章是关于硅碳化物(SiC)金属氧化物半导体场效应晶体管(MOSFET)的阈值电压漂移问题的研究。文章的主要目的是通过研究不同的陷阱(traps)对阈值电压漂移的影响,来解决SiC MOSFET的可靠性问题。 摘要(Abstract) 文章提出了一种研究方法,用于分析影响SiC MOSFET阈值…

【练习4】

1.两数之和 暴力&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int n nums.size();vector<int> res(2, -1); // 初始化结果为-1for (int i 0; i < n; i) {int temp nums[i];for (int j i 1; j <…

vivado Spartan-7 配置存储器器件

下表所示闪存器件支持通过 Vivado 软件对 Spartan -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、空白检查、编程和验证。赛灵…

用python写个控制MicroSIP自动拨号和定时呼叫功能(可用在小型酒店叫醒服务)MicroSIP定时拨号

首先直接上结果吧&#xff0c;MicroSIP 助手&#xff0c;控制MicroSIP自动拨号&#xff0c;定时呼叫的非常实用小工具&#xff01; 在使用MicroSIP 助手之前&#xff0c;我们需要了解MicroSIP是什么&#xff0c;MicroSIP是一个SIP拨号软件&#xff0c;支持注册任意SIP平台实现拨…

独家原创 | BiTCN-BiGRU-CrossAttention融合时空特征的高创新预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…