Вопрос Написал парсер с ботом для тг прошу советы по коду

Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
245
Реакции[?]
23
Поинты[?]
18K
python:
from bs4 import BeautifulSoup
import requests
from telebot.async_telebot import AsyncTeleBot
import asyncio

API_TOKEN = ''
bot = AsyncTeleBot(API_TOKEN)

url = "https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22"
def check(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, "html.parser")
    a = soup.find('div', {'class': 'mw-collapsible', 'id': 'mw-customcollapsible-current'})
    if 'Buddha' in str(a):
        return True

@bot.message_handler(commands=['help', 'start'])
async def send_welcome(message):
    while True:
        if check(url) == True:
            await bot.send_message(message.from_user.id, "БУДДА В СТОКЕ!!!")

if [B]name[/B] == '[B]main[/B]':
    asyncio.run(bot.polling())
написал за час без опыта в парсинге поэтому хочу получить советы по коду
 
Участник
Статус
Оффлайн
Регистрация
19 Апр 2020
Сообщения
1,175
Реакции[?]
314
Поинты[?]
152K
python:
from bs4 import BeautifulSoup
import requests
from telebot.async_telebot import AsyncTeleBot
import asyncio

API_TOKEN = ''
bot = AsyncTeleBot(API_TOKEN)

url = "https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22"
def check(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, "html.parser")
    a = soup.find('div', {'class': 'mw-collapsible', 'id': 'mw-customcollapsible-current'})
    if 'Buddha' in str(a):
        return True

@bot.message_handler(commands=['help', 'start'])
async def send_welcome(message):
    while True:
        if check(url) == True:
            await bot.send_message(message.from_user.id, "БУДДА В СТОКЕ!!!")

if [B]name[/B] == '[B]main[/B]':
    asyncio.run(bot.polling())
написал за час без опыта в парсинге поэтому хочу получить советы по коду

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.

 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,594
Реакции[?]
602
Поинты[?]
43K
апи токен нужно получать из переменных системы через os.environ, держать его в сурсе попросту опасно

если твой url - константа, то передавать его в функцию check не нужно - перенеси url прям в тело функции.

тайп хинты стоило бы добавить, a.k.a.
Python:
def check(url: str) -> bool:
    # your check function goes here
чтобы получить вкусное автозаполнение от твоего локального лсп

soup.find разве не возвращает str?

советую держать импорты в группах вида
Python:
"""Описание модуля, заканчивающееся точкой."""

from future import annotations # включить поддержку PEP 563, полезно практически всегда

# импорты стдлибы
import os

# абсолютные импорты библиотек
import requests

# импорты элементов из библиотек
from bs4 import BeautifulSoup
всё это, естественно, без комментариев...


в целом один из лучших питон скриптов которые я здесь видел (видел я немного), молодец!
 
unbound
Пользователь
Статус
Оффлайн
Регистрация
27 Окт 2019
Сообщения
271
Реакции[?]
90
Поинты[?]
60K
python:
from bs4 import BeautifulSoup
import requests
from telebot.async_telebot import AsyncTeleBot
import asyncio

API_TOKEN = ''
bot = AsyncTeleBot(API_TOKEN)

url = "https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22"
def check(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, "html.parser")
    a = soup.find('div', {'class': 'mw-collapsible', 'id': 'mw-customcollapsible-current'})
    if 'Buddha' in str(a):
        return True

@bot.message_handler(commands=['help', 'start'])
async def send_welcome(message):
    while True:
        if check(url) == True:
            await bot.send_message(message.from_user.id, "БУДДА В СТОКЕ!!!")

if [B]name[/B] == '[B]main[/B]':
    asyncio.run(bot.polling())
написал за час без опыта в парсинге поэтому хочу получить советы по коду
Вот вроде бы и более менее, А вроде и чзх.
Зачем тебе "while True" если есть await, да и саму функцию можно было бы в асинк кинуть
python:
from bs4 import BeautifulSoup
import requests
from telebot.async_telebot import AsyncTeleBot
import asyncio

API_TOKEN = ''
bot = AsyncTeleBot(API_TOKEN)

async def check(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, "html.parser")
    a = soup.find('div', {'class': 'mw-collapsible', 'id': 'mw-customcollapsible-current'}).string
    if 'Buddha' in a:
        return True
    else:
        return False


@bot.message_handler(commands=['help', 'start'])
async def send_welcome(message):
    # result = await check("https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22")
    # await message.answer("da" if result else "net")
    await message.answer("БУДДА В СТОКЕ!!!" if await check("https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22") else "text")


if [B]name[/B] == '[B]main[/B]':
    asyncio.run(bot.polling())
лично я бы как-то так сделал (в хендлере монжо было по разному извернуться)
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,594
Реакции[?]
602
Поинты[?]
43K
python:
    await message.answer("БУДДА В СТОКЕ!!!" if await check("https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22") else "text")
какой хороший способ уничтожить читаемость своего кода


Зачем тебе "while True" если есть await, да и саму функцию можно было бы в асинк кинуть
возможно затем, что бот должен бесконечно долбиться в message recv лупе?

к тому же, каким образом асинк тебе поможет совершить абсолютно линейный парсинг веб странички... подозреваю что это будет даже медленнее чем синхронный вариант


python:
if 'Buddha' in a:
        return True
    else:
        return False
python:
return 'Buddha' in a
 
Начинающий
Статус
Оффлайн
Регистрация
21 Мар 2021
Сообщения
94
Реакции[?]
29
Поинты[?]
7K
Вот вроде бы и более менее, А вроде и чзх.
Зачем тебе "while True" если есть await, да и саму функцию можно было бы в асинк кинуть
python:
from bs4 import BeautifulSoup
import requests
from telebot.async_telebot import AsyncTeleBot
import asyncio

API_TOKEN = ''
bot = AsyncTeleBot(API_TOKEN)

async def check(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, "html.parser")
    a = soup.find('div', {'class': 'mw-collapsible', 'id': 'mw-customcollapsible-current'}).string
    if 'Buddha' in a:
        return True
    else:
        return False


@bot.message_handler(commands=['help', 'start'])
async def send_welcome(message):
    # result = await check("https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22")
    # await message.answer("da" if result else "net")
    await message.answer("БУДДА В СТОКЕ!!!" if await check("https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22") else "text")


if [B]name[/B] == '[B]main[/B]':
    asyncio.run(bot.polling())
лично я бы как-то так сделал (в хендлере монжо было по разному извернуться)
Какой смысл в async check если у тебя в ней используются блокирующие операции?
У тебя твой async-pool будет обрабатывать твою check как синхронную ф-ию, а из-за того что любые async ф-ии в Python возвращают объект корутины - будет полный пососимбус по скорости.
Почему бы не использовать тернарный оператор в проверке?
Где тайп хинты у аргументов ф-ий?
С импортами какая-то грязюка получается.

P.S. Если уж и хочется чтобы ф-ия была асинхронной, то лучше использовать httpx вместе request'ов, ибо он асинхронный.
 
Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
245
Реакции[?]
23
Поинты[?]
18K
Зачем тебе "while True" если есть await, да и саму функцию можно было бы в асинк кинуть
чтобы она спамила пока в спам лейт не уйдет ибо по другому легко не заметить
спасибо всем взял многое на заметку даже анотации
 
Последнее редактирование:
unbound
Пользователь
Статус
Оффлайн
Регистрация
27 Окт 2019
Сообщения
271
Реакции[?]
90
Поинты[?]
60K
Какой смысл в async check если у тебя в ней используются блокирующие операции?
У тебя твой async-pool будет обрабатывать твою check как синхронную ф-ию, а из-за того что любые async ф-ии в Python возвращают объект корутины - будет полный пососимбус по скорости.
Почему бы не использовать тернарный оператор в проверке?
Где тайп хинты у аргументов ф-ий?
С импортами какая-то грязюка получается.

P.S. Если уж и хочется чтобы ф-ия была асинхронной, то лучше использовать httpx вместе request'ов, ибо он асинхронный.
я дрочусь в перформанс только в плюсах, пишу как привык (мне что первым пришло в голову, то и написал)
 
Начинающий
Статус
Оффлайн
Регистрация
21 Мар 2021
Сообщения
94
Реакции[?]
29
Поинты[?]
7K
я дрочусь в перформанс только в плюсах, пишу как привык (мне что первым пришло в голову, то и написал)
Так код бессмысленный, в том пробелема. Ты перформансу в данном случае делаешь только больнее
 
unbound
Пользователь
Статус
Оффлайн
Регистрация
27 Окт 2019
Сообщения
271
Реакции[?]
90
Поинты[?]
60K
Так код бессмысленный, в том пробелема. Ты перформансу в данном случае делаешь только больнее
блят сказал же, для меня питон это так, простенькие штуки делать, я не вижу смысла там прям дрочится в перформанс, потому и код как код.
 
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2019
Сообщения
650
Реакции[?]
141
Поинты[?]
30K
python:
from bs4 import BeautifulSoup
import requests
from telebot.async_telebot import AsyncTeleBot
import asyncio

API_TOKEN = ''
bot = AsyncTeleBot(API_TOKEN)

url = "https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22"
def check(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, "html.parser")
    a = soup.find('div', {'class': 'mw-collapsible', 'id': 'mw-customcollapsible-current'})
    if 'Buddha' in str(a):
        return True

@bot.message_handler(commands=['help', 'start'])
async def send_welcome(message):
    while True:
        if check(url) == True:
            await bot.send_message(message.from_user.id, "БУДДА В СТОКЕ!!!")

if [B]name[/B] == '[B]main[/B]':
    asyncio.run(bot.polling())
написал за час без опыта в парсинге поэтому хочу получить советы по коду
я конечно не эксперт, но толку тут от асинхронности, если ты используешь реквесты, а так можно добавить аннотации, сделать задержку между запросами, а то чревато рейтлимитом, так-же не вижу смысла запускать запускать основную логику через сообщение, можно создать таск, ну и пройтись линтером по коду, чтобы все было по пип8
 
Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
245
Реакции[?]
23
Поинты[?]
18K
я конечно не эксперт, но толку тут от асинхронности, если ты используешь реквесты, а так можно добавить аннотации, сделать задержку между запросами, а то чревато рейтлимитом, так-же не вижу смысла запускать запускать основную логику через сообщение, можно создать таск, ну и пройтись линтером по коду, чтобы все было по пип8
опыта мне не хватает чтобы написать что то не на костылях
 
Начинающий
Статус
Оффлайн
Регистрация
20 Май 2020
Сообщения
84
Реакции[?]
3
Поинты[?]
0
python:
from bs4 import BeautifulSoup
import requests
from telebot.async_telebot import AsyncTeleBot
import asyncio

API_TOKEN = ''
bot = AsyncTeleBot(API_TOKEN)

url = "https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22"
def check(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, "html.parser")
    a = soup.find('div', {'class': 'mw-collapsible', 'id': 'mw-customcollapsible-current'})
    if 'Buddha' in str(a):
        return True

@bot.message_handler(commands=['help', 'start'])
async def send_welcome(message):
    while True:
        if check(url) == True:
            await bot.send_message(message.from_user.id, "БУДДА В СТОКЕ!!!")

if [B]name[/B] == '[B]main[/B]':
    asyncio.run(bot.polling())
написал за час без опыта в парсинге поэтому хочу получить советы по коду
Python:
a = soup.find('div', {'class': 'mw-collapsible', 'id': 'mw-customcollapsible-current'})
if a and 'Buddha' in str(a):
    return True
Python:
async def send_welcome(message):
    while True:
        if check(url):
            await bot.send_message(message.from_user.id, "БУДДА В СТОКЕ!!!")
        await asyncio.sleep(60)
Python:
async def main():
    await bot.polling()

if __name__ == '__main__':
    asyncio.create_task(main())
    asyncio.get_event_loop().run_forever()
В функции send_welcome ты используиш while True это приводит к бесконечному выполнению этой функции
вфункции check ты используешь переменную a чтобы найти элемент на странице если элемент будет не найден он выдаст сообщение элемент не найден с обновлением моего кода
 
Последнее редактирование:
Сверху Снизу