Trong bài viết này, chúng ta sẽ phân tích cách thu thập dữ liệu từ các kho lưu trữ GitHub bằng Python. Chúng ta sẽ xem xét các thư viện phổ biến như BeautifulSoup và Requests và giải thích chi tiết trong quá trình xây dựng một script thu thập dữ liệu từ GitHub để bạn có thể dễ dàng làm theo.
Thu thập dữ liệu GitHub là gì và nhằm mục đích gì? Có nhiều mục đích sử dụng nó, nhưng phổ biến nhất bao gồm:
GitHub không chỉ cung cấp dịch vụ lưu trữ kho mã mà còn có cơ sở người dùng rất lớn, cùng với danh tiếng tốt khiến nó trở thành một lựa chọn đáng tin cậy.
Thông tin được lưu trữ trên GitHub rất hữu ích trong việc theo dõi xu hướng phát triển công nghệ cũng như cải thiện quy trình phát triển phần mềm. Đây là thông tin quan trọng để bắt kịp các đối thủ trong lĩnh vực công nghệ thông tin.
Khi nói đến việc thu thập dữ liệu từ một trang web, ngôn ngữ dễ sử dụng nhất là Python vì nó có rất nhiều thư viện và mô-đun. Để thu thập dữ liệu từ GitHub bằng Python, bạn cần thêm các mô-đun sau:
Việc này có thể thực hiện rất dễ dàng bằng cách sử dụng các công cụ thu thập dữ liệu từ GitHub. Tuy nhiên, chúng ta hãy đi sâu vào cách thực hiện cụ thể.
Phần này sẽ hướng dẫn cách thu thập dữ liệu từ các kho GitHub. Các bước quan trọng để tạo trình thu thập bao gồm:
Từ đây, chúng tôi sẽ chia sẻ chi tiết cho tất cả các bước trên cùng với một script hoàn chỉnh để thu thập dữ liệu từ GitHub.
Đảm bảo rằng bạn đã cài đặt Python trên máy tính của mình. Tiếp theo, hãy tạo một môi trường ảo Python mới để bắt đầu quá trình thu thập dữ liệu từ GitHub.
python -m venv github_scraper
source github_scraper/bin/activate # Cho macOS và Linux
github_scraper\Scripts\activate # Cho Windows
Như đã đề cập trước đó, BeautifulSoup và Requests sẽ hỗ trợ bạn trong việc thu thập dữ liệu từ các kho GitHub. Trong môi trường ảo hiện đang được kích hoạt, hãy chạy lệnh sau để thêm chúng vào các thư viện phụ thuộc của dự án:
pip install beautifulsoup4 requests
Chọn bất kỳ kho lưu trữ nào mà bạn muốn thu thập dữ liệu từ GitHub. Trước tiên, hãy khai báo liên kết trong một biến, sau đó gửi yêu cầu HTTP để lấy mã của trang.
url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
Để phân tích HTML của bạn, hãy đưa nó vào trong BeautifulSoup.
soup = BeautifulSoup(page.text, 'html.parser')
Hàm khởi tạo BeautifulSoup() cần được cung cấp hai tham số.
HTML sẽ được phân tích bởi BeautifulSoup và một cấu trúc dạng cây sẽ được tạo ra. Cụ thể hơn, biến soup chứa tất cả các phương thức cần thiết để chọn các phần tử liên quan từ cây DOM, chẳng hạn như:
Đây là một bước quan trọng khác: chọn các phần tử HTML đơn giản và thu thập dữ liệu từ GitHub thông qua chúng. Bước này thực hiện trước khi bạn viết script Python cho kho lưu trữ GitHub.
Trước khi thu thập dữ liệu từ GitHub, bạn nên làm quen với chính trang web đó. Sau đó, mở công cụ dành cho nhà phát triển bằng cách nhấn phím F12. Khi bạn đã mở mã nguồn, bạn sẽ thấy rằng nhiều phần tử trên trang không có các lớp hoặc thuộc tính riêng biệt, điều này gây khó khăn cho việc điều hướng đến phần tử cần thiết. Hãy xem kỹ toàn bộ trang và chuẩn bị trích xuất dữ liệu.
Bây giờ chúng ta đã sẵn sàng để tạo một script Python giúp thu thập dữ liệu từ các kho GitHub. Script này có thể trích xuất các thông tin hữu ích được lưu trên GitHub như số sao (stars), mô tả, lần commit cuối cùng, v.v. Để thực hiện điều này, chúng ta cần xác định các thuộc tính cần thiết và truy xuất các giá trị văn bản tương ứng.
repo_title = soup.select_one('[itemprop="name"]').text.strip()
Thuộc tính itemprop="name" có một giá trị duy nhất, vì vậy chúng ta sẽ lấy nó ra. Các trường văn bản trên GitHub thường có khoảng trắng và ký tự xuống dòng, có thể được làm sạch bằng cách sử dụng hàm strip().
git_branch_icon_html_element = soup.select_one('[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
Hãy lưu ý rằng không có cách đơn giản nào hơn để chọn thành phần HTML chứa tiêu đề của nhánh chính. Vậy bạn nên làm gì? Hãy chọn một lớp (class) duy nhất và lấy nội dung văn bản từ đó.
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']
Chúng tôi đã nhận thấy rằng thẻ relative-time, nơi lưu trữ lần commit cuối cùng của người dùng, đã được chọn từ trước, và ngày tháng được lấy thông qua thuộc tính datetime.
Thu thập các thông tin nằm ở phía bên trái: mô tả, số sao, lượt xem, số lần fork.
bordergrid_html_element = soup.select_one('.BorderGrid')
about_html_element = bordergrid_html_element.select_one('h2')
description_html_element = about_html_element.find_next_sibling('p')
description = description_html_element.get_text().strip()
star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
stars_html_element = star_icon_html_element.find_next_sibling('strong')
stars = stars_html_element.get_text().strip().replace(',', '')
eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
watchers = watchers_html_element.get_text().strip().replace(',', '')
fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
forks_html_element = fork_icon_html_element.find_next_sibling('strong')
forks = forks_html_element.get_text().strip().replace(',', '')
Tệp readme rất quan trọng. Nó cung cấp mô tả về kho lưu trữ và hướng dẫn cách triển khai mã nguồn. Nếu bạn kiểm tra tệp readme.md, bạn sẽ thấy liên kết của nó như sau:
https://raw.githubusercontent.com///readme.md
Vì chúng ta đã có thông tin này, nên có thể tạo URL một cách lập trình bằng cách dùng f-string, sau đó gửi yêu cầu HTTP để lấy mã của tệp.
readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)
readme = None
if readme_page.status_code != 404:
readme = readme_page.text
Đừng quên kiểm tra lỗi 404 để tránh lưu nội dung từ trang lỗi GitHub nếu kho lưu trữ không có tệp readme.
Tất cả thông tin sẽ được lưu trong một từ điển (dictionary) duy nhất để có thể dễ dàng ghi chúng vào tệp JSON.
repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme
Chúng ta sẽ tận dụng thư viện tích hợp sẵn của Python để phân tích dữ liệu và lưu nó dưới định dạng JSON, rất phù hợp với các cấu trúc lồng nhau như trường hợp của chúng ta với các danh sách bài viết.
with open('github_data.json', 'w', encoding='utf-8') as json_file:
json.dump(repo, json_file, ensure_ascii=False, indent=4)
import json
import requests
from bs4 import BeautifulSoup
url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")
repo_title = soup.select_one('[itemprop="name"]').text.strip()
# chi nhánh
main_branch = soup.select_one(
'[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
# cam kết mới nhất
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']
# sự miêu tả
bordergrid_html_element = soup.select_one('.BorderGrid')
about_html_element = bordergrid_html_element.select_one('h2')
description_html_element = about_html_element.find_next_sibling('p')
description = description_html_element.get_text().strip()
# sao
star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
stars_html_element = star_icon_html_element.find_next_sibling('strong')
stars = stars_html_element.get_text().strip().replace(',', '')
# người theo dõi
eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
watchers = watchers_html_element.get_text().strip().replace(',', '')
# phuộc
fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
forks_html_element = fork_icon_html_element.find_next_sibling('strong')
forks = forks_html_element.get_text().strip().replace(',', '')
# readme
readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)
readme = None
if readme_page.status_code != 404:
readme = readme_page.text
repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme
with open('github_data.json', 'w', encoding='utf-8') as json_file:
json.dump(repo, json_file, ensure_ascii=False, indent=4)
Chúng ta đã tìm hiểu quá trình xây dựng một script thu thập dữ liệu từ GitHub cho các kho lưu trữ bằng cách sử dụng BeautifulSoup và Requests. Giờ đây, bạn đã biết cách truy cập các trang web, trích xuất dữ liệu liên quan và xử lý chúng theo cách thân thiện với người dùng. Những kỹ năng này rất hữu ích trong việc phân tích các dự án nổi tiếng, theo dõi thay đổi trong mã nguồn hoặc tạo báo cáo.
Tuy nhiên, hãy sử dụng một cách hợp lý. Phần lớn thời gian, GitHub đã cung cấp một API giúp làm việc dễ dàng và hiệu quả hơn. Nếu bạn quyết định sử dụng web scraping, hãy đảm bảo tuân thủ các nguyên tắc của trang web và đừng gửi quá nhiều yêu cầu tới máy chủ cùng lúc.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bình luận: 0