Cách xây dựng bộ dữ liệu tùy chỉnh với Web Scraping
Có bộ dữ liệu chất lượng cao là điều cần thiết trong thời đại ra quyết định dựa trên dữ liệu này. Mặc dù có rất nhiều bộ dữ liệu có sẵn công khai, đôi khi bạn có thể cần xây dựng bộ dữ liệu tùy chỉnh đáp ứng các nhu cầu cụ thể của mình. Quét web cho phép bạn trích xuất dữ liệu từ các trang web. Sau đó, bạn có thể sử dụng dữ liệu này để tạo tập dữ liệu tùy chỉnh của mình.
Mục Lục
Tổng quan về các phương pháp thu thập dữ liệu
Có nhiều phương pháp thu thập dữ liệu khác nhau. Chúng bao gồm nhập dữ liệu thủ công, API, bộ dữ liệu công khai và quét web. Mỗi phương pháp đều có ưu điểm và hạn chế.
Nhập dữ liệu thủ công tốn thời gian và dễ xảy ra lỗi do con người, đặc biệt đối với việc thu thập dữ liệu quy mô lớn. Tuy nhiên, Nó rất hữu ích cho việc thu thập dữ liệu quy mô nhỏ và khi dữ liệu không có sẵn thông qua các phương tiện khác.
API cho phép các nhà phát triển truy cập và truy xuất dữ liệu theo cách có cấu trúc. Chúng thường cung cấp thông tin theo thời gian thực hoặc được cập nhật thường xuyên. Tuy nhiên, quyền truy cập API có thể bị hạn chế, yêu cầu xác thực hoặc có các hạn chế sử dụng.
Bộ dữ liệu công khai bao gồm nhiều chủ đề và lĩnh vực khác nhau. Chúng được thu thập trước và thường ở định dạng có cấu trúc, giúp chúng dễ dàng truy cập. Họ có thể tiết kiệm thời gian và công sức khi dữ liệu cần thiết phù hợp với bộ dữ liệu có sẵn. Tuy nhiên, chúng có thể không phải lúc nào cũng đáp ứng các nhu cầu cụ thể của bạn hoặc được cập nhật.
Quét web cung cấp một cách để thu thập dữ liệu từ các trang web không cung cấp API hoặc có quyền truy cập hạn chế. Nó cho phép tùy chỉnh, khả năng mở rộng và khả năng thu thập dữ liệu từ nhiều nguồn. Tuy nhiên, nó đòi hỏi kỹ năng lập trình, kiến thức về cấu trúc HTML và tuân thủ các nguyên tắc pháp lý và đạo đức.
Chọn Web Scraping để thu thập dữ liệu
Quét web cho phép bạn trích xuất thông tin trực tiếp từ các trang web, cho phép bạn truy cập vào nhiều nguồn dữ liệu. Nó cũng cung cấp cho bạn quyền kiểm soát dữ liệu nào cần trích xuất và cách cấu trúc dữ liệu đó. Điều này giúp dễ dàng điều chỉnh quy trình cạo để đáp ứng các yêu cầu cụ thể của bạn và trích xuất thông tin chính xác mà bạn cần cho dự án của mình.
Xác định nguồn dữ liệu
Bước đầu tiên trong việc quét web là xác định nguồn dữ liệu. Đây là trang web chứa dữ liệu mà bạn muốn cạo. Khi chọn nguồn dữ liệu, hãy đảm bảo bạn tuân thủ các điều khoản dịch vụ của nguồn. Bài viết này sẽ sử dụng IMDb (Internet Movie Database) làm nguồn dữ liệu.
Thiết lập môi trường của bạn
Thiết lập một môi trường ảo. Sau đó chạy lệnh sau để cài đặt các thư viện cần thiết.
pip install requests beautifulsoup4 pandas
Bạn sẽ sử dụng yêu cầu thư viện để thực hiện các yêu cầu HTTP. soup4 để phân tích nội dung HTML và trích xuất dữ liệu từ các trang web. Cuối cùng, bạn sẽ sử dụng gấu trúc để thao tác và phân tích dữ liệu.
Viết tập lệnh quét web
Nhập các thư viện đã cài đặt vào tập lệnh của bạn để có thể sử dụng các chức năng mà chúng cung cấp.
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
import re
Các thời gian Và nốt Rê mô-đun là một phần của thư viện chuẩn Python. Do đó, không yêu cầu cài đặt riêng biệt.
thời gian sẽ thêm độ trễ cho quá trình cạo trong khi nốt Rê sẽ đối phó với các biểu thức thông thường.
Bạn sẽ sử dụng Beautiful Soup để quét trang web mục tiêu.
Tạo một chức năng sẽ gửi yêu cầu HTTP GET tới URL mục tiêu của bạn. Sau đó, nó sẽ truy xuất nội dung của phản hồi và tạo một ĐẹpSúp đối tượng từ nội dung HTML.
def get_soup(url, params=None, headers=None):
response = requests.get(url, params=params, headers=headers)
soup = BeautifulSoup(response.content, "html.parser")
return soup
Bước tiếp theo là trích xuất thông tin từ ĐẹpSúp sự vật.
Để trích xuất thông tin, bạn cần hiểu cấu trúc trang web mục tiêu của mình. Điều này liên quan đến việc kiểm tra mã HTML của trang web. Điều này sẽ giúp bạn xác định các thành phần và thuộc tính chứa dữ liệu mà bạn muốn trích xuất. Để kiểm tra trang web mục tiêu của bạn, hãy mở liên kết của nó trong trình duyệt web và điều hướng đến trang web chứa dữ liệu bạn muốn thu thập.
Sau đó nhấp chuột phải vào trang web và chọn Quan sát từ trình đơn ngữ cảnh. Thao tác này sẽ mở công cụ dành cho nhà phát triển của trình duyệt.
Trong mã HTML của trang web, hãy tìm các thành phần chứa dữ liệu bạn muốn cạo. Hãy chú ý đến các thẻ, lớp và thuộc tính HTML được liên kết với dữ liệu bạn cần. Bạn sẽ sử dụng chúng để tạo bộ chọn để trích xuất dữ liệu bằng BeautifulSoup. Trong ảnh chụp màn hình ở trên, bạn có thể thấy tiêu đề của phim nằm trong lister-item-header lớp học. Kiểm tra từng tính năng bạn muốn trích xuất.
Tạo một chức năng sẽ trích xuất thông tin từ ĐẹpSúp sự vật. Trong trường hợp này, hàm tìm tiêu đề, xếp hạng, mô tả, thể loại, ngày phát hành, đạo diễn và ngôi sao của phim bằng cách sử dụng các thẻ HTML và thuộc tính lớp thích hợp.
def extract_movie_data(movie):
title = movie.find("h3", class_="lister-item-header").find("a").text
rating = movie.find("div", class_="ratings-imdb-rating").strong.text
description = movie.find("div", class_="lister-item-content").find_all("p")[1].text.strip()
genre_element = movie.find("span", class_="genre")
genre = genre_element.text.strip() if genre_element else None
release_date = movie.find("span", class_="lister-item-year text-muted unbold").text.strip()
director_stars = movie.find("p", class_="text-muted").find_all("a")
directors = [person.text for person in director_stars[:-1]]
stars = [person.text for person in director_stars[-1:]]
movie_data = {
"Title": title,
"Rating": rating,
"Description": description,
"Genre": genre,
"Release Date": release_date,
"Directors": directors,
"Stars": stars
}
return movie_data
Cuối cùng, tạo một chức năng sẽ thực hiện việc cạo thực tế bằng hai chức năng trên. Nó sẽ lấy năm và số lượng phim tối đa mà bạn muốn cạo.
def scrape_imdb_movies(year, limit):
base_url = "https://www.imdb.com/search/title"
headers = {"Accept-Language": "en-US,en;q=0.9"}
movies = []
start = 1
while len(movies) < limit:
params = {
"release_date": year,
"sort": "num_votes,desc",
"start": start
}
soup = get_soup(base_url, params=params, headers=headers)
movie_list = soup.find_all("div", class_="lister-item mode-advanced")
if len(movie_list) == 0:
break
for movie in movie_list:
movie_data = extract_movie_data(movie)
movies.append(movie_data)
if len(movies) >= limit:
break
start += 50
time.sleep(1)
return movies
Sau đó gọi def scrape_imdb_movies để làm cạo.
movies = scrape_imdb_movies(2023, 1000)
Bây giờ bạn đã cạo dữ liệu.
Bước tiếp theo là tạo một tập dữ liệu từ dữ liệu này.
Tạo tập dữ liệu từ dữ liệu đã cạo
Tạo một DataFrame bằng cách sử dụng Pandas từ dữ liệu đã cạo.
df = pd.DataFrame(movies)
Sau đó, tiến hành tiền xử lý và làm sạch dữ liệu. Trong trường hợp này, hãy xóa các hàng có giá trị bị thiếu. Sau đó trích xuất năm từ ngày phát hành và chuyển đổi nó thành số. Loại bỏ các cột không cần thiết. chuyển đổi Xếp hạng cột thành số. Cuối cùng, xóa các ký tự không phải chữ cái khỏi Tiêu đề cột.
df = df.dropna()
df['Release Year'] = df['Release Date'].str.extract(r'(d{4})')
df['Release Year'] = pd.to_numeric(df['Release Year'],
errors='coerce').astype('Int64')
df = df.drop(['Release Date'], axis=1)
df['Rating'] = pd.to_numeric(df['Rating'], errors='coerce')
df['Title'] = df['Title'].apply(lambda x: re.sub(r'W+', ' ', x))
Lưu trữ dữ liệu trong một tệp để sử dụng sau này trong dự án của bạn.
df.to_csv("imdb_movies_dataset.csv", index=False)
Cuối cùng, in năm hàng đầu tiên của tập dữ liệu của bạn để xem nó trông như thế nào.
df.head()
Đầu ra như trong ảnh chụp màn hình bên dưới:
Bây giờ bạn có một bộ dữ liệu thu được thông qua quét web.
Quét web bằng các thư viện Python khác
Beautiful Soup không phải là thư viện Python duy nhất mà bạn có thể sử dụng để quét web. Có những thư viện khác ngoài kia. Mỗi cái đều có ưu điểm và hạn chế riêng. Nghiên cứu chúng để tìm ra cái nào phù hợp nhất với trường hợp sử dụng của bạn.