用于查找使用特定编程语言的 GSoC 组织的Python程序
目前,无法按照 GSoC 参与组织在代码中使用的编程语言对其进行排序。这导致学生花费大量时间浏览每个组织的页面并手动对它们进行排序。
本文介绍了一种让学生使用 BeautifulSoup4 库编写自己的Python脚本的方法。使用此脚本,学生可以找到使用他们希望贡献的语言的组织。
您将通过本文了解以下内容:
- 如何使用 Requests 库向网页发送 HTTPS 请求
- 如何在Python中使用 BeautifulSoup4 库来解析 HTML 代码
- 使用 OpenPyXL 以电子表格(例如 MS Excel)的形式输出数据
安装
上面的模块没有预装Python。要安装它们,请在终端中键入以下命令。
pip install requests
pip install beautifulsoup4
pip install openpyxl
注意:阅读本文只需要Python 3 的初级知识。有关详细信息,请参阅Python编程语言
入门
第 1 步:导入所需的库
import requests, bs4, openpyxl
第 2 步:使用请求创建响应对象。我们将使用存档页面作为我们的来源
# Replace "YEAR" by the year you
# want to get data from. Eg. "2018"
url = 'https://summerofcode.withgoogle.com/archive/YEAR/organizations/'
# Creating a response object
# from the given url
res = requests.get(url)
# We'll be using the Archive page
# of GSoC's website as our source.
# Checking the url's status
res.raise_for_status()
第三步:创建一个 BeautifulSoup 对象
从存档页面的源代码:
...
...
...
...
我们可以看到 Orgs 的名字在一个H4
标签中,类名是“ organization-card__name font-black-54
”。
使用 BS4,我们可以在 HTML 代码中搜索这个特定的标签并将文本存储在一个列表中。
# Specify the language you
# want to search for
language = 'python'
# BS4 object to store the
# html text We use res.text
# to get the html code in text format
soup = bs4.BeautifulSoup(res.text, 'html.parser')
# Selecting the specific tag
# with class name
orgElem = soup.select('h4[class ="organization-card__name font-black-54"]')
# Similarly finding the links
# for each org's gsoc page
orgLink = soup.find_all("a", class_="organization-card__link")
languageCheck = ['no'] * len(orgElem)
orgURL = ['none'] * len(orgElem)
第 4 步:打开每个组织的 GSoC 页面并找到使用的语言
item = 0
# Loop to go through each organisation
for link in orgLink:
# Gets the anchor tag's hyperlink
presentLink = link.get('href')
url2 = 'https://summerofcode.withgoogle.com' + presentLink
print(item)
print(url2)
orgURL[item] = url2
res2 = requests.get(url2)
res2.raise_for_status()
soup2 = bs4.BeautifulSoup(res2.text, 'html.parser')
tech = soup2.find_all("li",
class_="organization__tag organization__tag--technology")
# Finding if the org uses
# the specified language
for name in tech:
if language in name.getText():
languageCheck[item] = 'yes'
item = item + 1
第 5 步:将列表写入电子表格
使用openpyxl
库,我们首先创建一个工作簿。在本工作簿中,我们使用 wb['Sheet'] 打开一个工作表,我们将在其中实际写入数据。使用cell().value
函数,我们可以直接将值写入每个单元格。最后,我们使用save()
函数保存工作簿。
wb = openpyxl.Workbook()
sheet = wb['Sheet']
for i in range(0, len(orgElem)):
sheet.cell(row = i + 1, column = 1).value = orgElem[i].getText()
sheet.cell(row = i + 1, column = 2).value = languageCheck[i]
sheet.cell(row = i + 1, column = 3).value = orgURL[i]
wb.save('gsocOrgsList.xlsx')
注意:电子表格将存储在与Python文件相同的目录中
故障排除
由于对网站的多次请求,服务器可能会在多次尝试后阻止您的 IP 地址。使用 VPN 将解决此问题。
如果问题仍然存在,请将以下内容添加到您的代码中:
from fake_useragent import UserAgent
ua = UserAgent()
header = {
"User-Agent": ua.random
}