Bỏ để qua phần nội dung

Các thư viện quét web Python tốt nhất là gì?

Này! Là một chuyên gia quét web với hơn 5 năm kinh nghiệm, tôi đã có cơ hội làm việc với tất cả các thư viện Python hàng đầu. Trong hướng dẫn này, tôi sẽ chia sẻ mọi thứ tôi đã học được về cách sử dụng Python để quét web.

Chúng ta sẽ xem xét kỹ hơn cách hoạt động của từng thư viện và những tình huống tốt nhất để sử dụng chúng. Mục tiêu của tôi là cung cấp cho bạn những hiểu biết cần thiết để chọn công cụ cạo phù hợp cho bất kỳ dự án nào. Bắt đầu nào!

Thư viện HTTP cốt lõi: Nền tảng cho Python Scraping

Bước đầu tiên trong bất kỳ dự án quét web nào là tải xuống nội dung trang web. Thư viện Yêu cầu và HTTPX của Python làm cho việc này thực sự đơn giản.

Yêu cầu: Thư viện HTTP đã thử và đúng

Yêu cầu là thư viện Python phổ biến nhất dành cho các yêu cầu HTTP, được 89% nhà phát triển Python sử dụng theo Khảo sát nhà phát triển Python năm 2020.

Thật dễ dàng để biết lý do tại sao. Việc thực hiện yêu cầu bằng Yêu cầu chỉ cần một dòng mã:

response = requests.get(‘https://www.example.com‘)

Yêu cầu hỗ trợ tất cả các động từ HTTP phổ biến như GET, POST, PUT, DELETE với cùng một giao diện đơn giản. Nó xử lý:

  • Mã hóa tham số trong chuỗi URL
  • Thêm tiêu đề và cookie
  • Gửi tập tin tải lên nhiều phần
  • Mã hóa các nội dung yêu cầu JSON

Và nó tự động giải mã nội dung phản hồi dựa trên tiêu đề HTTP. Không cần gọi thủ công json() như các ngôn ngữ khác.

Yêu cầu thậm chí xử lý:

  • Theo dõi chuyển hướng
  • Đang thử lại yêu cầu
  • Kết nối liên tục
  • Cookie kiểu trình duyệt

Đó là mọi thứ bạn cần cho các yêu cầu HTTP cơ bản trong một giao diện đơn giản. Dựa trên kinh nghiệm của tôi, tôi khuyên bạn nên sử dụng Yêu cầu cho bất kỳ nhà phát triển Python nào bắt đầu tìm hiểu về web.

HTTPX: Máy khách HTTP Async nâng cao hơn

HTTPX cung cấp giao diện kiểu Yêu cầu đơn giản tương tự với các tính năng nâng cao cho các trường hợp sử dụng phức tạp:

  • Yêu cầu không đồng bộ
  • Hỗ trợ HTTP / 2
  • Xử lý thời gian chờ
  • Tính bền bỉ của cookie
  • Tổng hợp kết nối
  • Proxy
  • Bộ nhớ đệm giống như trình duyệt

Việc thực hiện các yêu cầu không đồng bộ đặc biệt quan trọng đối với hiệu suất. Đây là cách bạn có thể tìm nạp nhiều URL đồng thời bằng HTTPX:

import httpx

async with httpx.AsyncClient() as client:

  futures = [client.get(url) for url in urls]

  for response in await httpx.async_list(futures):
    print(response.url)

Dựa trên điểm chuẩn, HTTPX đạt được thông lượng cao hơn 2-3 lần so với Yêu cầu đối với các lô yêu cầu lớn.

Tôi đề xuất HTTPX để xây dựng các trình quét web không đồng bộ nâng cao hơn. Kết hợp với đa xử lý và đa luồng, nó cho phép các đường ống thu thập dữ liệu hiệu suất cực cao.

Phân tích cú pháp HTML: Trích xuất dữ liệu từ các trang web

Khi bạn có nội dung HTML, đã đến lúc phân tích cú pháp và trích xuất dữ liệu bạn cần. Hai lựa chọn tuyệt vời ở đây là Beautiful Soup và LXML.

Súp đẹp: Phân tích cú pháp HTML đơn giản

Beautiful Soup xứng đáng với tên gọi của nó như một thư viện tuyệt vời để phân tích cú pháp và lặp lại HTML và XML bằng Python. Dựa trên khảo sát Python năm 2020, đây là thư viện Python phổ biến nhất để xử lý HTML và XML.

Nó cung cấp các phương thức đơn giản để điều hướng, tìm kiếm và sửa đổi cây phân tích cú pháp. Ví dụ: chúng tôi có thể trích xuất tất cả các liên kết từ một trang như thế này:

from bs4 import BeautifulSoup

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

for link in soup.find_all(‘a‘):
  print(link.get(‘href‘))

API BeautifulSoup bao gồm chủ yếu:

  • Các phương pháp như find(), find_all() để tìm kiếm các nút
  • Các thuộc tính như name, string, attrs để truy cập thuộc tính nút
  • Các phương pháp như get_text(), decompose() để sửa đổi các nút

Nó không sử dụng súp thẻ đóng mở như jQuery, thứ mà cá nhân tôi thấy dễ đọc và viết hơn.

Dựa trên kinh nghiệm của tôi, Beautiful Soup hoạt động xuất sắc cho các tác vụ quét web vừa và nhỏ. Hạn chế chính là tốc độ vì đây là mã Python thuần túy.

LXML: Phân tích cú pháp HTML/XML dựa trên C nhanh hơn

Nếu bạn đang phân tích nhiều tài liệu XML/HTML lớn, tôi khuyên bạn nên sử dụng LXML thay vì. Nó là một thư viện phân tích cú pháp XML cho Python được xây dựng trên các thư viện C hiệu suất cao libxml2 và libxslt.

Theo điểm chuẩn, LXML có thể phân tích tài liệu XML nhanh hơn 40 lần hơn Canh đẹp và công dụng Bộ nhớ ít hơn 80%.

Dưới đây là ví dụ về việc sử dụng LXML để trích xuất thông tin sản phẩm từ trang web thương mại điện tử:

from lxml import html

root = html.parse(page)

# XPath query to extract product attributes
for product in root.xpath(‘//div[@class="product"]‘):

  name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
  description = product.xpath(‘.//div[@class="description"]/text()‘)[0]
  price = product.xpath(‘.//span[@class="price"]/text()‘)[0]

  print(name, description, price)

LXML hỗ trợ phân tích cú pháp cả HTML và XML, đồng thời cung cấp bộ chọn CSS, hỗ trợ XPath và XSLT để trích xuất dữ liệu.

Đối với các công cụ dọn dẹp sản xuất quy mô lớn, tôi khuyên bạn nên sử dụng LXML để tăng tốc độ phân tích cú pháp rất lớn. Đây là một trong những thư viện xử lý XML nhanh nhất hiện có ở mọi ngôn ngữ.

Tự động hóa trình duyệt: Thu thập dữ liệu các trang web JavaScript

Các yêu cầu HTTP và phân tích cú pháp HTML truyền thống là không đủ đối với các trang web phụ thuộc nhiều vào JavaScript để hiển thị nội dung. Một số ví dụ bao gồm:

  • Ứng dụng một trang (SPA) như Gmail và Twitter
  • Các trang web tải dữ liệu động thông qua các yêu cầu AJAX
  • Các trang sử dụng khung JavaScript như React và Angular

Đối với những trường hợp này, bạn cần thực thi JavaScript trong trình duyệt thực để cho phép tải toàn bộ nội dung trang. Python có các thư viện tuyệt vời để tự động hóa trình duyệt, như Selenium và Playwright.

Selenium: Công cụ tự động hóa trình duyệt đương nhiệm

Selenium đã trở thành thư viện tự động hóa trình duyệt được sử dụng trong hơn một thập kỷ nay.

Nó cho phép bạn điều khiển các trình duyệt web như Chrome, Firefox và Safari theo chương trình. Một số hành động ví dụ bạn có thể thực hiện:

  • Điều hướng đến các trang
  • Nhấp vào nút và liên kết
  • Điền và gửi biểu mẫu
  • Cuộn trang
  • Chụp ảnh màn hình
  • Chụp ảnh chụp nhanh HTML
  • Khẳng định nội dung trang

Tất cả từ một giao diện Python dễ dàng.

Dưới đây là cách sử dụng Selenium để đăng nhập vào một trang web và trích xuất dữ liệu riêng tư:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com")

driver.find_element(By.NAME, ‘username‘).send_keys(‘myuser‘) 
driver.find_element(By.NAME, ‘password‘).send_keys(‘secret‘)
driver.find_element(By.ID, ‘login‘).click()

# Wait for dashboard page to load
WebDriverWait(driver, 10).until(EC.title_contains("Dashboard")) 

print(driver.find_element(By.ID, ‘apiKey‘).text)

driver.quit() 

Dưới đây là một số số liệu thống kê chính về việc sử dụng Selenium:

  • Hơn 500,000 bài kiểm tra Selenium được thực hiện hàng ngày chỉ riêng trên BrowserStack
  • 6.5 triệu câu hỏi liên quan đến Selenium trên StackOverflow
  • Hơn 100,000 sao Selenium GitHub

Tuy nhiên, Selenium có một số điểm khó khăn:

  • Các bài kiểm tra giòn dễ bị phá vỡ trên các phiên bản trình duyệt
  • Phần tử trang chờ và hết thời gian chờ yêu cầu xử lý đặc biệt
  • Những thách thức trong việc quản lý trình điều khiển và trình duyệt trên nhiều môi trường
  • Công việc bổ sung để ghi nhật ký, báo cáo và song song hóa

Vì vậy, mặc dù Selenium vẫn là yếu tố chính để thử nghiệm và tự động hóa, nhưng tôi thường thích thư viện tự động hóa trình duyệt hiện đại hơn cho các tác vụ quét web nói chung.

Nhà viết kịch: Người kế thừa thế hệ tiếp theo của Selenium

Playwright là một thư viện tự động hóa và thử nghiệm trình duyệt mới được phát triển bởi Microsoft. Nó cung cấp API đáng tin cậy, hiệu quả và dễ dàng hơn Selenium.

Một số ưu điểm chính của Playwright:

  • Tự động chờ đợi các phần tử trước khi tương tác - Không còn thời gian chờ định vị không ổn định nữa!
  • Tự động chờ tải trang đáng tin cậy – Nhà viết kịch chờ mạng nhàn rỗi, tránh tình trạng chạy đua.
  • Bảo mật web bị vô hiệu hóa – Trang tải chính xác mà không phát hiện tự động hóa.
  • API đầy đủ tính năng – Bối cảnh trình duyệt, công nhân, mô phỏng di động tích hợp.
  • Khả năng sửa lỗi tuyệt vời – Bao gồm hiển thị di chuyển chuột, chụp ảnh màn hình, gỡ lỗi từng bước.
  • Hỗ trợ nhiều trình duyệt – Hoạt động trên Chrome, Firefox và WebKit với API nhất quán.

Đây là ví dụ đăng nhập khi sử dụng Playwright:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
  browser = p.chromium.launch()
  page = browser.new_page()  

  page.goto("https://example.com")
  page.type("#username", "myuser")
  page.type("#password", "secret")
  page.click("#login")
  page.wait_for_load_state(‘domcontentloaded‘) 

  print(page.text_content(‘#apiKey‘))

  browser.close()

Mạnh mẽ và đáng tin cậy hơn nhiều! Nhà viết kịch cũng cung cấp các trình xử lý tích hợp tuyệt vời cho:

  • Ảnh chụp màn hình, video, theo dõi, nhật ký bảng điều khiển
  • Mô phỏng di động và thử nghiệm đáp ứng
  • Thao tác mạng, bộ nhớ đệm, điều tiết
  • Quản lý bối cảnh trình duyệt
  • Kiến trúc và công nhân nhiều trang

Vì những lý do này, tôi khuyên bạn nên sử dụng Playwright thay vì Selenium cho hầu hết các trường hợp sử dụng tự động hóa trình duyệt hiện nay.

Khung Scraping mạnh mẽ để thu thập thông tin quy mô lớn

Mặc dù các thư viện trên cung cấp các khối xây dựng nhưng đối với các dự án thu thập dữ liệu quy mô lớn, bạn cần có một khuôn khổ mạnh mẽ. Scrapy và Selenium Grid là những lựa chọn tuyệt vời.

Scrapy: Khung quét web hạng nặng

Nếu bạn cần thu thập dữ liệu hàng nghìn hoặc hàng triệu trang trên các trang web lớn, Scrapy là đề xuất hàng đầu của tôi.

Một số ưu điểm chính:

  • Trình thu thập thông tin không đồng bộ – Scrapy xử lý các yêu cầu trang, thu thập dữ liệu và xử lý dữ liệu không đồng bộ.
  • Công cụ trích xuất mạnh mẽ – Công cụ truy vấn CSS và XPath để phân tích trang.
  • Đường dẫn mục – Làm sạch kiến ​​trúc lưu trữ và xử lý dữ liệu.
  • Điều tiết & bộ nhớ đệm – Tích hợp để tuân theo độ trễ thu thập dữ liệu và robots.txt.
  • Mở rộng quy mô – Hỗ trợ thu thập dữ liệu phân tán cho các luồng dữ liệu lớn.

Đây là một ví dụ về lớp Spider để thu thập thông tin HackerNews:

import scrapy

class HackerNewsSpider(scrapy.Spider):

  name = ‘hackernews‘

  def start_requests(self):
    yield scrapy.Request(‘https://news.ycombinator.com/‘, callback=self.parse)

  def parse(self, response):
    for post in response.css(‘.athing‘):
      yield {
        ‘title‘: post.css(‘.titlelink::text‘).get(),
        ‘votes‘: post.css(‘.score::text‘).get()
      }

Theo điểm chuẩn của Crawl.be, Scrapy có thể vượt qua 175 trang mỗi giây mỗi trình thu thập thông tin. Với việc thu thập dữ liệu phân tán, nó đã được sử dụng để thu thập hàng terabyte dữ liệu từ các trang web lớn.

Nếu bạn đang thu thập dữ liệu trên quy mô lớn, Scrapy là đề xuất hàng đầu của tôi về khung thu thập dữ liệu Python. Kiến trúc không đồng bộ và các công cụ quản lý thu thập thông tin hoàn hảo cho các công việc thu thập dữ liệu lớn.

Lưới Selenium: Tự động hóa trình duyệt có thể mở rộng

Selenium Grid cho phép bạn mở rộng quy mô tự động hóa trình duyệt bằng cách phân phối các bài kiểm tra trên nhiều máy. Điều này loại bỏ nút thắt cổ chai khi chạy tất cả các thử nghiệm theo trình tự trên một máy.

Kiến trúc bao gồm ba thành phần:

  • Trung tâm Selenium – Trung tâm trung tâm để phân phối các bài kiểm tra đến các nút
  • Node – Phiên bản Selenium được kết nối với các thử nghiệm đang chạy trong trung tâm
  • Thử nghiệm – Logic kiểm tra của bạn chạy trên các nút

Kiến trúc lưới Selenium

Để chạy một Grid đơn giản:

# On main host 
java -jar selenium-server-standalone.jar -role hub

# On each node 
java -Dwebdriver.chrome.driver=chromedriver -jar selenium-server-standalone.jar -role node -hub <hubIp:port>

Với việc thiết lập Lưới này, bạn có thể song song hóa hàng loạt Playwright, Selenium hoặc bất kỳ thử nghiệm trình duyệt nào trên hàng nghìn nút.

Dựa trên kinh nghiệm của tôi, Selenium Grid rất cần thiết để mở rộng khối lượng công việc tự động hóa trình duyệt và quét JavaScript lớn. Kiến trúc phân tán cho phép bạn thu thập dữ liệu theo thứ tự lớn hơn của nhiều trang hơn.

Trình duyệt không đầu: Thực thi JavaScript nhẹ

Các trình duyệt không có giao diện người dùng cung cấp hỗ trợ JavaScript mà không cần phải quản lý giao diện người dùng trình duyệt. Một số lựa chọn hàng đầu là:

  • Nhà soạn kịchSelenium có thể chạy ở chế độ không đầu nhẹ.
  • Xương vụn cung cấp một trình duyệt trừu tượng đơn giản dựa trên các yêu cầu thô của Selenium, Playwright hoặc thô.
  • Pyppeteer cung cấp giao diện Python để điều khiển thư viện Chrome Puppeteer không đầu.

Ví dụ: đây là cách bật chế độ không đầu trong Playwright:

from playwright.sync_api import sync_playwright

browser = playwright.chromium.launch(headless=True)

Giờ đây, bạn có thể thực thi JavaScript, hiển thị trang web, tạo ảnh chụp màn hình, trích xuất HTML – tất cả đều không cần sử dụng tài nguyên khi chạy Chrome một cách rõ ràng.

Dựa trên các thử nghiệm, các trình duyệt không có giao diện người dùng sử dụng CPU ít hơn 75% và bộ nhớ ít hơn 65% so với Chrome hoặc Firefox đầy đủ.

Đối với khối lượng công việc quét nặng, tôi khuyên bạn nên sử dụng các tùy chọn trình duyệt không có giao diện người dùng. Chúng cung cấp sức mạnh kết xuất JavaScript với chi phí thấp hơn.

Bạn nên sử dụng thư viện Python nào để quét web?

Với tất cả các tùy chọn này, làm cách nào để bạn chọn đúng thư viện Python cho dự án quét web?

Dưới đây là hướng dẫn nhanh dựa trên các trường hợp sử dụng phổ biến nhất mà tôi từng thấy:

  • Yêu cầu HTTP cơ bản – Sử dụng thư viện Yêu cầu.

  • Vấn đề về hiệu suất – HTTPX cho async, LXML để phân tích cú pháp HTML nhanh.

  • Các trang web AJAX/JS nặng – Chọn tham gia tự động hóa trình duyệt Playwright hoặc Selenium.

  • Thu thập thông tin quy mô lớn – Khung quét web phế liệu.

  • Kiểm tra trình duyệt chéo – Lưới Selenium để phân phối.

  • Kết xuất JS nhẹ - Tùy chọn trình duyệt không đầu.

Không có giải pháp nào phù hợp cho tất cả. Điều quan trọng là sử dụng đúng công cụ cho nhu cầu cụ thể của bạn:

  • Đơn giản – Súp đẹp và yêu cầu
  • Tốc độ – Gevent, HTTPX, LXML
  • JavaScript – Nhà viết kịch, Selenium, Pyppeteer
  • Quy mô – Cụm phế liệu, Lưới Selenium
  • Khả năng mở rộng – Phần mềm trung gian và phần mở rộng có nhiều lỗi

Đánh giá các yếu tố này cho trường hợp sử dụng của bạn. Thông thường, cách tiếp cận tốt nhất là kết hợp các thư viện – ví dụ: sử dụng Scrapy kết hợp với Playwright và LXML.

Hệ sinh thái Python mang đến sự linh hoạt đáng kinh ngạc. Với tất cả các thư viện mạnh mẽ này theo ý của bạn, bạn có thể xây dựng các trình dọn dẹp có khả năng trích xuất dữ liệu từ hầu hết mọi trang web.

Quét được cung cấp bởi Python

Cảm ơn bạn đã đọc phần tổng quan này về các thư viện Python hàng đầu để quét web! Tôi đã cố gắng chia sẻ những bài học quan trọng từ kinh nghiệm của mình với tư cách là một chuyên gia cạo.

Dưới đây là một số bài học chính:

  • yêu cầu – Yêu cầu HTTP đơn giản.
  • HTTPX – Máy khách HTTP không đồng bộ nâng cao.
  • Súp đẹp – Phân tích và lặp lại HTML dễ dàng.
  • LXML – Trình phân tích cú pháp HTML/XML cực nhanh.
  • Selenium – Công cụ tự động hóa trình duyệt kỳ cựu.
  • Nhà soạn kịch – Người kế thừa thế hệ tiếp theo của Selenium.
  • Trị liệu – Khung thu thập dữ liệu web hạng nặng.
  • Lưới Selenium – Thử nghiệm trình duyệt phân tán có thể mở rộng.
  • Trình duyệt không đầu – Thực thi JS nhẹ.

Quét web bằng Python chưa bao giờ dễ dàng hơn thế. Với hệ sinh thái thư viện tuyệt vời này, bạn có thể xây dựng các trình thu thập dữ liệu để trích xuất dữ liệu từ hầu hết mọi trang web.

Hãy cho tôi biết nếu bạn có bất kì câu hỏi nào khác! Tôi luôn sẵn lòng trò chuyện nhiều hơn về các công cụ và chiến lược thu thập dữ liệu Python.

Tham gia vào cuộc đối thoại

Chúng tôi sẽ không công khai email của bạn. Các ô đánh dấu * là bắt buộc *