Truy xuất Trích dẫn bằng Python Requests và BeautifulSoup

By hientd, at: 21:55 Ngày 30 tháng 6 năm 2023

Thời gian đọc ước tính: __READING_TIME__ minutes

Scrape Quotes using Python Requests and BeautifulSoup
Scrape Quotes using Python Requests and BeautifulSoup

Mở đầu

 

Truy xuất dữ liệu từ các trang web đã trở thành một nhiệm vụ thiết yếu trong nhiều lĩnh vực, từ nghiên cứu đến thông tin kinh doanh. Trong bài viết này, tôi sẽ hướng dẫn bạn quy trình truy xuất các câu nói hay từ trang web phổ biến, https://quotes.toscrape.com/, bằng sự kết hợp mạnh mẽ của Python RequestsBeautifulSoup. Cuối cùng, bạn sẽ hiểu rõ cách truy xuất và trích xuất nội dung cụ thể từ các trang web một cách hiệu quả.

Đoạn mã đầy đủ có thể được tìm thấy tại đây

 

Tổng quan về quy trình truy xuất

 

Trước khi đi sâu vào chi tiết, hãy cùng xem tổng quan về các công cụ chúng ta sẽ sử dụng: Python Requests và BeautifulSoup.

Python Requests là một thư viện đa năng cho phép chúng ta gửi các yêu cầu HTTP một cách dễ dàng.

BeautifulSoup là một thư viện Python được sử dụng để phân tích cú pháp các tài liệu HTML và XML.

CSV là một thư viện Python được sử dụng để ghi/đọc các tệp csv.

Bằng cách kết hợp ba công cụ này, chúng ta có thể điều hướng qua cấu trúc của trang web, trích xuất thông tin mong muốn và ghi vào tệp.

 

Thiết lập môi trường

 

Điều đầu tiên, hãy đảm bảo rằng chúng ta đã cài đặt các công cụ cần thiết. Để làm theo, bạn cần Python, Requests, BeautifulSoupCSV. Nếu bạn chưa cài đặt Python, hãy truy cập trang web chính thức của Python và tải xuống phiên bản mới nhất. Sau khi cài đặt Python, bạn có thể cài đặt Requests và BeautifulSoup bằng cách chạy các lệnh sau trong thiết bị đầu cuối của bạn:

pip install requests
pip install beautifulsoup4

# csv là một thư viện tích hợp sẵn của Python

 

Gửi yêu cầu đến trang web

 

Để bắt đầu truy xuất, chúng ta cần gửi yêu cầu đến trang web mà chúng ta muốn trích xuất dữ liệu. Sử dụng Python Requests, chúng ta có thể gửi yêu cầu GET đến URL của trang web câu nói hay. Điều quan trọng là phải xử lý các lỗi và ngoại lệ tiềm ẩn, chẳng hạn như hết thời gian kết nối hoặc URL không hợp lệ hoặc trạng thái không hợp lệ. Điều này đảm bảo rằng tập lệnh truy xuất của chúng ta mạnh mẽ và đáng tin cậy.

import requests url = "https://quotes.toscrape.com/"

response = requests.get(url)

if response.status_code == 200:
    # Tiếp tục truy xuất
else:
    # Xử lý lỗi một cách khéo léo

 

Phân tích cú pháp phản hồi HTML

 

Sau khi nhận được phản hồi từ trang web, chúng ta cần phân tích cú pháp nội dung HTML để trích xuất thông tin mong muốn. BeautifulSoup sẽ giúp chúng ta ở đây. Nó cung cấp một cách thuận tiện để điều hướng và tìm kiếm trong tài liệu HTML bằng cách sử dụng bộ chọn.

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, "html.parser")

 

Truy xuất các câu nói hay

 

Với BeautifulSoup, bây giờ chúng ta có thể định vị và trích xuất văn bản câu nói hay và thông tin tác giả từ HTML đã được phân tích cú pháp. Bằng cách kiểm tra cấu trúc của trang web, chúng ta xác định các phần tử HTML phù hợp và sử dụng các bộ chọn phù hợp để truy xuất dữ liệu.

quotes = soup.select(".quote")

for quote in quotes:
    text = quote.select_one(".text").get_text()
    author = quote.select_one(".author").get_text()

# Xử lý dữ liệu đã được truy xuất theo ý muốn

 

Xử lý phân trang

 

Trong nhiều trường hợp, chúng ta có thể cần phải truy xuất nhiều trang để lấy tất cả dữ liệu mong muốn. Trang web câu nói hay có nhiều trang, và chúng ta không muốn bỏ lỡ bất kỳ câu nói nào. Chúng ta có thể xử lý phân trang bằng cách theo dõi các liên kết phân trang hoặc sửa đổi các tham số truy vấn trong URL. Điều này cho phép chúng ta lặp lại từng trang và truy xuất các câu nói hay.

next_page_link = soup.select_one(".next > a")["href"] # Tạo URL cho trang tiếp theo

next_page_url = f"{url}{next_page_link} # Gửi yêu cầu GET đến trang tiếp theo và tiếp tục truy xuất

 

Lưu trữ dữ liệu đã truy xuất

 

Sau khi đã truy xuất thành công các câu nói hay, điều quan trọng là phải quyết định cách lưu trữ dữ liệu đã trích xuất để sử dụng trong tương lai. Chúng ta có nhiều lựa chọn, chẳng hạn như lưu vào tệp CSV, định dạng JSON hoặc lưu trữ trong cơ sở dữ liệu. Sự lựa chọn phụ thuộc vào yêu cầu cụ thể của bạn và khả năng mở rộng của dự án.

quotes = [{"author": "Joe", "text": "this is a quote"}]

with open(file_name, 'w') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=["author", "text"])
    writer.writeheader()
    writer.writerows(quotes)

 

Các trường hợp biên và thách thức

 

Mặc dù truy xuất web có thể đơn giản, nhưng điều quan trọng là phải giải quyết các trường hợp biên và thách thức tiềm ẩn.

Một số trang web có thể có nội dung động được tải qua JavaScript, điều này đòi hỏi các kỹ thuật bổ sung như sử dụng trình duyệt không đầu. Trong trường hợp này, chúng ta có thể cần sử dụng Selenium/PlayWright để truy xuất.

Ngoài ra, các trang web có thể triển khai các biện pháp chống truy xuất, chẳng hạn như CAPTCHA hoặc hạn chế tốc độ (ví dụ: https://www.walmart.com/). Xử lý những thách thức này đòi hỏi các chiến lược nâng cao như quản lý phiên, luân chuyển IP hoặc sử dụng các khung truy xuất chuyên dụng.

Mẹo và các thực tiễn tốt nhất

 

Để đảm bảo việc truy xuất web diễn ra suôn sẻ và hiệu quả, đây là một số mẹo và thực tiễn tốt nhất cần ghi nhớ:
 

  1. Tôn trọng chính sách và điều khoản dịch vụ của trang web.
     
  2. Bao gồm cơ chế trì hoãn giữa các yêu cầu để tránh quá tải máy chủ.
     
  3. Sử dụng tiêu đề user-agent thích hợp để bắt chước hành vi của người dùng thực.
     
  4. Giám sát và xử lý ngoại lệ một cách khéo léo để ngăn chặn gián đoạn việc truy xuất.
     
  5. Thường xuyên kiểm tra tập lệnh truy xuất của bạn để thích ứng với những thay đổi tiềm ẩn của trang web.

 

Kết luận


Trong bài viết này, chúng ta đã khám phá cách truy xuất các câu nói hay từ https://quotes.toscrape.com/ bằng Python RequestsBeautifulSoup. Chúng ta đã thảo luận về toàn bộ quy trình truy xuất, bao gồm gửi yêu cầu, phân tích cú pháp phản hồi HTML, trích xuất câu nói hay, xử lý phân trang và lưu trữ dữ liệu đã truy xuất. Bằng cách làm theo các thực tiễn tốt nhất và xem xét các trường hợp biên tiềm năng, bạn có thể tạo ra các tập lệnh truy xuất web mạnh mẽ và hiệu quả phù hợp với nhu cầu cụ thể của bạn.


Có rất nhiều trang web khác mà chúng ta có thể truy xuất câu nói hay miễn phí:
 

Nội dung đầy đủ của tập lệnh là

# Python 3.11

import argparse
import csv

import requests
from bs4 import BeautifulSoup

BASE_URL = "https://quotes.toscrape.com"


def scrape_url(url):
    print(f"Scrape url {url}")
    response = requests.get(url)

    if response.status_code != 200:
        breakpoint()

    soup = BeautifulSoup(response.text, "html.parser")
    quote_divs = soup.select(".quote")

    quotes = []
    for quote_div in quote_divs:
        text = quote_div.select_one(".text").get_text()
        if '"' in text:
            text = text.replace('"', "")
        if "“" in text:
            text = text.replace("“", "")
        if "”" in text:
            text = text.replace("”", "")
        author = quote_div.select_one(".author").get_text()
        quote = {"text": text, "author": author}
        quotes.append(quote)

    print(f"Found #{len(quotes)} quotes")

    next_url = None
    if soup.select_one(".next > a"):
        next_link = soup.select_one(".next > a")["href"]
        next_url = f"{BASE_URL}{next_link}"

    return next_url, quotes


def write_to_file(file_name, quotes):
    field_names = ["author", "text"]
    with open(file_name, "w") as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=field_names)
        writer.writeheader()
        writer.writerows(quotes)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Scrape quotes")
    parser.add_argument("-f", "--file_name")
    args = parser.parse_args()

    file_name = "quotes.csv"
    if args.file_name:
        file_name = args.file_name

    print("Start scraping")
    next_url = "https://quotes.toscrape.com/"
    quotes = []
    while next_url:
        next_url, new_quotes = scrape_url(next_url)
        quotes.extend(new_quotes)
    print(f"Total found #{len(quotes)}")
    write_to_file(file_name, quotes)

 

Câu hỏi thường gặp
 

 

  1. Tôi có thể truy xuất bất kỳ trang web nào không? Mặc dù về mặt kỹ thuật có thể truy xuất hầu hết các trang web, nhưng điều quan trọng là phải xem xét điều khoản dịch vụ và chính sách của trang web. Một số trang web có thể nghiêm cấm việc truy xuất hoặc có các hạn chế cụ thể.
     

  2. Làm thế nào tôi có thể xử lý các trang web có nội dung động? Các trang web tải dữ liệu động bằng JavaScript có thể yêu cầu các kỹ thuật bổ sung như sử dụng trình duyệt không đầu hoặc kỹ thuật đảo ngược API.
     

  3. Việc truy xuất web có hợp pháp không? Tính hợp pháp của việc truy xuất web phụ thuộc vào nhiều yếu tố, bao gồm điều khoản dịch vụ của trang web, luật hiện hành và mục đích của việc truy xuất. Nên tham khảo ý kiến ​​của chuyên gia pháp luật hoặc xem xét các quy định địa phương để đảm bảo tuân thủ.
     

  4. Làm thế nào tôi có thể xử lý các biện pháp chống truy xuất như CAPTCHA? Một số trang web sử dụng các biện pháp chống truy xuất như CAPTCHA để ngăn chặn truy cập tự động. Trong những trường hợp như vậy, có thể cần phải sử dụng các công cụ hoặc dịch vụ bổ sung để bỏ qua các biện pháp này.
     

  5. Việc truy xuất web có thể quá tải máy chủ và gây ra sự cố không? Có, việc truy xuất quá mức có thể gây áp lực lên máy chủ và ảnh hưởng đến hiệu suất của trang web. Điều quan trọng là phải thực hiện các trì hoãn, điều tiết và các biện pháp khác để truy xuất một cách có trách nhiệm và tránh quá tải máy chủ.
     

  6. Có bất kỳ cân nhắc về đạo đức nào khi truy xuất các trang web không? Khi truy xuất các trang web, điều quan trọng là phải tôn trọng chính sách, điều khoản dịch vụ và quyền riêng tư của trang web. Tránh truy xuất thông tin nhạy cảm hoặc thông tin cá nhân mà không có sự đồng ý thích hợp.
     

  7. Một số thư viện thay thế để truy xuất web bằng Python là gì? Bên cạnh Requests và BeautifulSoup, các thư viện phổ biến khác để truy xuất web bằng Python bao gồm Scrapy, Selenium và lxml. Việc lựa chọn thư viện phụ thuộc vào các yêu cầu cụ thể và độ phức tạp của nhiệm vụ truy xuất.
     

  8. Tôi có thể truy xuất các trang web được bảo vệ bằng đăng nhập/xác thực không? Việc truy xuất các trang web được xác thực hoặc bảo vệ bằng đăng nhập đòi hỏi các bước bổ sung, chẳng hạn như gửi cookie phiên thích hợp hoặc sử dụng điểm cuối API. Điều quan trọng là phải hiểu cơ chế xác thực của trang web trước khi cố gắng truy xuất.
     

  9. Làm thế nào tôi có thể lưu trữ và phân tích dữ liệu đã truy xuất? Dữ liệu đã truy xuất có thể được lưu trữ ở nhiều định dạng như CSV, JSON hoặc cơ sở dữ liệu để phân tích thêm. Python cung cấp nhiều thư viện, chẳng hạn như pandas, để thao tác và phân tích dữ liệu.
     

  10. Làm thế nào tôi có thể xử lý những thay đổi trong cấu trúc trang web? Các trang web có thể thay đổi cấu trúc HTML theo thời gian, điều này có thể làm hỏng các tập lệnh truy xuất. Việc thường xuyên xem xét và cập nhật logic truy xuất có thể giúp xử lý
     

Tag list:
- Python
- Scraper
- Web Scraping
- Requests
- BeautifulSoup
- Tips and Tricks
- Data Scraper
- Web Scraper
- Quotes Scraper

Liên quan

Python Scrapers

Đọc thêm
Python Scrapers

Đọc thêm
Python Scrapers

Đọc thêm

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.