返回博客

如何抓取 GitHub: 实用教程 2025

GitHub 是互联网上最重要的技术知识来源之一,对于构建复杂应用程序的开发人员来说尤其如此。跟随本指南学习如何提取这些宝贵的数据,毫不费力地紧跟最新技术趋势。

James Keenan

2月 13日, 2025年

10 分钟阅读

了解 GitHub 数据

开源项目文化为开发人员提供了许多分享、贡献和合作的机会,这些项目塑造了技术的未来。GitHub 就是这样一个知识共享中心。

这个想法基于 Git 系统,它提供了一种维护和版本控制代码以及与其他开发人员就共享项目进行协作的简便方法。在更大范围内,几乎任何人都可以为大型项目做出贡献、提出问题或重复使用代码作为自己想法的起点(也称为分叉)。

每个项目都位于其专用的资源库中。这是一个包含项目所有信息的页面,包括项目描述、代码文件、版本、更新日志、许可证、贡献者、使用的编程语言等等。这些项目就是我们在 GitHub 上搜索信息时要找的内容。让我们来看看其中最有价值的几项:

  • 代码文件。代码文件是每个软件源的基础和黄油,包含整个项目的文件夹和文件。任何人都可以通过它了解应用程序在幕后是如何工作的,查看脚本文件,以及它们是按照怎样的逻辑运行的。
  • 阅读说明。默认情况下,所有软件源都需要有一个 README 文件。顾名思义,该文件希望你在继续前行之前阅读它,因为它包含了项目的所有必要信息。该文件包括说明、设置和启动项目的分步指南,以及其他有用的信息和提示。
  • 叉和星。GitHub 并不完全是一个社交媒体平台,但如果它有 “赞 ”和 “分享 ”的话,这些就相当于。星星只是人们收藏或支持项目的一种方式--星星越多,项目越受欢迎,证明代码对许多人有用且有价值。分叉代表该版本库被分叉的次数。换句话说,它显示了有多少克隆版本库将其作为启动项目或构建、更新或修复原始版本库中某些内容的基础。
  • 问题和拉取请求。如果你曾在一个团队中参与过软件项目,你就会知道大多数交流都是抱怨、争论和修复代码。这正是 GitHub 所提供的,因此开发人员可以在这里找到家的感觉。问题板块允许用户提交问题单,供贡献者修复。更多乐于助人的人则会亲自动手,提交拉取请求。这些请求是接受他们对代码某部分的修改,以修复或改进代码。

总而言之,GitHub 提供了大量宝贵的技术数据。从大公司到个人项目,每个版本库中都有有用的信息。让我们来学习如何有效地收集和分析这些数据,以满足您的业务或个人需求。

选择正确的工具

有许多工具可用于 GitHub 搜索。你可以选择标准的 Requests + Beautiful Soup 组合,也可以选择 Scrapy 这样的一体化解决方案。还有一些开源项目(如 github3.py)提供了与 GitHub API 交互的增强方法。本指南将只详细介绍其中的几种方法,但请记住,你所选择的工具完全取决于你的个人选择、需求和可用功能。

使用美丽汤的请求

如果你尝试过网络搜刮,那么 Requests 和 Beautiful Soup 这两个名字可能不会陌生。它们是目前最流行的 Python 库之一,提供简单的语法和强大的功能,可以向网站发出请求,并有效地从网站中抓取和解析信息。下面是一个代码示例,告诉你如何解析你想要的任何资源库的 HTML:

import requests
from bs4 import BeautifulSoup
url = 'https://github.com/Smartproxy/Smartproxy'
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
print(soup.contents)

脚本会将整个页面的 HTML 代码打印到控制台中。更准确地说,您可以利用 Beautiful Soup 的各种方法,如 find()。下面是一个仅提取 about 部分的示例:


import requests
from bs4 import BeautifulSoup
url = 'https://github.com/Smartproxy/Smartproxy'
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
about_section = soup.find(class_='f4 my-3')
print(about_section.text)

这种方法可以顺利地从 GitHub 仓库中提取任何内容。不过,如果试图获取其中一条提交信息,就会遇到脚本返回 None 的问题。要找出原因,我们可以禁用 JavaScript 查看网站。看起来就是这样:

问题在于 GitHub 使用动态呈现内容,这意味着并非所有信息都会在首次请求网站后出现。在通常情况下,使用网页浏览器时,网站的基本内容会首先加载,然后在 JavaScript 的帮助下渲染其余信息。遗憾的是,我们无法告诉脚本只用 Requests 和 Beautiful Soup 来等待所有内容加载完毕。

这种方法最容易实现,而且可以完成大多数刮擦任务。不过,这种方法也有其局限性,可能不适合动态网页不断变化的环境。

Selenium

要抓取动态内容,您需要一个工具在执行任何抓取任务前渲染整个页面。Selenium 是一款基于 Python 的自动化工具,通常用于网络浏览器测试,但也可用于动态网络内容的搜刮。其友好的用户界面使其易于使用和上手。

在下面的章节中,我们将探讨如何使用 Python 设置 Selenium,以便从 GitHub 存储库中抓取数据。如果你正在寻找基于 JavaScript 的解决方案,你可能还想看看 PuppeteerPlaywright 库,作为替代选择。

如何抓取 GitHub 仓库?

要抓取任何 GitHub 仓库,你必须掌握检查网页、查看 HTML 和选择包含所需数据的元素的基本方法。然后,您需要设置并安装 Selenium 等工具,用它来编写脚本,加载网站,提取所需数据,并以易于阅读的方式存储。

听起来很难理解?不用担心,我们将逐步讲解每一个要点。本指南结束时,你就能编写和修改自己的 Selenium 脚本,搜刮任何你想要的 GitHub 数据了。

设置环境

让我们从安装 Selenium 开始,在我们的项目中使用它。确保计算机上安装了 Python 以及 pip packet 管理器。然后,在终端工具中输入以下命令:

pip install selenium
pip install beautifulsoup4

第一条命令将下载并安装最新版本的 Selenium 及其依赖项。第二个命令将安装我们已经熟悉的 Beautiful Soup 库——它在刮擦网络时的价值不言而喻。Selenium 还需要一个 WebDriver 才能与网络浏览器交互。你需要为你要使用的浏览器下载相应的 WebDriver。Selenium 支持各种网络浏览器,如 Chrome、Firefox、Safari 等。你可以在以下链接中找到 WebDriver:

最后,让我们运行一个简单的脚本,检查 Selenium 和 WebDrivers 是否都已正确安装。新建一个包含以下代码的 Python example_file.py

from selenium import webdriver
driver = webdriver.Chrome() # Or webdriver.Firefox(), depending on your browser choice
driver.get("https://www.example.com")
print(driver.title)
driver.quit()

要执行脚本,请打开终端工具,导航到文件所在的目录(使用 cd 命令),然后键入:

python example_file.py

你会看到一个浏览器窗口出现并短暂加载页面。随后,浏览器会在终端窗口中打印网页标题。在本例中,你应该看到 Example Domain。你可以用不同的网页进行测试,看看它是否能正确返回标题。如果是,则说明 Selenium 设置正确!

如何构建 GitHub 搜刮器?

让我们用 Requests 和 Beautiful Soup 重复前面的示例,并从 Smartdaili 的主仓库中抓取关于部分。你还需要导入一些 webdriver 库和 Beautiful Soup。代码如下

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
# Set up the Chrome WebDriver
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
# URL of the web page
url = "https://github.com/Smartproxy/Smartproxy"
# Open the web page
driver.get(url)
# Get the page HTML source
page_source = driver.page_source
# Parse the HTML using BeautifulSoup
soup = BeautifulSoup(page_source, "html.parser")
# Find the element with the specified class name
about_element = soup.find(class_="f4 my-3")
about_text = about_element.text.strip()
# Print the About section content
print(about_text)
# Close the browser
driver.quit()

脚本打开网页,获取 HTML 内容,对其进行解析,然后使用 Beautiful Soup 的 find() 方法提取符合所提供类的元素。你可以进一步修改代码,根据类、父元素或页面上的位置提取不同的元素。有了正确的提示,你几乎可以从 GitHub 仓库中提取任何数据!

你可能会问,这与通常的 Requests 和 Beautiful Soup 脚本有何不同。在某种程度上,它执行的是相同的过程,返回的是相同的结果。不过,Selenium 有一个我们尚未触及的优势--渲染动态内容的能力。由于 about 部分不是动态加载的,因此使用这两种方法没有区别。渲染内容(如提交信息)需要 Selenium 的能力,即等到加载完成后才从页面获取内容。

高级技术

您需要在脚本中添加一个延迟来抓取动态内容。让我们尝试通过添加 implicitly_wait() 方法来抓取提交消息,该方法将等待 10 秒钟来渲染 JavaScript。我们还使用了 selenium-wire 工具,它扩展了常规 Selenium WebDriver 的功能。然后,它会循环查看提交信息,并将它们全部打印在终端中:

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
# URL of the web page
url = "https://github.com/Smartproxy/Smartproxy"
# Open the web page
driver.get(url)
# Set an implicit wait time to wait for JavaScript to render
driver.implicitly_wait(10) # Wait for 10 seconds
# Get the page HTML source
page_source = driver.page_source
# Parse the HTML using BeautifulSoup
soup = BeautifulSoup(page_source, "html.parser")
# Find all elements with the class "react-directory-commit-message"
commit_messages = soup.find_all(class_="react-directory-commit-message")
# Loop through the results and print them
for commit_message in commit_messages:
print(commit_message.text.strip())

就像变魔术一样,Selenium 会加载网页,等待网页完全加载完毕,然后获取所需的信息。

还有一点要记住:来自同一 IP 地址的重复请求可能导致你被 GitHub 屏蔽或限制速率。这一点在尝试同时抓取多个版本库时尤为重要。值得庆幸的是,Smartdaili 提供的代理可以帮助您轻松解决这些问题。

代理是您与目标之间的中介。它接收您的请求,将其重新路由到具有不同 IP 地址的不同位置,并代表您发出请求。这样,您的活动就完全匿名了,因为您的每一个请求都来自不同的 IP 地址。这样,您就可以尽可能多地发出请求,而不必担心受到限制!

要在脚本中加入 Smartproxy 代理,请从仪表板中获取验证和端点信息。然后,像这样在脚本中输入认证和端点:端口信息:

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
# Selenium Wire configuration to use a proxy
proxy_username = 'user'
proxy_password = 'pass'
seleniumwire_options = {
'proxy': {
'http': f'http://{proxy_username}:{proxy_password}@endpoint:port',
'verify_ssl': False,
},
}
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, seleniumwire_options=seleniumwire_options)
# URL of the web page
url = "https://github.com/Smartproxy/Smartproxy"
# Open the web page
driver.get(url)
# Set an implicit wait time to wait for JavaScript to render
driver.implicitly_wait(10) # Wait for 10 seconds
# Get the page HTML source
page_source = driver.page_source
# Parse the HTML using BeautifulSoup
soup = BeautifulSoup(page_source, "html.parser")
# Find all elements with the class "react-directory-commit-message"
commit_messages = soup.find_all(class_="react-directory-commit-message")
# Loop through the results and print them
for commit_message in commit_messages:
print(commit_message.text.strip())

用您的凭据和信息替换userpassendpointport。就这样,您通过代理服务器向GitHub存储库发出了请求。

最后的话

在本文中,您学习了如何构建GitHub存储库抓取器。无论您是使用Requests和Beautiful Soup,还是使用Selenium构建更复杂的工具,您都可以通过使用代码示例并根据自己的需要进行修改来提取所需的任何数据。由于GitHub是一个知识共享社区,我们强烈建议您不仅要从中收集数据,还要为许多项目做出贡献。你甚至可以分享你使用本指南构建了什么样的项目,并帮助世界各地的许多开发人员。

如果您不太熟悉编码,并且正在寻找更简单的工具,请尝试Smartdaili 网络爬虫 API 。它易于使用,设置只需几秒钟,可以向任何GitHub存储库或网站发出请求并返回您想要的内容。

关于作者

James Keenan

资深内容作家

Smartdaili 的自动化和匿名传播者。他相信数据自由和每个人都有自主创业的权利。 James 在这里分享知识并帮助您在住宅代理方面取得成功。

Smartdaili 博客上的所有信息均按原样提供,仅供参考。对于您使用 Smartdaili 博客上的任何信息或其中可能链接的任何第三方网站,我们不作任何陈述,也不承担任何责任。

常见问题

可以抓取GitHub吗?

是的,有许多可用的工具和解决方案,这是可能的。您可以使用Python和JavaScript等编程语言编写自己的代码,以及为向网站发出请求、收集和解析数据并以干净、可读的格式返回而构建的库。

如何从GitHub获取代码?

© 2018-2025 Smartdaili 版权所有 津ICP备2022004334号-1