• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

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

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
245
Реакции
23
python:
Expand Collapse Copy
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:
Expand Collapse Copy
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())
написал за час без опыта в парсинге поэтому хочу получить советы по коду

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

 
апи токен нужно получать из переменных системы через os.environ, держать его в сурсе попросту опасно

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

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

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

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

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

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

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

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

всё это, естественно, без комментариев...


в целом один из лучших питон скриптов которые я здесь видел (видел я немного), молодец!
 
python:
Expand Collapse Copy
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:
Expand Collapse Copy
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())
лично я бы как-то так сделал (в хендлере монжо было по разному извернуться)
 
python:
Expand Collapse Copy
    await message.answer("БУДДА В СТОКЕ!!!" if await check("https://blox-fruits.fandom.com/wiki/Blox_Fruits_%22Stock%22") else "text")
какой хороший способ уничтожить читаемость своего кода


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

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


python:
Expand Collapse Copy
if 'Buddha' in a:
        return True
    else:
        return False
python:
Expand Collapse Copy
return 'Buddha' in a
 
Вот вроде бы и более менее, А вроде и чзх.
Зачем тебе "while True" если есть await, да и саму функцию можно было бы в асинк кинуть
python:
Expand Collapse Copy
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'ов, ибо он асинхронный.
 
Зачем тебе "while True" если есть await, да и саму функцию можно было бы в асинк кинуть
чтобы она спамила пока в спам лейт не уйдет ибо по другому легко не заметить
спасибо всем взял многое на заметку даже анотации
 
Последнее редактирование:
Какой смысл в async check если у тебя в ней используются блокирующие операции?
У тебя твой async-pool будет обрабатывать твою check как синхронную ф-ию, а из-за того что любые async ф-ии в Python возвращают объект корутины - будет полный пососимбус по скорости.
Почему бы не использовать тернарный оператор в проверке?
Где тайп хинты у аргументов ф-ий?
С импортами какая-то грязюка получается.

P.S. Если уж и хочется чтобы ф-ия была асинхронной, то лучше использовать httpx вместе request'ов, ибо он асинхронный.
я дрочусь в перформанс только в плюсах, пишу как привык (мне что первым пришло в голову, то и написал)
 
я дрочусь в перформанс только в плюсах, пишу как привык (мне что первым пришло в голову, то и написал)
Так код бессмысленный, в том пробелема. Ты перформансу в данном случае делаешь только больнее
 
Так код бессмысленный, в том пробелема. Ты перформансу в данном случае делаешь только больнее
блят сказал же, для меня питон это так, простенькие штуки делать, я не вижу смысла там прям дрочится в перформанс, потому и код как код.
 
python:
Expand Collapse Copy
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
 
я конечно не эксперт, но толку тут от асинхронности, если ты используешь реквесты, а так можно добавить аннотации, сделать задержку между запросами, а то чревато рейтлимитом, так-же не вижу смысла запускать запускать основную логику через сообщение, можно создать таск, ну и пройтись линтером по коду, чтобы все было по пип8
опыта мне не хватает чтобы написать что то не на костылях
 
python:
Expand Collapse Copy
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:
Expand Collapse Copy
a = soup.find('div', {'class': 'mw-collapsible', 'id': 'mw-customcollapsible-current'})
if a and 'Buddha' in str(a):
    return True
Python:
Expand Collapse Copy
async def send_welcome(message):
    while True:
        if check(url):
            await bot.send_message(message.from_user.id, "БУДДА В СТОКЕ!!!")
        await asyncio.sleep(60)
Python:
Expand Collapse Copy
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 чтобы найти элемент на странице если элемент будет не найден он выдаст сообщение элемент не найден с обновлением моего кода
 
Последнее редактирование:
Назад
Сверху Снизу