在Django模板中显示已删除的结果

时间:2010-06-04 05:10:09

标签: python django django-templates screen-scraping django-views

我正在测试用django构建一个抓取站点。由于某种原因,下面的代码只提供一个图片图像,我希望它可以打印每个图像,每个链接,每个价格,任何帮助? (另外,如果你们知道如何将这些数据放入数据库模型中,所以我不必总是刮掉网站,我很满意,但这可能是另一个问题)干杯!

这是模板文件:

{% extends "base.html" %}

{% block title %}Boats{% endblock %}

{% block content %}

<img src="{{ fetch_boats }}"/>

{% endblock %}

这是views.py文件:

#views.py
from django.shortcuts import render_to_response
from django.template.loader import get_template
from django.template import Context
from django.http import Http404, HttpResponse
from fetch_images import fetch_imagery

def fetch_it(request):
    fi = fetch_imagery()
    return render_to_response('fetch_image.html', {'fetch_boats' : fi})

这是fetch_images模块:

#fetch_images.py
from BeautifulSoup import BeautifulSoup
import re
import urllib2

def fetch_imagery():
    response = urllib2.urlopen("http://www.boattrader.com/search-results/Type")
    html = response.read()

#create a beautiful soup object
    soup = BeautifulSoup(html)

#all boat images have attribute height=165
    images = soup.findAll("img",height="165")
    for image in images:
        return image['src'] #print th url of the image only

# all links to detailed boat information have class lfloat
    links = soup.findAll("a", {"class" : "lfloat"})
    for link in links:
        return link['href']
        #print link.string

# all prices are spans and have the class rfloat
    prices = soup.findAll("span", { "class" : "rfloat" })
    for price in prices:
        return price
        #print price.string

最后,如果需要,urlconf中的映射网址如下:

from django.conf.urls.defaults import *
from mysite.views import fetch_it

urlpatterns = patterns('', ('^fetch_image/$', fetch_it))

3 个答案:

答案 0 :(得分:2)

超出范围,但在我看来,报废是一个过多的CPU时间/内存/带宽消耗,我认为它应该在异步管理器的后台完成。

虽然这是一个好主意:)

答案 1 :(得分:1)

您的fetch_imagery函数需要一些工作 - 因为您正在返回(而不是使用yield),第一个return image['src']将终止函数调用(我在这里假设所有这些返回是您的代码所示的相同函数定义的一部分。)

此外,我的假设是您将从fetch_imagery返回列表/元组(或定义生成器方法),在这种情况下,您的模板需要如下所示:

{% block content %}
    {% for image in fetch_boats %}
        <img src="{{ image }}" />
    {% endfor %}
{% endblock %}

这将基本循环遍历列表中的所有项目(您的案例中的图片网址),并为每个项目创建img个标记。

答案 2 :(得分:0)

我在'net上挖了相当长的一段时间,寻找一个示例来展示抓取的数据,这篇文章确实有所帮助。自从问题首次发布以来,模块就进行了一些小的更改,因此我认为我应该将其更新并发布具有所需更改的代码。

这样做的好处是它给出了一个示例,该示例演示如何运行一些Python代码以响应流量,并生成不需要任何理由就无需涉及数据库或模型类的简单内容。

假设您有一个工作中的Django项目,可以将这些更改添加到其中,那么您应该能够浏览到<your-base-url>/fetch_boats并看到一堆船上的照片。

views.py

import django.shortcuts
from django.shortcuts import render
from bs4 import BeautifulSoup
import urllib.request

def fetch_boats(request):
    fi = fetch_imagery()
    return render(request, "fetch_boats.html", {"boat_images": fi})

def fetch_imagery():
    response = urllib.request.urlopen("http://www.boattrader.com")
    html     = response.read()
    soup     = BeautifulSoup(html, features="html.parser")
    images   = soup.findAll("img")

    for image in images:
        yield image["src"]

urls.py

from django.urls import path
from .views import fetch_boats

urlpatterns = [
    path('fetch_boats', fetch_boats, name='fetch_boats'),
]

templates / fetch_boats.html

{% extends 'base.html' %}
{% block title %} ~~~&lt; Boats &gt;~~~ {% endblock title %}
{% block content %}

    {% for image in boat_images %}
        <br /><br />
        <img src="{{ image }}" />
    {% endfor %}

{% endblock content %}