Có phải là một ý tưởng hay khi học cách thu thập dữ liệu web không? Nếu bạn muốn tiết kiệm hàng trăm giờ làm việc, thì bạn nên học. Ngoài ra, đây là một kỹ năng tuyệt vời để trở thành một lập trình viên.
Thu thập dữ liệu web là quá trình trích xuất dữ liệu từ các trang web và vì dữ liệu có sẵn ở mọi nơi nên bạn có thể lấy và xử lý dữ liệu một cách hiệu quả bằng cách nắm vững các kỹ thuật cơ bản và nâng cao.
Chúng tôi đã biên soạn một hướng dẫn dành cho người mới bắt đầu bao gồm tất cả những điều cần thiết, từ việc hiểu cấu trúc trang web, tìm hiểu các kỹ thuật cơ bản cho đến các khái niệm nâng cao về thu thập dữ liệu web, để bạn có thể trở thành chuyên gia.
Hiểu cấu trúc trang web
Trước khi bắt đầu thu thập dữ liệu, bạn cần hiểu cấu trúc của trang web.
Đầu tiên, các trang web được xây dựng bằng mã. Phổ biến nhất là HTML (Ngôn ngữ đánh dấu siêu văn bản), CSS (Cascading Style Sheet) và JavaScript.
HTML là phổ biến nhất vì dễ sử dụng. Nó xác định cấu trúc và nội dung của các trang web bằng các thành phần được biểu thị bằng thẻ.
Ví dụ,
- <h1> cho tiêu đề,
- <p> cho các đoạn văn,
để kể ra một vài cái (và còn RẤT NHIỀU).
Sau đây là ví dụ về cách mã HTML trông như thế nào:
<html>
<head>
<title>Example Website</title>
</head>
<body>
<h1>Welcome to my website!</h1>
<p>This is a paragraph of text.</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</body>
</html>
</body>
</html>
Cuối cùng, CSS xác định kiểu dáng của các phần tử HTML, trong khi JavaScript chịu trách nhiệm về hành vi động của trang web.
Công cụ thu thập dữ liệu mà chúng ta sẽ sử dụng sẽ điều hướng trang bằng cấu trúc của trang và sẽ xác định nội dung cần trích xuất. Các trang web có cấu trúc có tổ chức và mô tả hơn có xu hướng dễ thu thập dữ liệu hơn. Và với tư cách là người mới bắt đầu, chắc hẳn bạn đánh giá cao điều đó phải không?
Thiết lập môi trường phát triển của bạn
Bây giờ bạn đã có ý tưởng về cấu trúc trang web, bạn có thể bắt đầu thiết lập môi trường phát triển của mình.
Đầu tiên, bạn cần chọn một ngôn ngữ lập trình, vì không phải tất cả đều phù hợp với nhiệm vụ này. Python là lựa chọn phổ biến nhất để thu thập dữ liệu vì nó có trình độ cao, dễ sử dụng và cũng có các thư viện, khung và công cụ tích hợp tuyệt vời.
Chúng cho phép giải quyết một nhiệm vụ cụ thể liên quan đến việc thu thập dữ liệu, chẳng hạn như sau:
- Requests: giúp tạo các yêu cầu HTTP đến trang web mục tiêu dễ dàng hơn.
- BeautifulSoup: thư viện này được sử dụng để phân tích cú pháp tài liệu HTML và XML. Nhưng, hãy đợi một chút, phân tích cú pháp là gì? Đó là quá trình phân tích và diễn giải dữ liệu có cấu trúc.
- Selenium: tự động hóa trình duyệt web để thực hiện các tác vụ mô phỏng tương tác của con người.
- Scrapy: khuôn khổ toàn diện này có thể được sử dụng cho nhiều tác vụ khác nhau, như thu thập dữ liệu trên web (tìm kiếm URL để trích xuất dữ liệu), khai thác dữ liệu và thử nghiệm tự động.
Bắt đầu thế nào?
- Thiết lập môi trường: tải xuống phiên bản Python mới nhất và cài đặt. Dễ như trở bàn tay.
- Thiết lập môi trường ảo: Tạo môi trường ảo để giữ các phụ thuộc của dự án của bạn được cô lập. Mở terminal và chạy các lệnh sau:
python -m venv myenv
source myenv/bin/activate # For Unix/Linux
myenv\Scripts\activate.bat # For Windows
3. Cài đặt các thư viện và công cụ: Tôi khuyên bạn nên cài đặt Requests, Selenium, BeautifulSoup và Scrapy để bắt đầu. Bạn có thể cài đặt chúng bằng cách sử dụng “pip install”, chỉ cần mở terminal và chạy lệnh sau:
pip install requests beautifulsoup4 scrapy selenium
Web Scraping 101: Đạo đức và Thực hành Tốt nhất
Đợi đã. Trước khi đi sâu vào các khía cạnh kỹ thuật, chúng ta hãy xem xét những tác động về mặt đạo đức và các biện pháp thực hành tốt nhất của việc thu thập dữ liệu web.
Mọi người dùng scraper đều biết điều này, nhưng người mới cần hiểu các hướng dẫn sau để có thể tuân thủ đúng giới hạn:
- Tôn trọng Robots.txt: Quy tắc đầu tiên khi thu thập dữ liệu là bạn phải tôn trọng Robots.txt. Đây là tệp văn bản mà mọi trang web đều có, cho phép mọi người biết về cơ bản những gì bạn có thể thu thập và những gì bạn không thể.
- Tôn trọng các điều khoản dịch vụ của trang web: kiểm tra các điều khoản dịch vụ của trang web để xem liệu có được phép thu thập dữ liệu web hay không.
- Hạn chế tần suất quét và tác động lên máy chủ: Tránh thực hiện quá nhiều yêu cầu trong thời gian ngắn. Ngoài ra, tránh làm quá tải máy chủ bằng cách thực hiện độ trễ giữa các yêu cầu.
- Sử dụng API (nếu có): trước khi thu thập dữ liệu, hãy kiểm tra xem trang web có cung cấp API để truy cập dữ liệu không. Tôi sẽ kể cho bạn nghe về những lần tôi làm việc trên một trình thu thập dữ liệu chỉ để tìm ra API khả dụng, nhưng tôi đã không bận tâm kiểm tra. Sử dụng API dễ hơn nhiều (tin tôi đi) vì nó cung cấp dữ liệu có cấu trúc.
- Cân nhắc về mặt pháp lý: kiểm tra luật để đảm bảo bạn không vi phạm bất kỳ quyền sở hữu trí tuệ nào hoặc vi phạm bất kỳ quy tắc nào. Nếu bạn không chắc chắn, tốt hơn hết bạn nên tham khảo ý kiến luật sư trước.
Bắt đầu với Web Scraping: Các kỹ thuật cơ bản
Được rồi, chúng ta đã xong phần lý thuyết và khái niệm, hãy bắt đầu làm việc. Điều đầu tiên bạn sẽ học là cách gửi yêu cầu HTTP.
Gửi yêu cầu HTTP (GET, POST) với Thư viện yêu cầu của Python
Ở đây chúng ta sẽ sử dụng thư viện Requests trong Python. Hãy xem một ví dụ:
import requests
url = 'https://example.com'
response = requests.get(url)
html_content = response.text
Tại đây bạn chỉ định URL của trang bạn muốn thu thập. Với requests.get () chúng tôi đang gửi yêu cầu GET và nội dung HTML của trang được lưu trữ trong biến html_content.
Phân tích cú pháp HTML với BeautifulSoup
Sau khi có nội dung HTML, bạn có thể phân tích cú pháp bằng thư viện BeautifulSoup để trích xuất dữ liệu cụ thể. Sau đây là một ví dụ:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
title = soup.find('h1').text
paragraphs = soup.find_all('p')
Trong mã này, chúng ta tạo một đối tượng BeautifulSoup bằng cách truyền nội dung HTML và chỉ định trình phân tích cú pháp (trong trường hợp này là 'html.parser'). Sau đó chúng ta có thể sử dụng các phương pháp như find() Và find_all() để xác định vị trí các thành phần cụ thể dựa trên thẻ hoặc thuộc tính của chúng.
Trích xuất dữ liệu bằng cách sử dụng các phương thức và bộ chọn CSS như find() và find_all()
Bộ chọn CSS cung cấp một cách mạnh mẽ để định vị các thành phần trên trang web. BeautifulSoup cho phép bạn sử dụng bộ chọn CSS để trích xuất dữ liệu.
Sau đây là một ví dụ:
links = soup.select('a.external-link')
for link in links:
href = link['href']
text = link.text
print(f"Link: {href}, Text: {text}")
Trong mã này, chúng tôi sử dụng select() phương pháp tìm tất cả các thẻ có lớp “external-link“. Sau đó, chúng ta có thể lặp lại các phần tử đã chọn và trích xuất các thuộc tính hoặc văn bản mong muốn.
Lưu dữ liệu đã thu thập vào tệp
Sau khi trích xuất dữ liệu mong muốn, bạn có thể lưu dữ liệu đó vào tệp để phân tích hoặc xử lý thêm. Sau đây là ví dụ về cách lưu dữ liệu vào tệp CSV:
import csv
data = [
['Name', 'Age', 'City'],
['John', '25', 'New York'],
['Alice', '30', 'London'],
]
with open('output.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerows(data)
Trong mã này, chúng tôi định nghĩa một danh sách các hàng dữ liệu, mở một tệp có tên “output.csv” ở chế độ ghi, tạo một đối tượng ghi CSV và ghi các hàng dữ liệu vào tệp.
Đây là những kỹ thuật cơ bản bạn phải thực hành. Khi bạn tiếp tục, bạn sẽ thấy có một số trường hợp mà việc thu thập dữ liệu trở nên khó khăn, chẳng hạn như các trang web động hoặc phân trang.
Đừng lo lắng, (gần như) mọi trang web đều có thể bị sao chép nếu bạn biết đúng kỹ thuật và có công cụ phù hợp.
Xử lý Phân trang và Nhiều trang
Thuật ngữ “phân trang” dùng để chỉ các trang web chia nội dung của họ thành nhiều trang. Nếu bạn muốn trích xuất dữ liệu từ tất cả các trang, bạn phải xác định mẫu phân trang. Theo cách này, bạn có thể sửa đổi vòng lặp trích xuất của mình và nhận được kết quả.
Hãy kiểm tra các kỹ thuật sau:
- Xác định các mẫu phân trang trong URL: Tìm kiếm các mẫu trong cấu trúc URL cho biết số trang. Ví dụ, các URL như https://example.com/page/1, https://example.com/page/2v.v., tuân theo một mẫu phân trang rõ ràng.
- Sửa đổi vòng lặp thu thập dữ liệu: Điều chỉnh vòng lặp thu thập dữ liệu của bạn để lặp lại trên phạm vi số trang. Ví dụ:
for page in range(1, 11):
url = f"https://example.com/page/{page}"
# Scrape data from each page
Trong đoạn mã này, chúng tôi lặp lại các số trang từ 1 đến 10 và xây dựng URL cho từng trang một cách động.
3. Phát hiện sự hiện diện của “Next” nút: Một số trang web sử dụng “Next” thay vì số trang rõ ràng. Trong những trường hợp như vậy, bạn có thể kiểm tra sự hiện diện của “Next” và tiếp tục cạo cho đến khi nó biến mất.
Xử lý các trang web động và kết xuất JavaScript
Là một người thu thập dữ liệu, chắc chắn bạn sẽ gặp phải các trang web có tính tương tác cao và phức tạp, mục đích là nâng cao trải nghiệm của người dùng. Các loại trang web này phụ thuộc rất nhiều vào JavaScript và thường được gọi là các trang web có nội dung động.
Nhưng, có gì phải bàn cãi về điều này? Vấn đề là ở những trang web này, mã nguồn có thể không chứa dữ liệu mong muốn và chúng là một thách thức cho việc thu thập dữ liệu.
Đây là lúc bạn phải sử dụng các công cụ như Selenium.
Selenium là một công cụ mạnh mẽ để tự động hóa trình duyệt web. Nó cho phép bạn tương tác với các trang web, điền vào biểu mẫu, nhấp vào nút và trích xuất dữ liệu từ nội dung được hiển thị động.
Thiết lập Selenium
Nếu bạn đã cài đặt Selenium, việc tiếp theo bạn phải làm là cài đặt trình điều khiển web cho trình duyệt ưa thích của bạn. Ví dụ: ChromeDriver cho Google Chrome.
Sau đây là ví dụ về cách sử dụng nó:
from selenium import webdriver
driver = webdriver.Chrome() # Assumes ChromeDriver is installed and in PATH
driver.get('https://example.com')
# Perform actions and extract data
title = driver.find_element_by_tag_name('h1').text
driver.quit()
Trong mã này, chúng tôi tạo một phiên bản của trình điều khiển web Chrome, điều hướng đến một URL cụ thể bằng cách sử dụng driver.get(), sau đó thực hiện các hành động và trích xuất dữ liệu bằng các phương pháp của Selenium như find_element_by_tag_name().
Đang chờ các phần tử tải
Trong các trang web động, nội dung thường không tải cùng lúc. Vì vậy, một số thành phần có thể không có sẵn ngay khi trang tải. Bạn có thể xử lý việc này bằng cách sử dụng các lệnh chờ rõ ràng và ngầm định của Selenium.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)<br>element = wait.until(EC.presence_of_element_located((By.ID, 'my-element-id')))
Trong mã này, chúng ta tạo một đối tượng WebDriverWait với thời gian chờ là 10 giây. Sau đó, chúng ta sử dụng phương thức until() để chờ sự hiện diện của một phần tử có ID cụ thể.
Các lựa chọn thay thế cho Selenium
Mặc dù nhiều người dùng cho rằng Selenium là công cụ tốt nhất cho các trang web động, bạn nên khám phá các giải pháp thay thế để xem giải pháp nào phù hợp nhất với mình.
Scrapy-Splash có thể là một lựa chọn. Đó là sự tích hợp của trình duyệt không đầu với khung Scrapy. Nó cho phép trích xuất dữ liệu hiệu quả hơn nhờ cơ sở hạ tầng mạng không chặn của Scrapy và các tính năng nâng cao của Splash để hiển thị các trang web động nhanh chóng.
Requests-html là một giải pháp thay thế khác vì nó mở rộng chức năng của thư viện requests bằng cách thêm hỗ trợ cho việc hiển thị JavaScript và tương tác với các trang web.
Kỹ thuật trích xuất dữ liệu web nâng cao
Khi bạn bắt đầu đạt được tiến bộ, bạn sẽ thấy rằng mình xử lý được một số tình huống khó khăn, nhưng bạn cũng phải đối mặt với những tình huống phức tạp đòi hỏi các kỹ thuật tiên tiến hơn.
Xử lý xác thực và cookie
Một số trang web yêu cầu xác thực hoặc sử dụng cookie để quản lý phiên người dùng. Bạn có thể xử lý xác thực bằng cách gửi thông tin đăng nhập cùng với yêu cầu của mình và quản lý cookie bằng các thư viện như requests hoặc http.cookiejar.
Tránh bị phát hiện và cấm
Các trang web có thể sử dụng các biện pháp để phát hiện và chặn các hoạt động thu thập dữ liệu web. Để tránh bị phát hiện, bạn có thể sử dụng các kỹ thuật như xoay vòng tác nhân người dùng, sử dụng proxy và tạo độ trễ ngẫu nhiên giữa các yêu cầu.
Lưu trữ dữ liệu trong cơ sở dữ liệu
Thay vì lưu dữ liệu đã thu thập vào tệp, bạn có thể lưu trữ dữ liệu đó trong cơ sở dữ liệu để lưu trữ và truy xuất hiệu quả hơn. Các lựa chọn phổ biến bao gồm cơ sở dữ liệu SQL như MySQL và PostgreSQL, và cơ sở dữ liệu NoSQL như MongoDB.
Thu thập API và Xử lý Dữ liệu JSON
Này! Bạn đã tìm thấy API. Nhưng nó ở định dạng JSON. Bạn có thể làm gì? Bạn có thể sử dụng các thư viện như requests để thực hiện các yêu cầu API và phân tích cú pháp phản hồi JSON bằng mô-đun json trong Python.
Quét song song và không đồng bộ
Để tăng tốc quá trình thu thập dữ liệu, bạn có thể tận dụng kỹ thuật xử lý song song và lập trình không đồng bộ. Các thư viện như đa xử lý, luồng và asyncio trong Python có thể giúp bạn thực hiện điều này.
Tổng hợp tất cả lại với nhau: Các dự án thu thập dữ liệu web thực tế
Là một người mới, khi tôi bắt đầu quá trình đào tạo scraping, tôi cảm thấy mình hoàn toàn biết mình phải làm gì, cho đến khi tôi phải làm. Không có ích gì khi chỉ đọc, bạn phải kiểm tra kỹ năng của mình bằng cách thực hành.
Và còn cách nào tốt hơn là làm việc trên các dự án thực tế?
Hãy cùng xem một số ví dụ với quy trình từng bước của họ:
Ví dụ 1: Thu thập các bài viết tin tức và phân tích tình cảm
- Lên kế hoạch cho quá trình thu thập dữ liệu:
- Xác định trang web tin tức để thu thập
- Xác định cấu trúc của bài viết (tiêu đề, nội dung, ngày tháng, v.v.)
- Lên kế hoạch định dạng lưu trữ dữ liệu (ví dụ: CSV, cơ sở dữ liệu)
- Triển khai trình thu thập dữ liệu:
- Sử dụng yêu cầu để lấy nội dung HTML của trang web tin tức
- Phân tích cú pháp HTML bằng BeautifulSoup để trích xuất thông tin bài viết
- Xử lý phân trang và điều hướng qua nhiều trang
- Lưu trữ dữ liệu đã thu thập theo định dạng đã chọn
- Phân tích và trực quan hóa dữ liệu đã thu thập:
- Thực hiện phân tích tình cảm trên nội dung bài viết bằng các thư viện như NLTK hoặc TextBlob
- Hình dung điểm số tình cảm bằng cách sử dụng các thư viện như Matplotlib hoặc Plotly
- Xác định xu hướng và mô hình trong tâm lý tin tức theo thời gian
Ví dụ 2: Xây dựng công cụ giám sát giá
- Thu thập thông tin sản phẩm từ các trang web thương mại điện tử:
- Xác định các trang web thương mại điện tử để thu thập
- Xác định cấu trúc thông tin sản phẩm (tên, giá, tình trạng còn hàng, v.v.)
- Sử dụng các kỹ thuật thu thập dữ liệu web để trích xuất dữ liệu sản phẩm từ nhiều trang web
- Thiết lập cảnh báo và thông báo:
- Xác định ngưỡng giá hoặc tiêu chí khả dụng cho từng sản phẩm
- Triển khai cơ chế so sánh giá đã thu thập với ngưỡng đã xác định
- Thiết lập thông báo qua email hoặc SMS để cảnh báo người dùng khi giá giảm hoặc sản phẩm có sẵn
- Triển khai trình thu thập dữ liệu lên đám mây:
- Chọn một nền tảng đám mây (ví dụ: AWS, Google Cloud, Heroku)
- Cấu hình môi trường và các phụ thuộc cần thiết
- Lên lịch cho trình thu thập dữ liệu chạy theo các khoảng thời gian đều đặn
- Lưu trữ dữ liệu đã thu thập trong cơ sở dữ liệu đám mây để dễ dàng truy cập và theo dõi
Khung và công cụ thu thập dữ liệu web
Tôi biết rằng các thuật ngữ “khung” và “thư viện” được sử dụng thay thế cho nhau, nhưng chúng có nghĩa khác nhau và được sử dụng cho các mục đích khác nhau.
Với các thư viện như Request hoặc BeautifulSoup, bạn có thể xây dựng trình thu thập dữ liệu web từ đầu. Tuy nhiên, với các khung, bạn có thể đơn giản hóa quy trình vì chúng là tập hợp các công cụ và thư viện.
Hãy xem theo cách này, thư viện giống như xe lái thủ công, cho bạn toàn quyền kiểm soát nhưng đòi hỏi nhiều nỗ lực và kỹ năng hơn để điều hướng. Trong khi đó, các khung giống như xe tự động; chúng cung cấp trải nghiệm mượt mà và hiệu quả hơn bằng cách đơn giản hóa nhiều khía cạnh tẻ nhạt của việc thu thập dữ liệu.
Một số lựa chọn phổ biến nhất là:
Scrapy
Scrapy là một khuôn khổ cho Python với hệ sinh thái hoàn chỉnh để xây dựng các trình thu thập dữ liệu web có khả năng mở rộng và hiệu quả. Các tính năng chính của nó là:
- Thiết kế nhanh chóng.
- Không cần thêm mã để tạo tệp CSV, JSON và các tệp khác.
- Hỗ trợ XPath và CSS Selectors.
- Hệ sinh thái mở rộng tuyệt vời, như hỗ trợ phần mềm trung gian.
- Tích hợp với các đường ống mục để xử lý và lưu trữ dữ liệu
PySpider
PySpider cũng là một framework cho Python, nhưng không giống như Scrapy, nó tương thích với JavaScript, đây là tính năng mạnh hơn của nó. Nó cũng tuyệt vời cho người mới bắt đầu. Các tính năng chính của nó bao gồm:
- Hỗ trợ kết xuất JavaScript bằng PhantomJS hoặc Puppeteer
- Hàng đợi tác vụ và trình lập lịch tích hợp
- Tích hợp với cơ sở dữ liệu và hàng đợi tin nhắn
- Hỗ trợ đồng thời
Công cụ và dịch vụ thu thập dữ liệu web
Ngoài các khuôn khổ, còn có một số công cụ và dịch vụ giúp bạn thực hiện việc thu thập dữ liệu dễ dàng hơn. Điểm tuyệt vời nhất là chúng yêu cầu mã hóa tối thiểu. Một số tùy chọn là:
- Octoparse: Công cụ thu thập dữ liệu web dựa trên nền tảng đám mây với giao diện trỏ và nhấp để trích xuất dữ liệu từ các trang web.
- ParseHub: Một ứng dụng máy tính để bàn cho phép bạn tạo trình thu thập dữ liệu web bằng cách chọn trực quan các thành phần trên trang web.
- Import.io: Một nền tảng dựa trên web cung cấp các công cụ để trích xuất dữ liệu từ các trang web và API.
Tóm tắt những nguyên tắc cơ bản của Web Scraping
Trong hướng dẫn này, chúng tôi đã đề cập rộng rãi đến những kiến thức cơ bản về thu thập dữ liệu web, chẳng hạn như hiểu cấu trúc trang web, các cân nhắc về mặt đạo đức, các kỹ thuật cơ bản và nâng cao, cùng các công cụ và khuôn khổ bổ sung.
Bạn đã sẵn sàng để bắt đầu, nhưng hãy cân nhắc mở rộng kiến thức bằng cách đọc thêm các tài liệu khác, như tài liệu chính thức về thư viện và khung, cũng như hướng dẫn trích xuất dữ liệu web.
Ngoài ra, hãy cố gắng tìm kiếm sự hướng dẫn từ những người có kinh nghiệm trong các cộng đồng và diễn đàn scraping. Đừng cô lập, vì chúng ta cần nhau.
Chúng ta đều từng là người mới bắt đầu, vì vậy hãy nhẹ nhàng với bản thân, bắt đầu từ những việc nhỏ và luyện tập thường xuyên. Với đủ sự luyện tập và cống hiến, bạn sẽ thấy mình có thể giải quyết các dự án phức tạp hơn khi bạn tiến bộ.