Парсер книг на Литрес с публикацией в Telegram

Часть с пасингом полностью совпадает с другими парсерами, опубликованными в данном разделе ранее. Там же можно посмотреть описание работы, код парсера с комментариями. Отличается только последняя часть с публикацией — после сбора данных текст публикуется в указанной группе телеграм.

Общая схема аналогична. Из файла берется список категорий на Litres, во втором файле хранится список уже опубликованных книг. Если дубль — пропускается.

Используется API телеграмм. К записи прикрепляется картинка.

Код с комментариями ниже.



import requests
from time import sleep
import os
import random
import re

cookies = {} # нужно указать свои данные
headers = {}

all_count = 0
options = '?art_types=text_book&art_types=audiobook&languages=ru'
ref = '?lfrom=477110899'

with open("new.txt", "r", encoding="utf-8") as file_cl:
    category_list = file_cl.read().split('\n')

with open("id.txt", "r", encoding="utf-8") as file_id:
    all_id = file_id.read().split('\n')
file_id.close()

TOKEN = "6344636955:AAHdb-i-jMOJ**********"  # доступ к чату
chat_id = "12345678"

random.shuffle(category_list)  # обход категорий, сбор ссылок в список
count_cat = len(category_list) + 1
for category in category_list:
    count_cat -= 1
    sleep(20)
    req = requests.get(f'{category}{options}', headers=headers, cookies = cookies)
    src = req.text
 
    with open(f"temp_html/current_category.html", "w", encoding="utf-8") as file:
        file.write(src)
    
    with open(f"temp_html/current_category.html", encoding="utf-8") as file:  
        src = file.read()
    soup = BeautifulSoup(src, "lxml")
    try:
        name_category = soup.find("div", class_="Genre-module__title__name_JuQ14").text
    except:
        print('ошибка, пропуск')
        continue
    name_category_clear = name_category.replace('/', '') 
    if not os.path.exists(f'temp_html/{name_category_clear}/'):
        os.makedirs(f'temp_html/{name_category_clear}/')

    list_href = soup.find_all('a', {'data-testid': ['art__title']})

    for href in list_href:  # обход списка ссылок текущей категории
        title, author, isbn, description, id, count_author = '', '', '', '', '', ''
        link = (f"{href.get('href')}")
        id = ((link.split('-'))[-1])[:-1]
        if id in all_id:
            print(f'дубль - {id} -- осталось категорий: {count_cat}-- добавлено: {all_count}')
            continue
        sleep(30)
        all_id.append(id)
        all_count += 1
        print(f'новый - {id} -- {all_count} -- осталось категорий: {count_cat}')
        with open("id.txt", "a", encoding="utf-8") as file_id:
            file_id.write(f'{id}\n')

        req = requests.get(f"https://www.litres.ru{link}", headers=headers, cookies = cookies)
        src = req.text

        with open(f"temp_html/{name_category_clear}/{id}.html", "w", encoding="utf-8") as file_book:
            file_book.write(src)
    
        with open(f"temp_html/{name_category_clear}/{id}.html", "r", encoding="utf-8") as file_book:
            src = file_book.read()
        soup = BeautifulSoup(src, "lxml")
        title = soup.find("h1").text
        if soup.find(class_="Authors-module__authors_2_blq"):
            count_author = soup.find(class_="Authors-module__authors_2_blq").find("h4").text

        isbn = soup.find("span", itemprop="isbn") # не используется, но при необходимости можно добавить
        if isbn:
            isbn = isbn.text
        if soup.find(class_="Authors-module__authors_2_blq"):
            author = soup.find("div", class_="Authors-module__authors__wrapper_1rZey").find_all("span", itemprop="name")
        for i in range(len(author)):
            if author[i]:
                author[i] = author[i].text

        author = ', '.join(map(str, author))
        try:
            description = soup.find(class_="BookCard-module__book__annotation_2ZIhf").find_all('p')
        except:
            print('ошибка, пропуск')
            continue

        attachment_url = f'image/{id}.jpg'    # ссылка на картинку. Далее формируем нужный текст и публикуем.
        ch_n = '\n'
        message = f'{title}{ch_n}{author}{ch_n}{ch_n}{("".join(map(str, description))).split("</p>")[0]}{ch_n}{ch_n}https://www.litres.ru{link}{ref}'
        message = message.replace("</p>", "\n")
        message = re.sub('<[^<]+?>', '', message)
        url = f"https://api.telegram.org/bot{TOKEN}/sendMessage?chat_id={chat_id}&text={message}&photo={attachment_url}"
        resw = (requests.get(url).json()) # Эта строка отсылает сообщение



Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: