Веб-сайт Django иногда ничего не печатает

Я разработал веб-сайт с использованием Django, где содержимое HTML представляет собой соскоб данных с amazon. Функция страницы заключается в том, чтобы соскабливать данные с amazon, когда я задаю элемент поиска. Для соскабливания данных я использовал Beautiful Soup. Когда я запускал функцию отдельно, без запуска сервера, вывод был нормальным и никаких проблем не возникало. Но когда я использую эту же функцию на своем сервере, иногда я получаю результат, который представляет собой таблицу соскобленных данных. Но иногда я не получаю никакой таблицы на своей странице. Мне кажется, что проблема связана с тем, как добавить Django в мой код. Поскольку я новичок в Django, пожалуйста, проверьте, правильно ли я ввел весь код. Я использовал следующий код:

views.py

def amzlogic(response):
    USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
    LANGUAGE = "en-US,en;q=0.5"
    session = requests.Session()
    session.headers['User-Agent'] = USER_AGENT
    session.headers['Accept-Language'] = LANGUAGE
    session.headers['Content-Language'] = LANGUAGE
    title_list = []
    price_list = []
    image_url_list = []
    
    if response.method == "GET":
        search = response.GET.get("search-item")
        search = search.replace(" ", "+")
        url = f"https://www.amazon.in/s?k={search}&page=1&qid=1636019714&ref=sr_pg_1"

        page = requests.get(url)
        soup = BeautifulSoup(page.content,'lxml')

    for item in soup.select(".s-border-top"):
        title = item.select_one(".a-color-base.a-text-normal").get_text()[:25]
        try:
            price = item.select_one(".a-price-whole").get_text().replace(",", "").replace(".", "")
        except:
            price = "No Price"
        image_url = item.select_one(".s-image")

        title_list.append(title)
        price_list.append(price)
        image_url_list.append(image_url.get('src'))

    return render(response, "main/amazonscrape.html", {"title_list":title_list, "price_list":price_list, "image_list":image_url_list})

templates.html

{% block content %}
    <form method="GET" action="#"> {%csrf_token%}
        <label for="search-query">Search:</label> <br>
        <input type="text" name = "search-item" placeholder="Enter your search item"> <br>
        <!-- <label for="search-query">Number of pages:</label><br>
        <input type="number" name = "page-limit" placeholder="No. of pages"><br> -->
        <input type="submit" name="search" value="search">
    </form>

    <table>
        <tr>
            <td>
                <table>
                    <tbody>
                        {%for title in title_list%}
                            <tr>
                                <td>{{title}}</td>
                            </tr>
                        {%endfor%}
                    </tbody>
                </table>
            </td>
            <td>
                <table>
                    <tbody>
                        {%for price in price_list%}
                            <tr>
                                <td>{{price}}</td>
                            </tr>
                        {%endfor%}
                    </tbody>
                </table>
            </td>
            <td>
                <table>
                    <tbody>
                        {%for image in image_list%}
                            <tr>
                                <td>{{image}}</td>
                            </tr>
                        {%endfor%}
                    </tbody>
                </table>
            </td>
        </tr>
    </table>
{%endblock%}

Если ошибка возникает из-за другого файла, пожалуйста, укажите это в комментарии. Я бы также добавил этот код.

Ну, response должен быть request, но после этого код выглядит нормально. (Не идеально - я бы использовал один список dicts для элементов - но нормально.) (Также, вы не используете Requests session, которые вы создаете для фактического запроса)

Я бы, вероятно, рефакторизовал поиск в другую функцию, á la

import requests

HEADERS = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.5",
    "Content-Language": "en-US,en;q=0.5",
}


def do_amazon_search(search):
    search = search.replace(" ", "+")
    response = requests.get(f"https://www.amazon.in/s?k={search}&page=1&qid=1636019714&ref=sr_pg_1", headers=HEADERS)
    response.raise_for_status()
    soup = BeautifulSoup(response.content, "lxml")
    items = []
    for item in soup.select(".s-border-top"):
        title = item.select_one(".a-color-base.a-text-normal").get_text()[:25]
        try:
            price = item.select_one(".a-price-whole").get_text().replace(",", "").replace(".", "")
        except Exception:
            price = "No Price"
        image_url = item.select_one(".s-image")
        items.append({"title": title, "price": price, "image": image_url.get("src")})
    return items


def amzlogic(request):
    search = request.GET.get("search-item")
    items = do_amazon_search(search)
    return render(request, "main/amazonscrape.html", {"items": items})

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

Я бы просто предположил, что иногда в выводе скрапа нет тегов, которые бы соответствовали for item in soup.select(".s-border-top"):, и поэтому в итоге у вас нет элементов.

Вернуться на верх