Django 网站有时不打印任何东西

Posted

技术标签:

【中文标题】Django 网站有时不打印任何东西【英文标题】:Django website sometimes doesn't print anything 【发布时间】:2021-12-23 20:10:51 【问题描述】:

我使用 Django 开发了一个网站,其中 html 内容是从亚马逊抓取的数据。该页面的功能是在我提供搜索项时从亚马逊抓取数据。我使用 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)

模板.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%

如果错误来自其他文件,请在评论中提及。我还会添加该代码。

【问题讨论】:

【参考方案1】:

嗯,response 应该是 request,但除此之外,代码看起来还可以。 (不完美 - 我会为项目使用单个 dicts 列表 - 但可以。)(另外,您不使用为实际请求创建的请求 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"):,所以你最终没有任何项目。

【讨论】:

非常感谢@AKX。那么我可以在soup.select() 中使用什么标签来使其正常工作? 如果可能的话,你能解释一下函数中请求和响应的区别吗? Django 视图接收请求并返回响应。至于汤里用什么,我不知道。亚马逊可能只是返回一个错误页面或其他什么?

以上是关于Django 网站有时不打印任何东西的主要内容,如果未能解决你的问题,请参考以下文章

python Django1.3 建立网站,无法加载css

如何使用带有 JSONP 的 django 从我的其他网站加载内容?

如何使用 django-paypal 获取付款通知

django-admin.py startproject 不工作

Django 烹饪食谱网站模型结构

为啥我的 Fastcomet Django 网站没有加载 css?