用Python抓取在Github上的组织名称

优采云 发布时间: 2022-06-20 13:36

  用Python抓取在Github上的组织名称

  翻译:老齐

  与本文相关书籍推荐:《跟老齐学Python:Django实战》

  

  我想在我的个人网站上展现我在Github上提交代码的组织名称,并且不用我手动更新提交记录的变化。Github提供了读取数据的API,但是,不能体现出我想一些开发组织提交的代码。这就是我之所以要爬取那些信息的原因。本文的代码仓库:

  本文中,我将向你展示一下开发过程。

  准备

  为了能顺利完成本文项目,请安装如下依赖。在当前目录中创建一个名为requirements.txt的文件,打开文本编辑器,把下面的内容复制到该文件中。

  beautifulsoup4==4.9.0<br />lxml==4.5.0<br />requests==2.23.0<br />

  我们使用requests获取网页内容,lxml和beautifulsoup4是另外提取信息的工具。

  如果你不想把你本地的Python环境搞得太复杂,可以创建虚拟环境:

  $ python -m venv .venv<br />$ source .venv/bin/activate<br />

  然后,用pip安装requirements.txt里列出的各项依赖。

  $ python -m pip install -r requirements.txt<br />

  从HTML中找到相应的标签

  首先,你要知道从哪里找到需要的信息。在本例中,我打算获取用户向Github某个特定组织的提交记录,打开用户自己Github页面,滚动如下图所示的地方。

  

  在你的浏览器上用开发和工具,打开HTML源码,并且找到对应的元素。点击某个组织,对应着看到相应源码,在标签内的元素中的就是组织名称。

  我们感兴趣的就在元素里面,所以,要把这个元素的class记录下来,以备后用。

  orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br />

  你可能注意到,我忽略了其他的组织名称,后面会演示,那些组织都包含在了我们提取的信息中了。另外,我们使用这个页面上抓取数据,因为HTML代码更可靠,所有的orgs_nav_classes值都一样。

  在工作目录中,创建scrape_github_orgs.py文件,其代码如下:

  # scrape_github_orgs.py<br /><br />import requests<br /><br />from bs4 import BeautifulSoup<br />from bs4.element import ResultSet<br /><br />orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br /><br />def get_user_org_hyperlinks(username: str) -> ResultSet:<br /> url = f"https://github.com/users/{username}/contributions"<br /> page = requests.get(url)<br /> soup = BeautifulSoup(page.content, "html.parser")<br /><br /> nav = soup.find("nav", class_=orgs_nav_classes)<br /> tmp_orgs = nav.find_all("a")<br /><br /> return tmp_orgs<br /><br />print(get_user_org_hyperlinks("DahlitzFlorian"))<br />

  首先,引入需要的requests库,还有bs4中的BeautifulSoup。然后,定义函数get_user_org_hyperlinks(),它的参数是username,返回元素的值是 orgs_nav_classes的所有内容。最后一行,调用get_user_org_hyperlinks()函数,并且把结果打印出来。

  执行脚本,得到如下信息:

  $ python scrape-github-orgs.py<br />[<br />

<br /> @python<br />, <br /><br /> @deadsnakes<br />, <br />
<br /> @realpython<br />, <br />
<br />@PyCQA<br />]<br />

  下面进入信息提取阶段。

  提取必要的信息

  记住,我们想获得某个用户提交代码的Github上的组织名称,已经得到了包含组织名称的超链接,然而,其中有很多我们不需要的样式类和属性,接下来就要清除它们,利用lxm包(lxml.html.clean.Cleaner)中的Cleaner()实现这个操作。首先,移除比必要的属性,为此创建一个Cleaner的实例,然后设置实例属性safe_attrs_only=True的值为True,与其关联的属性safe_attrs,利用frozenset创建一个不可变对象,并作为此属性的值。

  from lxml.html import clean<br /><br />cleaner = clean.Cleaner()<br />cleaner.safe_attrs_only = True<br />cleaner.safe_attrs = frozenset(["class", "src", "href", "target"])<br />

  上面的三行代码定义了cleaner对象,但是还没有对HTML采取行动,这要留作后用。接下来,我们要编写一个匹配所有HTML标签的正则表达式,因此要使用Python的re模块。

  import re<br /><br />html_tags = re.compile("")<br />

  最后,开始按照我们的需要实施清除操作。

<p>orgs = []<br /><br />for org in tmp_orgs:<br /> tmp_org = str(org)<br /> org_name = re.sub(<br /> html_tags,<br /> "",<br /> re.search(r"

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线