本文将分析如何使用 Python 搜刮 GitHub 仓库。我们将回顾一些著名的库,如 BeautifulSoup 和 Requests,并在构建 GitHub 脚本时进行详细讲解,以便您能轻松掌握。
什么是 Github 搜刮?使用 Github 的目的有很多,但最常见的包括:
GitHub 不仅为软件源提供托管服务,而且拥有庞大的用户群,良好的声誉使其成为可靠的选择。
GitHub 上存储的信息对于跟踪技术发展模式和改进软件开发非常有用。这些信息对于在信息技术领域与竞争对手保持同步至关重要。
说到刮擦网页,最容易使用的语言是 Python,因为它的库和模块非常多。要在 Github 上使用 Python 进行搜刮,必须添加以下模块:
使用 Github 搜索工具就可以轻松做到这一点。不过,让我们详细说明一下如何做到这一点。
本部分将介绍如何抓取 Github 资源库。制作刮板的重要步骤包括:
从现在起,我们将与大家分享所有这些步骤的细节以及完整的 Github 脚本。
确保你的机器上有 Python。接下来,创建一个新的 Python 虚拟环境,以开始 Github 的刮擦过程。
python -m venv github_scraper
source github_scraper/bin/activate # 适用于 MacOS 和 Linux
github_scraper\Scripts\activate # 适用于 Windows
就像我们之前说过的,BeautifulSoup 和 Requests 可以帮助你搜索 GitHub 仓库。在当前激活的虚拟环境中,执行此命令将它们纳入项目依赖关系:
pip install beautifulsoup4 requests
选择你想执行 Github 搜刮的任何版本库。首先,在变量中定义链接,然后发出 HTTP 请求,获取页面代码。
url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
要分析 HTML,需要将其输入 BeautifulSoup。
soup = BeautifulSoup(page.text, 'html.parser')
BeautifulSoup() 构造函数需要提供两样东西。
BeautifulSoup 将对 HTML 进行解析,并生成一个树形结构。更具体地说,汤变量包含从 DOM 树中选择相关元素所需的所有方法,例如
下面是另一个重要步骤:挑选简单的 HTML 元素并从中获取 Github 数据。这一步先于实际编写 Python Github 仓库脚本。
刮擦 Github 之前,先熟悉一下网页本身。然后,点击 F12 打开开发工具。打开代码后,您会发现页面上的许多元素都没有独特的类或属性,而这些类或属性可以让您轻松导航到相应的元素。浏览页面并准备提取数据。
现在,我们准备创建一个 Python 脚本,它将帮助我们搜索 GitHub 仓库。该脚本可以提取存储在 GitHub 中的有用信息,如星级、描述、最后提交等。为此,我们需要指定所需的特征并检索相应的文本值。
repo_title = soup.select_one('[itemprop="name"]').text.strip()
属性 itemprop="name" 的属性值具有唯一标识,因此我们要检索它。GitHub 上的文本字段一般都有空格和换行符,可以使用 strip() 进行清理。
git_branch_icon_html_element = soup.select_one('[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
要注意的是,没有更简单的方法来选择拥有主要分支标题的 HTML 组件。您能做些什么呢?选择一个唯一的类并获取文本。
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']
我们注意到,存储用户最后一次提交的相对时间标记已被选中,而日期是通过 datetime 选定的。
收集左侧的信息:描述、星级、景观、岔路口。
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(',', '')
自述文件非常重要。它提供了软件仓库的说明以及如何执行代码的说明。查看 readme.md 文件时,你可以注意到它有哪些链接:
https://raw.githubusercontent.com///readme.md
既然我们有了 ,我们就可以使用 f-string 以编程方式创建 URL,使用它并发出 HTTP 请求以获取文件代码。
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
如果版本库没有自述文件,请记住检查 404 错误,以避免保存 GitHub 404 网页的内容。
所有信息都将存储在一个字典中,因此我们可以轻松地将它们写入 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
我们将利用内置的 Python 库来分析数据,并将其存储为 JSON 格式,因为它非常适合嵌套结构,就像我们的例子中的文章列表。
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()
# 分支机构
main_branch = soup.select_one(
'[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
# 最新提交
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']
# 描述
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(',', '')
# 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)
我们已经研究了在 BeautifulSoup 和 Requests 的帮助下构建 GitHub 资源库刮擦脚本的过程。现在您已经知道如何访问网页、提取相关数据并以用户友好的方式对其进行编码。这些技能在分析知名项目、跟踪代码变更或生成报告时非常有用。
尽管如此,还是要注意合理使用。大多数情况下,GitHub 上会提供 API,使用起来会更简单实用。如果你决定执行网络搜刮,请确保遵守网站的指导原则,不要向服务器发出过多请求。
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
评论: 0