📜  使用 WebScraping 和 Flask 为 GeeksforGeeks 用户数据设置 API

📅  最后修改于: 2022-05-13 01:54:34.314000             🧑  作者: Mango

使用 WebScraping 和 Flask 为 GeeksforGeeks 用户数据设置 API

先决条件: Python中的WebScraping,Flask简介

在这篇文章中,我们将讨论如何使用网络抓取获取有关 GeeksforGeeks 用户的信息,并使用 Python 的微框架Flask将信息作为 API 提供。

第 1 步:访问身份验证配置文件

要抓取一个网站,第一步是访问该网站。
步骤#2:检查页面源

在上图中,您可以发现包含用户数据的descDiv div。在下图中,找到四个mdl-grid div 以获取四条信息。

深入研究,找出属性及其对应值的两个块。那是您的用户个人资料数据。

在以下函数中找到所有这些,该函数以字典的形式返回所有数据。

def get_profile_detail(user_handle):
  
    url = "https://auth.geeksforgeeks.org/user/{}/profile".format(user_handle)
  
    response = requests.get(url)
  
    soup = BeautifulSoup(response.content, 'html5lib')
  
    description_div = soup.find('div', {'class': 'descDiv'})
  
    if not description_div:
        return None
  
    user_details_div = description_div.find('div', {'class': 'mdl-cell'})
  
    specific_details = user_details_div.find_all('div', {'class': 'mdl-grid'})
  
    user_profile = {}
  
    for detail_div in specific_details:
  
        block = detail_div.find_all('div', {'class': 'mdl-cell'})
  
        attribute = block[0].text.strip()
        value = block[1].text.strip()
  
        user_profile[attribute] = value
  
    return {'user profile': user_profile}

第 3 步:文章和改进列表

这一次,尝试自己发现各种标签。


如果你能发现 HTML 的各种元素,你也可以很容易地编写代码来抓取它。
如果你不能,这里是你的帮助代码。

def get_articles_and_improvements(user_handle):
    articles_and_improvements = {}
  
    url = "https://auth.geeksforgeeks.org/user/{}/articles".format(user_handle)
  
    response = requests.get(url)
  
    soup = BeautifulSoup(response.content, 'html5lib')
  
    contribute_section = soup.find('section', {'id': 'contribute'})
    improvement_section = soup.find('section', {'id': 'improvement'})
  
    contribution_list = contribute_section.find('ol')
    number_of_articles = 0
    articles = []
    if contribution_list:
        article_links = contribution_list.find_all('a')
        number_of_articles = len(article_links)
        for article in article_links:
            article_obj = {'title': article.text,
                           'link': article['href']}
            articles.append(article_obj)
  
    articles_and_improvements['number_of_articles'] = number_of_articles
    articles_and_improvements['articles'] = articles
  
    improvement_list = improvement_section.find('ol')
    number_of_improvements = 0
    improvements = []
    if improvement_list:
        number_of_improvements = len(improvement_list)
        improvement_links = improvement_list.find_all('a')
        for improvement in improvement_links:
            improvement_obj = {'title': improvement.text,
                               'link': improvement['href']}
            improvements.append(improvement_obj)
  
    articles_and_improvements['number_of_improvements'] = number_of_improvements
    articles_and_improvements['improvements'] = improvements
  
    return articles_and_improvements


步骤#4:设置烧瓶

网页抓取的代码就完成了。现在是时候设置我们的 Flask 服务器了。这是 Flask 应用程序的设置,以及整个脚本所需的所有必要库。

from bs4 import BeautifulSoup
import requests
from flask import Flask, jsonify, make_response
  
app = Flask(__name__)
app.config['JSON_SORT_KEYS'] = False


第 5 步:设置 API

现在我们已经有了合适的函数,我们唯一的任务就是结合它们的结果,将字典转换为 JSON,然后在服务器上提供它。

这是端点的代码,它根据接收到的用户句柄为 API 提供服务。请记住,我们需要处理不当的用户句柄,我们的端点可以随时接收。

@app.route('//')
def home(user_handle):
  
    response = get_profile_detail(user_handle)
    if response:
        response.update(get_articles_and_improvements(user_handle))
        api_response = make_response(jsonify(response), 200)
    else:
        response = {'message': 'No such user with the specified handle'}
        api_response = make_response(jsonify(response), 404)
    api_response.headers['Content-Type'] = 'application/json'
    return api_response

结合所有代码,您就拥有了一个提供动态 API 的功能齐全的服务器。