数据工程实践:从网络抓取到API调用,解析共享单车所需要的数据

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 在本篇文章中,将解释网络抓取和APIs如何协同工作,从百科上抓取城市数据,利用APIs获取天气数据,从而推断出与共享单车相关的信息。

设想这样一个案例,当前共享单车应用广泛,在很多城市都有大量的投放,一方面解决了人们的短途快速出行问题,一方面对环境保护做出了贡献。但对于单车公司来说,如何确保单车投放在人们需要的地方?大量的共享单车聚集在市中心,且在雨雪等恶劣天气,人们又不会使用。


这正是数据工程师可以发挥作用的地方,利用他们的专业技术从互联网中提取和分析数据。


在本篇文章中,将解释网络抓取和APIs如何协同工作,从百科上抓取城市数据,利用APIs获取天气数据,从而推断出与共享单车相关的信息。


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


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


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


API的应用场景多种多样:


· 服务之间的通信:不同软件系统能够相互通信。


· 数据获取:API允许应用程序从服务器获取数据,为用户提供动态内容。


· 功能共享:它们还允许服务与其他应用程序共享其功能,比如地图集成到多个应用程序中的情况。


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


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


image.png

PixelBin,Lucidchart


在此关系图的起点,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获取天气数据、Python函数以及复杂数据易于理解的技巧。真正的项目开发中可能会包括对SQL数据库、AWS RDS和Lambda的深入研究,因此本文希望可以让读者明白理论知识和实际应用之间的差距。


声明:本文内容仅做技术学习交流使用。


参考原文与相关资料:


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

BeautifulSoup文档

Python教程

ScrapingBee博客


编译:幂简集成

相关文章
|
14天前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
39 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
18天前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
114 30
|
8天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
2天前
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
2天前
|
存储 监控 网络协议
一次读懂网络分层:应用层到物理层全解析
网络模型分为五层结构,从应用层到物理层逐层解析。应用层提供HTTP、SMTP、DNS等常见协议;传输层通过TCP和UDP确保数据可靠或高效传输;网络层利用IP和路由器实现跨网数据包路由;数据链路层通过MAC地址管理局域网设备;物理层负责比特流的物理传输。各层协同工作,使网络通信得以实现。
|
2天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
17 1
|
7天前
|
JSON 自然语言处理 Java
OpenAI API深度解析:参数、Token、计费与多种调用方式
随着人工智能技术的飞速发展,OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式,以及如何通过Rest API(以Postman为例)、Java API调用、工具调用等方式实现与OpenAI的交互,并特别关注调用具有视觉功能的GPT-4o使用本地图片的功能。此外,本文还将介绍JSON模式、可重现输出的seed机制、使用代码统计Token数量、开发控制台循环聊天,以及基于最大Token数量的消息列表限制和会话长度管理的控制台循环聊天。
48 7
|
13天前
|
供应链 搜索推荐 数据挖掘
1688搜索词推荐API接口:开发应用与收益全解析
在电商数据驱动时代,1688搜索词推荐API接口为开发者、供应商及电商从业者提供强大工具,优化业务流程,提升竞争力。该接口基于1688平台的海量数据,提供精准搜索词推荐,助力电商平台优化搜索体验,提高供应商商品曝光度与销售转化率,同时为企业提供市场分析与商业洞察,促进精准决策与成本降低。通过集成此API,各方可实现流量增长、销售额提升及运营优化,推动电商行业的创新发展。
25 0
|
19天前
|
监控 搜索推荐 测试技术
电商API的测试与用途:深度解析与实践
在电子商务蓬勃发展的今天,电商API成为连接电商平台、商家、消费者和第三方开发者的重要桥梁。本文深入探讨了电商API的核心功能,包括订单管理、商品管理、用户管理、支付管理和物流管理,并介绍了有效的测试技巧,如理解API文档、设计测试用例、搭建测试环境、自动化测试、压力测试、安全性测试等。文章还详细阐述了电商API的多样化用途,如商品信息获取、订单管理自动化、用户数据管理、库存同步、物流跟踪、支付处理、促销活动管理、评价管理、数据报告和分析、扩展平台功能及跨境电商等,旨在为开发者和电商平台提供有益的参考。
25 0
|
9天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
47 17

推荐镜像

更多