如何使用GitHub API获取GitHub中的仓库依赖信息?
How to use GitHub API to get a repository's dependents information in GitHub?
当我使用 GitHub API v4 获取一些信息时,我可以使用 repository.dependencyGraphManifests
轻松获取依赖项。但是我找不到任何方法来使用 GitHub API v4 来获取家属信息,尽管我可以在 Insights->Dependency Graph->Dependents
中看到它。
我想知道是否有任何可能的方法可以在 GitHub 存储库中获取家属信息?无论是 GitHub API 还是其他。
我认为您无法使用 Github API(Rest 或 Graphql)获取依赖项目,一种方法可能是像下面的 python 脚本那样使用抓取:
import requests
from bs4 import BeautifulSoup
repo = "expressjs/express"
page_num = 3
url = 'https://github.com/{}/network/dependents'.format(repo)
for i in range(page_num):
print("GET " + url)
r = requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")
data = [
"{}/{}".format(
t.find('a', {"data-repository-hovercards-enabled":""}).text,
t.find('a', {"data-hovercard-type":"repository"}).text
)
for t in soup.findAll("div", {"class": "Box-row"})
]
print(data)
print(len(data))
paginationContainer = soup.find("div", {"class":"paginate-container"}).find('a')
if paginationContainer:
url = paginationContainer["href"]
else:
break
根据 Bertrand Martel 的回答 (@bertrand-martel),不要忘记添加以下代码,以免卡在第一页和第二页之间。换句话说,它会前进,然后倒退;因为最初只有一个 <a>
标签,而下一页有两个,所以它选择第一个(“上一页”)和 returns 到上一页。
代码:
...
paginationContainer = soup.find("div", {"class":"paginate-container"}).find_all('a')
if len(paginationContainer) > 1:
paginationContainer = paginationContainer[1]
else:
paginationContainer = paginationContainer[0]
...
一个 ruby 脚本(类似于 python 已接受的答案),其中列出了带有星标和分叉的回购协议。该脚本要么 returns 一个 json 数组,如果管道,或者产生一个 ruby repl 否则。
# frozen_string_literal: true
require 'json'
require 'nokogiri'
require 'open-uri'
$repo = ARGV.fetch(0, "rgeo/rgeo")
Repo = Struct.new(:org, :repo, :stars, :forks)
url = "https://github.com/#$repo/network/dependents"
repos = []
while url
doc = Nokogiri::HTML(URI.open(url))
doc.css('#dependents .Box .Box-row').each do |el|
repos << Repo.new(
*el.css('.f5 > a').map(&:inner_text),
*el.at_css('.d-flex').content.delete(" ,").scan(/\d+/).map(&:to_i)
)
rescue
binding.irb
end
url = doc.at_css('.paginate-container > .BtnGroup > .BtnGroup-item:nth-child(2)').attr("href")
end
if $stdin.tty? && $stdout.tty?
# check `repos`
binding.irb
else
jj repos.map { { name: "#{_1.org}/#{_1.repo}", stars: _1.stars, forks: _1.forks } }
end
建立在@Bertrand Martel 的回答之上,以下是他的代码的一个版本,不需要事先知道 page_num
:
import requests
from bs4 import BeautifulSoup
repo = "expressjs/express"
url = 'https://github.com/{}/network/dependents'.format(repo)
nextExists = True
result = []
while nextExists:
r = requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")
result = result + [
"{}/{}".format(
t.find('a', {"data-repository-hovercards-enabled":""}).text,
t.find('a', {"data-hovercard-type":"repository"}).text
)
for t in soup.findAll("div", {"class": "Box-row"})
]
nextExists = False
for u in soup.find("div", {"class":"paginate-container"}).findAll('a'):
if u.text == "Next":
nextExists = True
url = u["href"]
for r in result:
print(r)
print(len(result))
请记住,如果有很多家属,它可能 运行 很长。
当我使用 GitHub API v4 获取一些信息时,我可以使用 repository.dependencyGraphManifests
轻松获取依赖项。但是我找不到任何方法来使用 GitHub API v4 来获取家属信息,尽管我可以在 Insights->Dependency Graph->Dependents
中看到它。
我想知道是否有任何可能的方法可以在 GitHub 存储库中获取家属信息?无论是 GitHub API 还是其他。
我认为您无法使用 Github API(Rest 或 Graphql)获取依赖项目,一种方法可能是像下面的 python 脚本那样使用抓取:
import requests
from bs4 import BeautifulSoup
repo = "expressjs/express"
page_num = 3
url = 'https://github.com/{}/network/dependents'.format(repo)
for i in range(page_num):
print("GET " + url)
r = requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")
data = [
"{}/{}".format(
t.find('a', {"data-repository-hovercards-enabled":""}).text,
t.find('a', {"data-hovercard-type":"repository"}).text
)
for t in soup.findAll("div", {"class": "Box-row"})
]
print(data)
print(len(data))
paginationContainer = soup.find("div", {"class":"paginate-container"}).find('a')
if paginationContainer:
url = paginationContainer["href"]
else:
break
根据 Bertrand Martel 的回答 (@bertrand-martel),不要忘记添加以下代码,以免卡在第一页和第二页之间。换句话说,它会前进,然后倒退;因为最初只有一个 <a>
标签,而下一页有两个,所以它选择第一个(“上一页”)和 returns 到上一页。
代码:
...
paginationContainer = soup.find("div", {"class":"paginate-container"}).find_all('a')
if len(paginationContainer) > 1:
paginationContainer = paginationContainer[1]
else:
paginationContainer = paginationContainer[0]
...
一个 ruby 脚本(类似于 python 已接受的答案),其中列出了带有星标和分叉的回购协议。该脚本要么 returns 一个 json 数组,如果管道,或者产生一个 ruby repl 否则。
# frozen_string_literal: true
require 'json'
require 'nokogiri'
require 'open-uri'
$repo = ARGV.fetch(0, "rgeo/rgeo")
Repo = Struct.new(:org, :repo, :stars, :forks)
url = "https://github.com/#$repo/network/dependents"
repos = []
while url
doc = Nokogiri::HTML(URI.open(url))
doc.css('#dependents .Box .Box-row').each do |el|
repos << Repo.new(
*el.css('.f5 > a').map(&:inner_text),
*el.at_css('.d-flex').content.delete(" ,").scan(/\d+/).map(&:to_i)
)
rescue
binding.irb
end
url = doc.at_css('.paginate-container > .BtnGroup > .BtnGroup-item:nth-child(2)').attr("href")
end
if $stdin.tty? && $stdout.tty?
# check `repos`
binding.irb
else
jj repos.map { { name: "#{_1.org}/#{_1.repo}", stars: _1.stars, forks: _1.forks } }
end
建立在@Bertrand Martel 的回答之上,以下是他的代码的一个版本,不需要事先知道 page_num
:
import requests
from bs4 import BeautifulSoup
repo = "expressjs/express"
url = 'https://github.com/{}/network/dependents'.format(repo)
nextExists = True
result = []
while nextExists:
r = requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")
result = result + [
"{}/{}".format(
t.find('a', {"data-repository-hovercards-enabled":""}).text,
t.find('a', {"data-hovercard-type":"repository"}).text
)
for t in soup.findAll("div", {"class": "Box-row"})
]
nextExists = False
for u in soup.find("div", {"class":"paginate-container"}).findAll('a'):
if u.text == "Next":
nextExists = True
url = u["href"]
for r in result:
print(r)
print(len(result))
请记住,如果有很多家属,它可能 运行 很长。