TransWikia.com

Usar mensaje del usuario para hacer un scrape de datos en una pagina web

Stack Overflow en español Asked by Alan Carlos Lopez on August 26, 2021

Estoy empezando a hacer experimentos con discord.py, pero honestamente no se como empezar en la cuestion de los comandos. El siguiente es el codigo que actualmente estoy utilizando en consola para extraer datos de un sitio web:

# Importamos las librerias
from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
import time
import os
import re

 # Capturamos la url 
html = urlopen('http://maplestory.nexon.net/rankings/world-ranking/reboot-(na)?pageIndex=1&character_name=Elfwinny')
url = "http://maplestory.nexon.net/rankings/world-ranking/reboot-(na)?pageIndex=1&character_name=Elfwinny"
bs = BeautifulSoup(html, 'html.parser')

 # Capturamos el hml de la pagina web y creamos un objeto Response
r  = requests.get(url)
data = r.text

#Sacamos toda la información de la tabla de rank proporcionada:

soup = BeautifulSoup(data, 'lxml')
avatar = bs.find_all('img', {'src':re.compile('.png')})
job = bs.find_all('img', {'src':re.compile('.gif')})
htnm_migration_table = soup.find("table", {'class':''})
tbody = htnm_migration_table.find('tbody')
trs = htnm_migration_table.find('tr')
td = htnm_migration_table.find_all('td')
print("Avatar de ElfWinny: " + avatar[2]["src"])
print("Nickname: " + td[2].text)
print("Job: " + job[0]["src"])
print("Nivel: " + td[5].text.split('n')[2].replace(" ","").strip())
print("Experiencia: " + td[5].text.split('n')[3].replace(" ","").strip())
print("Posicion: " + td[0].text.split('n')[1])

Como podrán ver, unicamente lo que hace es utilizar lo que contienen las variables de arriba "html" y "url" para de ese enlace extraer la información que necesito. Lo que quisiera hacer con mi bot de discod sería el automatizar el enlace siento la báse ‘http://maplestory.nexon.net/rankings/world-ranking/reboot-(na)?pageIndex=1&character_name=’ y despues completarlo con lo que el usuario ponga. Por ejemplo si pone !rank jugador1, que el bot automatize la busqueda poniendo en las variabels html y url ‘http://maplestory.nexon.net/rankings/world-ranking/reboot-(na)?pageIndex=1&character_name=jugador1’.

Y posteriormente presentar dicha informacion en un Embed como el siguiente:

embed = discord.Embed(title=f"Reboot Ranking", description="Resumen de tu personaje", color=discord.Color.blue())
    embed.add_field(name="Nombre del Personaje: ", value= td[2].text)
    embed.add_field(name="Job: ", value= job[0]["src"])
    embed.add_field(name="Nivel: ", value=f"{ctx.guild.region}")
    embed.add_field(name="Server ID", value= td[5].text.split('n')[2].replace(" ","").strip())
    embed.add_field(name="Experiencia: ", value= td[5].text.split('n')[3].replace(" ","").strip())
    embed.add_field(name="Posicion: ", value= td[0].text.split('n')[1]
    embed.set_thumbnail(url="https://pluralsight.imgix.net/paths/python-7be70baaac.png")

    await ctx.send(embed=embed)

Espero haber sido claro con lo que deseo aprender a hacer. Gracias por leer!

One Answer

Gracias a @coronel99 por hacerme una observacion muy obvia, logré resolver lo del comando de discord, aqui esta mi código por si alguien lo necesita:

    @bot.command(name="rankr")
    async def rankr(ctx, arg):
        html = urlopen('url' + arg)
        url = "url" + arg
        bs = BeautifulSoup(html, 'html.parser')
         # Capturamos el hml de la pagina web y creamos un objeto Response
        r  = requests.get(url)
        data = r.text
    
        #Sacamos toda la información de la tabla de rank proporcionada:
        soup = BeautifulSoup(data, 'lxml')
        avatar = bs.find_all('img', {'src':re.compile('.png')})
        job = bs.find_all('img', {'src':re.compile('.gif')})
        htnm_migration_table = soup.find("table", {'class':''})
        tbody = htnm_migration_table.find('tbody')
        trs = htnm_migration_table.find('tr')
        td = htnm_migration_table.find_all('td')
        #comienza el formato del mensaje del bot:
        embed = discord.Embed(title=f"Posicionamiento de: " + td[2].text, description="Ranking de Reboot" , color=discord.Color.dark_orange())
        embed.add_field(name="Nickname: ", value=td[2].text)
        embed.add_field(name="Nivel: ", value=td[5].text.split('n')[2].replace(" ","").strip())
        embed.add_field(name="Experiencia: ", value=td[5].text.split('n')[3].replace(" ","").strip())
        embed.add_field(name="Posicion: ", value=td[0].text.split('n')[1])
        embed.set_thumbnail(url= avatar[2]["src"])
        await ctx.send(embed=embed)

Answered by Alan Carlos Lopez on August 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP