Cách lấy dữ liệu thời tiết trực tiếp bằng Python

Sự đơn giản và dễ thích ứng của Python giúp nó trở nên phổ biến trong những năm qua. Bạn có thể dễ dàng truy xuất dữ liệu hữu ích từ internet với Python. Sau đó, bạn có thể dùng những dữ liệu ấy để tăng cường cho một ứng dụng thực tế.

Trong bài viết này, bạn sẽ được học cách tìm dữ liệu thời tiết theo thời gian thực bằng cách sử dụng API và web scraping. Bạn có thể sử dụng dữ liệu đã được tìm nạp này để phát triển một ứng dụng thời tiết đơn giản.

Lấy thông tin thời tiết hiện tại của một thành phố bằng web scraping

Web scraping là quá trình trích xuất dữ liệu và nội dung từ một trang web. Tự động tìm nạp dữ liệu từ web mở ra rất nhiều trường hợp sử dụng. Tuy nhiên, hầu hết dữ liệu này đều ở định dạng HTML, bạn cần phải phân tích cú pháp và kiểm tra để trích xuất dữ liệu có liên quan.

Với tính năng web scraping, bạn có thể trích xuất dữ liệu thời tiết trực tiếp của bất kỳ thành phố nào. Thư viện BeautifulSoup của Python là thư viện cần dùng cho viết lấy dữ liệu ra khỏi các tệp HTML và XML. Bạn cần cài thư viện BeautifulSoup Python qua pip để bắt đầu quá trình scraping. Chạy lệnh sau trong terminal để cài BeautifulSoup và các thư viện yêu cầu:

pip install beautifulsoup4 requests

Sau khi đã cài xong các thư viện yêu cầu, bạn bắt đầu bằng cách nhập chúng vào code của bạn:

from bs4 import BeautifulSoup
import requests

Tiếp theo, bạn cần cung cấp chi tiết header để client và server có thể chuyển thông tin bổ sung với một yêu cầu hoặc phản hồi HTTP:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

Tạo một hàm là find_weather() để thực hiện một truy vấn tới Google bằng phương thức request.get(). Bạn sẽ sử dụng công cụ tìm kiếm để biết thời tiết của một thành phố sau đó thu thập dữ liệu có ý nghĩa để có được vị trí, nhiệt độ, thời gian và mô tả thời tiết. Sau đó, sử dụng BeautifulSoup để phân tích cú pháp HTML phản hồi nhận được:

def find_weather(city_name):
   city_name = city_name.replace(" ", "+")
 
   try:
       res = requests.get(
           f'https://www.google.com/search?q={city_name}&oq={city_name}&aqs=chrome.0.35i39l2j0l4j46j69i60.6128j1j7&sourceid=chrome&ie=UTF-8', headers=headers)
      
       print("Loading...")
 
       soup = BeautifulSoup(res.text, 'html.parser')
       location = soup.select('#wob_loc')[0].getText().strip()
       time = soup.select('#wob_dts')[0].getText().strip()
       info = soup.select('#wob_dc')[0].getText().strip()
       temperature = soup.select('#wob_tm')[0].getText().strip()
 
       print("Location: " + location)
       print("Temperature: " + temperature + "°C")
       print("Time: " + time)
       print("Weather Description: " + info)
   except:
       print("Please enter a valid city name")

Để trích xuất các ID phần tử, hãy tìm kiếm trên Google và xem nguồn trang trong trình duyệt của bạn bằng công cụ web. Bạn cần kiểm tra phần tử để tìm ID của phẩn từ HTML mà bạn muốn trích xuất dữ liệu:

Bạn cần kiểm tra phần tử để tìm ID của phẩn từ HTML mà bạn muốn trích xuất dữ liệu

Tiếp theo, chuyển các ID này vào phương thức select(). Phương thức này chạy một bộ chọn CSS dựa trên tài liệu được phân tích cú pháp và trả về tất cả các phần tử phủ hợp. Phương thức getText() trích xuất văn bản từ phần tử HTML. Phương thức strip() xóa mọi ký tự khoảng trắng ở đầu và cuối khỏi văn bản. Sau khi trích xuất một giá trị rõ ràng, bạn có thể lưu trữ giá trị đó trong một biến.

Cuối cùng, yêu cầu người dùng nhập thành phố và chuyển thành phố đó vào hàm find_weather():

city_name = input("Enter City Name: ")
city_name = city_name + " weather"
find_weather(city_name)

Bây giờ, khi bạn chạy code, nó sẽ nhắc bạn nhập tên một thành phố. Bạn phải nhập đúng tên thành phố mới cho ra kết quả đúng, nếu không code sẽ hiển thị thông báo lỗi.

Bạn phải nhập đúng tên thành phố mới cho ra kết quả đúng

Lấy thông tin thời tiết hiện tại của một thành phố bằng API OpenWeatherMap

OpenWeatherMap là một dịch vụ trực tuyến thuộc sở hữu của OpenWeather Ltd. API của nó cung cấp dữ liệu thời tiết toàn cầu bao gồm thời tiết hiện tại, dự báo và dữ liệu trong quá khứ của bất kỳ địa điểm nào. Phiên bản miễn phí của API OpenWeatherMap cung cấp dữ liệu thời tiết hiện tại với giới hạn 60 lần gọi trên mỗi phút. Bạn cần tạo một tài khoản trên OpenWeatherMap để nhận khóa API của riêng bạn.

Cảnh báo: Đững đẩy code với khóa API lên các repo công cộng bởi bất cứ ai có quyền truy cập vào file nguồn của bạn cũng sẽ thấy và có thể đánh cắp key. Trong ứng dụng sản phẩm, hãy xem xét việc đưa dữ liệu key API vào file .env để tăng cường bảo mật.

Truy cập vào trang OpenWeatherMap và tạo một tài khoản miễn phí. Sau khi tạo tài khoản, bạn có thể tìm thấy khóa API của bạn trên trang My API Keys. Bạn có thể sử dụng khóa API mặc định được cung cấp bởi OpenWeatherMap hoặc tạo ra khóa của riêng mình. OpenWeatherMap cho phép bạn tạo bao nhiêu khóa API cũng được, tùy theo nhu cầu của bạn.

Truy cập vào trang OpenWeatherMap và tạo một tài khoản miễn phí

Bây giờ, bạn đã sẵn sàng để truy xuất dữ liệu thời tiết trực tiếp:

# Importing libraries
import requests
import json
 
# Enter your OpenWeatherMap API key here
# DO NOT push it to a public repository
API_Key = "Your_API_Key"
 
# Provide a valid city name
city_name = input("Enter city name: ")
 
# Constructing the API URL path
url = f"http://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={API_Key}"
 
# Making a get request to the API
response = requests.get(url)
 
# Converting JSON response to a dictionary
res = response.json()
 
# Uncomment the next line to see all
# data that are fetched from the API
# print(res)
 
# Checking if the city is found
# If the value of "cod" is not 404,
# that means the city is found
if res["cod"] != "404":
   data = res["main"]
 
   # Storing the live temperature data
   live_temperature = data["temp"]
 
   # Storing the live pressure data
   live_pressure = data["pressure"]
   desc = res["weather"]
 
   # Storing the weather description
   weather_description = desc[0]["description"]
   print("Temperature (in Kelvin scale): " + str(live_temperature))
   print("Pressure: " + str(live_pressure))
   print("Description: " + str(weather_description))
 
else:
   # If the city is not found,
   # this block of code will be executed
   print("Please enter a valid city name")

Nếu bạn cung cấp đúng key API và đúng tên thành phố, bạn sẽ nhận được dữ liệu từ API dưới định dạng JSON. Tiếp theo, bạn cần chuyển đổi dữ liệu định dạng JSON này thành một đối tượng Python bằng phương thức json() để thực hiện các hành động khác. Nếu thành phố được tìm thấy, bạn sẽ phải giải quyết đối tượng dict (res) để trích xuất thông tin cần thiết.

Nếu thành phố được tìm thấy, bạn sẽ phải giải quyết đối tượng dict (res) để trích xuất thông tin cần thiết

Phát triển ứng dụng thời tiết bằng dữ liệu thời tiết trực tiếp

Giờ đây, bạn đã học được cách lấy dữ liệu trực tiếp bằng API OpenWeatherMap, bằng cách sử dụng nó bạn đã sẵn sàng để phát triển một ứng dụng thời tiết đơn giản. Xây dựng một ứng dụng thời tiết có thể giúp bạn áp dụng những gì bạn đã biết và trau dồi kỹ năng Python của bạn.

Chăm chỉ thực hành sẽ giúp bạn trở thành một nhà phát triển có kỹ năng cao. Bạn có thể phát triển một số dự án Python khác như hệ thống đăng nhập, ứng dụng giải đó hoặc trình rút gọn URL để phát triển các kỹ năng Python của mình.

Thứ Tư, 09/11/2022 09:41
52 👨 4.655
0 Bình luận
Sắp xếp theo
    ❖ Học Python