Beautiful Soup là một thư viện Python mã nguồn mở. Nó sử dụng trình phân tích cú pháp điều hướng để loại bỏ nội dung của các tệp XML và HTML. Bạn cần dữ liệu cho một số mục đích phân tích. Tuy nhiên, nếu bạn là người mới sử dụng Python và nạo web, thì thư viện Beautiful Soup của Python rất đáng để thử cho một dự án nạo web.
Với thư viện Beautiful Soup mã nguồn mở của Python, bạn có thể lấy dữ liệu bằng cách cắt bất kỳ phần hoặc phần tử nào của trang web với quyền kiểm soát tối đa đối với quy trình. Trong bài viết này, chúng tôi xem xét cách bạn có thể sử dụng Beautiful Soup để quét một trang web.
Cách cài đặt Beautiful Soup và bắt đầu với nó
Trước khi tiếp tục, trong bài viết hướng dẫn Beautiful Soup này, chúng ta sẽ sử dụng Python 3 và beautifulsoup4 , phiên bản mới nhất của Beautiful Soup. Đảm bảo rằng bạn tạo một môi trường ảo Python để cô lập dự án của mình và các gói của nó với các gói trên máy cục bộ của bạn.
Để bắt đầu, bạn phải cài đặt thư viện Beautiful Soup trong môi trường ảo của mình. Beautiful Soup có sẵn dưới dạng gói PyPi cho tất cả các hệ điều hành, vì vậy bạn có thể cài đặt nó bằng lệnh pip install beautifulsoup4 thông qua thiết bị đầu cuối.
Tuy nhiên, nếu bạn đang sử dụng Debian hoặc Linux, lệnh trên vẫn hoạt động, nhưng bạn có thể cài đặt nó bằng trình quản lý gói bằng cách chạy apt-get install python3-bs4 .
Beautiful Soup không cạo trực tiếp URL. Nó chỉ hoạt động với các tệp HTML hoặc XML được tạo sẵn. Điều đó có nghĩa là bạn không thể chuyển thẳng một URL vào đó. Để giải quyết vấn đề đó, bạn cần lấy URL của trang web mục tiêu với thư viện yêu cầu của Python trước khi đưa nó vào Beautiful Soup.
Để cung cấp thư viện đó cho trình quét của bạn, hãy chạy lệnh yêu cầu cài đặt pip qua thiết bị đầu cuối.
Để sử dụng thư viện phân tích cú pháp XML, hãy chạy pip install lxml để cài đặt nó.
Kiểm tra trang web bạn muốn cạo
Trước khi loại bỏ bất kỳ trang web nào mà bạn không quen thuộc, cách tốt nhất là kiểm tra các yếu tố của nó. Bạn có thể thực hiện việc này bằng cách chuyển trình duyệt của mình sang chế độ của nhà phát triển. Việc sử dụng Công cụ dành cho nhà phát triển của Chrome khá dễ dàng nếu bạn đang sử dụng Google Chrome.
Tuy nhiên, cần phải kiểm tra một trang web để biết thêm về các thẻ HTML, thuộc tính, lớp và id của nó. Làm điều đó cho thấy các yếu tố cốt lõi của một trang web và các loại nội dung của nó.
Nó cũng giúp bạn phát triển các chiến lược tốt nhất mà bạn có thể sử dụng để có được dữ liệu chính xác mà bạn muốn từ một trang web và cách bạn có thể lấy dữ liệu đó.
Cách quét dữ liệu trang web với món súp đẹp mắt
Bây giờ bạn đã có mọi thứ và sẵn sàng, hãy mở một trình soạn thảo mã ưu tiên và tạo một tệp Python mới, đặt cho nó một cái tên đã chọn. Tuy nhiên, bạn cũng có thể sử dụng các IDE dựa trên web như Jupyter Notebook nếu bạn không quen với việc chạy Python qua dòng lệnh.
Tiếp theo, nhập các thư viện cần thiết:
from bs4 import BeautifulSoup import requests
Trước hết, hãy xem thư viện yêu cầu hoạt động như thế nào:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com') print(website)
Khi bạn chạy đoạn mã trên, nó sẽ trả về trạng thái 200, cho biết rằng yêu cầu của bạn đã thành công. Nếu không, bạn nhận được trạng thái 400 hoặc một số trạng thái lỗi khác cho biết yêu cầu GET không thành công.
Hãy nhớ luôn thay thế URL của trang web trong ngoặc đơn bằng URL mục tiêu của bạn.
Khi bạn nhận được trang web với yêu cầu nhận , sau đó bạn chuyển nó cho Beautiful Soup, nơi hiện có thể đọc nội dung dưới dạng tệp HTML hoặc XML bằng cách sử dụng trình phân tích cú pháp XML hoặc HTML tích hợp của nó, tùy thuộc vào định dạng bạn đã chọn.
Hãy xem đoạn mã tiếp theo này để biết cách thực hiện việc này với trình phân tích cú pháp HTML:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com') soup = BeautifulSoup(website.content, 'html.parser') print(soup)
Đoạn mã trên trả về toàn bộ DOM của một trang web có nội dung của nó.
Bạn cũng có thể có được một phiên bản phù hợp hơn của DOM bằng công tô điểm phương pháp. Bạn có thể thử cái này để xem đầu ra của nó:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') print(soup.prettify())
Bạn cũng có thể lấy nội dung thuần túy của một trang web mà không cần tải phần tử của nó bằng phương thức .text :
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') print(soup.text)
Cách cạo nội dung của trang web theo tên thẻ
Bạn cũng có thể cắt nội dung trong một thẻ cụ thể với Beautiful Soup. Để thực hiện việc này, bạn cần bao gồm tên của thẻ mục tiêu trong yêu cầu quét Súp đẹp của mình.
Ví dụ: hãy xem cách bạn có thể lấy nội dung trong các thẻ h2 của một trang web.
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') print(soup.h2)
Trong đoạn mã trên, soup.h2 trả về phần tử h2 đầu tiên của trang web và bỏ qua phần còn lại. Để tải tất cả các phần tử h2 , bạn có thể sử dụng hàm tích hợp find_all và vòng lặp for của Python:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') h2tags = soup.find_all('h2') for soups in h2tags: print(soups)
Khối mã đó trả về tất cả các phần tử h2 và nội dung của chúng. Tuy nhiên, bạn có thể lấy nội dung mà không cần tải thẻ bằng cách sử dụng phương thức .string :
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') h2tags = soup.find_all('h2') for soups in h2tags: print(soups.string)
Bạn có thể sử dụng phương pháp này cho bất kỳ thẻ HTML nào. Tất cả những gì bạn cần làm là thay thế thẻ h2 bằng thẻ bạn thích.
Tuy nhiên, bạn cũng có thể loại bỏ nhiều thẻ hơn bằng cách chuyển danh sách các thẻ vào phương thức find_all . Ví dụ: khối mã bên dưới loại bỏ nội dung của thẻ a , h2 và tiêu đề :
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') tags = soup.find_all(['a', 'h2', 'title']) for soups in tags: print(soups.string)
Cách cạo trang web bằng ID và tên lớp
Sau khi kiểm tra một trang web bằng DevTools, nó cho bạn biết thêm về các thuộc tính id và lớp giữ mỗi phần tử trong DOM của nó. Sau khi bạn có phần thông tin đó, bạn có thể loại bỏ trang web đó bằng phương pháp này. Nó hữu ích khi nội dung của một thành phần đích đang lặp lại từ cơ sở dữ liệu.
Bạn có thể sử dụng phương thức tìm kiếm cho id và trình quét lớp. Không giống như phương thức find_all trả về một đối tượng có thể lặp lại, phương thức find hoạt động trên một mục tiêu duy nhất, không thể lặp lại, đó là id trong trường hợp này. Vì vậy, bạn không cần sử dụng vòng lặp for với nó.
Hãy xem một ví dụ về cách bạn có thể cắt nội dung của một trang dưới đây bằng cách sử dụng id:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') id = soup.find(id = 'enter the target id here') print(id.text)
Để thực hiện việc này đối với tên lớp, hãy thay thế id bằng lớp . Tuy nhiên, việc viết lớp trực tiếp dẫn đến nhầm lẫn cú pháp vì Python xem nó như một từ khóa. Để bỏ qua lỗi đó, bạn cần viết dấu gạch dưới trước lớp như sau: class_ .
Về bản chất, dòng chứa id trở thành:
my_classes = soup.find(class_ = 'enter the target class name here') print(my_classes.text)
Tuy nhiên, bạn cũng có thể loại bỏ một trang web bằng cách gọi một tên thẻ cụ thể với id hoặc lớp tương ứng của nó:
data = soup.find_all('div', class_ = 'enter the target class name here') print(data)
Cách làm Scraper có thể tái sử dụng với món súp đẹp mắt
Bạn có thể tạo một lớp và đặt tất cả mã trước đó lại với nhau thành một hàm trong lớp đó để tạo một trình quét có thể sử dụng lại lấy nội dung của một số thẻ và id của chúng. Chúng ta có thể làm điều này bằng cách tạo một hàm chấp nhận năm đối số: một URL, hai tên thẻ và id hoặc lớp tương ứng của chúng.
Giả sử bạn muốn tìm kiếm giá áo sơ mi từ một trang web thương mại điện tử. Lớp quét ví dụ bên dưới trích xuất giá và thẻ áo sơ mi với id hoặc lớp tương ứng của chúng và sau đó trả về nó dưới dạng khung dữ liệu Pandas với 'Giá' và Shirt_name làm tên cột.
Đảm bảo rằng bạn pip cài đặt gấu trúc qua thiết bị đầu cuối nếu bạn chưa làm như vậy.
import pandas as pd class scrapeit: try: def scrape(website=None, tag1=None, id1=None, tag2=None, id2=None): if not (website and tag1 and id1 and tag2 and id2)==None: try: page = requests.get(website) soup = BeautifulSoup(page.content, 'html.parser') infotag1 = soup.find_all(tag1, id1) infotag2 = soup.find_all(tag2, id2) priced = [prices.text for prices in infotag1] shirt = [shirts.text for shirts in infotag2] data = { 'Price':priced, 'Shirt_name':shirt} info = pd.DataFrame(data, columns=['Price', 'Shirt_name']) print(info) except: print('Not successful') else: print('Oops! Please enter a website, two tags and thier corresponding ids') except: print('Not successful!')
Máy quét bạn vừa tạo là một mô-đun có thể tái sử dụng và bạn có thể nhập và sử dụng nó trong một tệp Python khác. Để gọi hàm cạo từ lớp của nó, bạn sử dụng scrapeit.scrape ('URL trang web', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id') . Nếu bạn không cung cấp URL và các tham số khác, câu lệnh else sẽ nhắc bạn làm như vậy.
Để sử dụng trình quét đó trong một tệp Python khác, bạn có thể nhập nó như sau:
from scraper_module import scrapeit scrapeit.scrape('URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id')
Lưu ý: scraper_module là tên của tệp Python chứa lớp scraper.
Bạn cũng có thể xem tài liệu Beautiful Soup nếu bạn muốn tìm hiểu sâu hơn về cách bạn có thể sử dụng nó một cách hiệu quả nhất.
Beautiful Soup là một công cụ quét màn hình Python mạnh mẽ cho phép bạn kiểm soát cách dữ liệu của bạn đi qua trong quá trình quét. Đó là một công cụ kinh doanh có giá trị, vì nó có thể cung cấp cho bạn quyền truy cập vào dữ liệu web của đối thủ cạnh tranh như giá cả, xu hướng thị trường, v.v.
Mặc dù chúng tôi đã tạo công cụ quét thẻ trong bài viết này, nhưng bạn vẫn có thể sử dụng thư viện Python mạnh mẽ này để tạo ra các công cụ cạo hữu ích hơn.