@Pashtet221

Python Ошибка Traceback (most recent call last): Как исправить?

Нужно написать код который парсит каталог товаров из интернет магазина на примере e-katalog и выгружает в таблицу .csv для дальнейшего импорта в WordPress WooCommerce, но это уже отдельная тема. Пока подключил библиотеки. При запуске кода создается .csv с заголовками, но информации по товарам нет. Код выглядит так:

import requests
import csv
import time

from lxml import html
from fake_headers import Headers


HEADERS = Headers(
        browser="chrome",
        os="win",
        headers=True
    ).generate()
URL = 'https://www.e-katalog.ru/list/431/'
DOMAIN = 'https://www.e-katalog.ru'
ALL_DATA = dict()
QUEUE_URL = set()


def add_to_csv_from_file(product_dict):

    with open('data.csv', 'a') as csvfile:
        fieldnames = ["Name", "Price", "Url", "Title"]
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames,
                            quoting=csv.QUOTE_ALL)
        writer.writerow(product_dict)


def get_data(product_link):

    product = dict()
    request = requests.get(product_link, headers=HEADERS)
    tree = html.fromstring(request.content)
    product_name = tree.xpath("//h1/text()")
    product_price = tree.xpath("//div[@class='desc-short-prices'][1]//"
                               "div[@class='desc-big-price ib']//span[1]/text()")
    product['Url'] = product_link
    product['Title'] = tree.findtext('.//title')
    for name in product_name:
        product['Name'] = name
    for price in product_price:
        product['Price'] = price
    time.sleep(3)
    print('Сбор данных с URL', product_link)

    return product


def get_links(page_url):

    pagination_pages = set()
    request = requests.get(page_url, headers=HEADERS)
    tree = html.fromstring(request.content)
    pages_count = tree.xpath('//div[@class="ib page-num"]//a[last()]/text()')
    print('\nКод ответа корневого УРЛ:', request.status_code)
    print('Всего страниц пейджинации:', pages_count)

    for url in range(int(pages_count[0])):
        full_url = f"https://www.e-katalog.ru/list/431/{url}/"
        pagination_pages.add(full_url)

    while len(pagination_pages) != 0:
        current_url = pagination_pages.pop()
        print('Сбор ссылок с URL:', current_url)
        request = requests.get(current_url, headers=HEADERS)
        tree = html.fromstring(request.content)
        links = tree.xpath("//a[@class='model-short-title no-u']/@href")
        for link in links:
            QUEUE_URL.add(DOMAIN+link)
        time.sleep(3)


def main():
    with open('data.csv', 'a') as csvfile:
        fieldnames = ["Name", "Price", "Url", "Title"]
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_ALL)
        writer.writeheader()

    get_links(URL)

    while len(QUEUE_URL) != 0:
        current_url = QUEUE_URL.pop()
        add_to_csv_from_file(get_data(current_url))


if __name__ == "__main__":
    main()


Так выглядит ошибка
636b6c8d1458b188975949.png
  • Вопрос задан
  • 2253 просмотра
Решения вопроса 2
deepblack
@deepblack Куратор тега Python
Python Ошибка Traceback (most recent call last)

Ошибка IndexError: list index out of range

В строке:
for url in range(int(pages_count[0])):

Но сервер отдает 503, видимо тебя забанили немножко

Как исправить?

Разобраться с причиной блокировки.
Ответ написан
Комментировать
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
Ну у вас же все перед глазами, нужно включить немного щепотку логики. Вот через print выводите pages_count:
print('Всего страниц пейджинации:', pages_count
Результат видно в консоли. Проблема в том, несмотря на то, что четко видно, что список пустой, вы пытаетесь взять его нулевой элемент:
for url in range(int(pages_count[0])):
Решение - проверять список, перед тем как делать это.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы