`
edison0951
  • 浏览: 71753 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用DJANGO在GAE上实现小型网络爬虫

阅读更多
  Google App Engine 和 Django 都可以使用 WSGI 标准运行应用程序。因此,可在 Google App Engine 上使用几乎整个 Django 堆栈,包括中间件。作为开发人员,唯一需要做的调整就是修改您的 Django 数据模型以利用 Google App Engine 数据存储 API 与快速、可扩展的 Google App Engine 数据存储配合使用。Django 和 Google App Engine 的模型概念类似,作为 Django 开发人员,可以快速调整应用程序以使用GAE的数据存储。
  Google App Engine 默认的版本是0.96,当然了,你也可以升级到1.0。为了使用GAE,DJANGO的MODEL当然是不能用了,所以就将就GOOGLE的了,VIEW和URL还是很有用的。下面是我的部分代码和说明。
app.yaml:
application: mydjango-test
version: 2
runtime: python
api_version: 1
handlers:
  - url: /.*
    script: bootstrap.py

注意,application必须与你在GAE的名字一样,不让会同步不上去。
接下来是一个很重要的模块,就是bootstrap.py了,我们不需要了解他到底是怎样工作的,只要进入网站之后,通过URL,他就会自动映射到DJANGO了,其它的URL就不用在这配了,这时候就轮到我们的DJANGO的URLS发威了。
我的VIEWS模块代码:
#-*- coding: utf8 -*-
from google.appengine.ext import db
from django import http
from django import shortcuts
from datetime import datetime 
from google.appengine.api import urlfetch
import re
from BeautifulSoup import BeautifulSoup
dict = {u'一':1,u'两':2,u'三':3,u'四':4,u'五':5}

class Sources(db.Model):
    #id = db.IntegerProperty(required = True)
    name = db.StringProperty(required =True)

class Articles(db.Model):
    #id = db.IntegerPropeirty()
    titles = db.StringProperty()#required = True)
    link = db.LinkProperty()#required = True)
    source_id = db.IntegerProperty()
    content = db.TextProperty()
    price = db.FloatProperty()
    region = db.StringProperty()
    subregion = db.StringProperty()
    area = db.IntegerProperty()
    area_name = db.StringProperty()
    community = db.StringProperty()
    room_layout = db.IntegerProperty()
    pub_date = db.DateTimeProperty()
    crawl_date = db.DateTimeProperty()
    original_id = db.IntegerProperty()

def ReturnText(element):
    text =""
    try:
        elements = element.contents
        for e in elements:
            text += ReturnText(e).strip()
    except:
        text = element
    return (text)

def parse(data):
    data = data.decode("utf8")
    re_s = u"""<tr>\s+<td class="center" style="width:85px"><b>(\d+)</b></td>\s+<td class="center" style="width:85px">(\d)室(\d)厅(\d)卫</td>\s+<td class="t"><a href="(.{1,300}?)" target="_blank" class="t">(.{1,300}?)</a>.{1,300}?<td class="center" style="width:100px">(.{1,300}?)</td>\s+</tr>"""
    items = re.compile(re_s,re.M|re.S).findall(data)
    return items

def sub_parse(data):
    soup = BeautifulSoup(data)
    sTag = soup.find('span',{'class':'updatedate'})
    p = soup.find('span',{'class':'rednum'})
    if p:
        p = p.string.strip()
        try:
            price = float(p)
        except:
            price = 0

    str_date = sTag.string.strip().split(u":")[-1]
    pub_date = datetime.strptime(str_date,'%Y-%m-%d %H:%M')
    cTag = soup.find('code')
    content = ReturnText(cTag)
    table = soup.find('table',{'class':'boxleft'})
    trs = table.findAll('tr')
    aTag = trs[0].findAll('a')
    if len(aTag) == 1:
        subregion = aTag[0].string.strip()
        area_name = ''
    else:
        subregion = aTag[0].string.strip()
        area_name = aTag[1].string.strip()
    try:
        community = trs[1].find('a').string.strip()
    except:
        dTag = trs[1].findAll('td')[-1]
        community = dTag.string.strip()
    
    for tr in trs[2:]:
        txt = tr.find('td').string.strip()
        if txt == u'居室:' or txt == u'房型:':
            tmp = tr.findAll('td')[-1].string.strip()
            num = tmp.split(u'室')[0]
            li = dict.keys()
            for key in dict.keys():
                if key == num:
                    value = dict[key]
                    break
            n = re.sub('\D','',tmp)
            room_layout = int(str(value) + str(n))
            
            break
    for tr in trs[2:]:
        txt = tr.find('td').string.strip()
        if txt == u'建筑面积:' or txt == u'合租情况:':
            tmp = tr.findAll('td')[-1].string.strip()
            area = re.sub('\D','',tmp)
            if area == u'':
                area = 0
            else:
                area = int(area)
            break
        else:
            area = 0



    return (price,pub_date,content,subregion,area_name,community,area,room_layout)

def deal_func(item):
    try:
        price = float(item[0])
    except:
        price = 0
    link = item[4]
    tmp = link.split('/')[-1]
    original = re.sub('\D','',tmp)
    original = int(original)
    title = item[5]

    data = open_page(link)
    result = sub_parse(data)

    source_id = 1
    article = Articles()
    article.price = price
    article.titles = title
    article.link = link
    article.pub_date = result[1]
    article.source_id = source_id
    article.content = result[2]
    article.region = 'Beijing'
    article.subregion = result[3]
    article.area = result[6]
    article.area_name = result[4]
    article.community = result[5]
    article.room_layout = result[7]
    article.crawl_date = datetime.now()
    article.original_id = original
    article.put()

def open_page(url):
    res = urlfetch.fetch(url)
    data =res.content
    return data

def home_page(request):
    url = "http://bj.58.com/haidian/zufang/0/"
    data = open_page(url)
    items = parse(data)
    for item in items:
        deal_func(item)
    variable = 'If you want to check the data,please click the link'
    return shortcuts.render_to_response('index.html',{'variable':variable})

def result_page(request):
    temp = db.GqlQuery("SELECT * FROM Articles")
    results = temp.fetch(1000)    
    return shortcuts.render_to_response('result.html',{'results':results})

URLS模块:
from django.conf.urls.defaults import *
from views import *
urlpatterns = patterns(
    (r'^$',home_page),
    (r'^result$',result_page),
)

SETTINGS模块:
import os
DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@domain.com'),
)

MANAGERS = ADMINS

DATABASE_NAME = ''             # Or path to database file if using sqlite3.
DATABASE_USER = ''             # Not used with sqlite3.
DATABASE_PASSWORD = ''         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'Asia/Chongqing'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html

LANGUAGE_CODE = 'en-US'
FILE_CHARSET = 'utf-8'
DEFAULT_CHARSET = 'utf-8'
SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = ''

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = ''

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/media/'

# Make this unique, and don't share it with anybody.
SECRET_KEY = '^ab3&g(clwew7@#=*&-$4i$09kirn&q$1$h6)^*8^9pdblpm&f'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    #'django.template.loaders.app_directories.load_template_source',
#     'django.template.loaders.eggs.load_template_source',
)

MIDDLEWARE_CLASSES = (
    #'django.middleware.common.CommonMiddleware',
    #'django.contrib.sessions.middleware.SessionMiddleware',
    #'django.contrib.auth.middleware.AuthenticationMiddleware',
)

ROOT_URLCONF = 'urls'

TEMPLATE_DIRS = (
        os.path.join(os.path.dirname(__file__),'templates')
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

INSTALLED_APPS = (
    #'django.contrib.auth',
    'django.contrib.contenttypes',
    #'django.contrib.sessions',
    'django.contrib.sites',
    #'website.mywebsite'
)

注意,由于是在GAE中使用,所以很多ADMIN的组件和部分中间件是没办法使用的,我都注释掉了。
所以写小细节,当初本来是打算用纯粹的正则来写,发现太麻烦了,后来发现有BeautifulSoup可以用,工作量一下就减轻了,我的附件中包含了所有的源代码,当让了,还有用BEAUTIFULSOUP写的爬去58.com的爬虫,喜欢的下载了慢慢浏览吧。如果对BEAUTIFULSOUP不熟悉的可以到http://www.crummy.com/software/BeautifulSoup/documentation.html浏览相关文档。
分享到:
评论
1 楼 ph4nut 2010-07-22  
Google GAE支持Django哪些版本?

相关推荐

    毕业设计_python+django实现京东商品详情数据的爬虫项目.rar

    该项目是使用Python和Django框架实现的一个京东商品详情数据的爬虫系统,旨在从京东网站上抓取商品信息,如价格、评价、销量等,并进行数据存储和分析。以下是这个项目涉及的关键知识点: 1. Python基础:Python是...

    Python-通过Django在web上实现xshell的功能

    【Python-通过Django在web上实现xshell的功能】 Django是Python中广泛使用的Web开发框架,它提供了高效、简洁且实用的工具,用于构建高质量的Web应用。本项目的目标是利用Django来构建一个类似xshell的Web应用,...

    利用django自带的routers实现对url路由的分发

    本文将详细介绍如何利用Django的`routers`来实现URL路由的高效分发。 首先,Django的`routers`模块主要服务于基于RESTful API的开发,特别是当使用Django Rest Framework(DRF)时,它的功能更为强大。DRF中的`...

    通过CSDN爬虫爬取博客,利用Whoosh实现倒排索引与排序,django作为后端实现小型CSDN搜索引擎

    通过CSDN爬虫爬取博客,利用Whoosh实现倒排索引与排序,django作为后端实现小型CSDN搜索引擎 3.环境: python3.6 + django2.1 + 若干python库 4.配置 (1)django settings.py DATABASES = { 'default': { '...

    利用django自带的filte实现精准、模糊查询

    在Python的Web开发框架Django中,`filters`是一个强大的工具,用于在数据库查询时进行数据筛选和过滤,从而实现精准或模糊查询。本篇将深入探讨如何利用Django的`filter`功能来处理多种查询场景,包括复选框多值准确...

    django+scrapy结合

    将Django与Scrapy结合,可以利用Django的Web功能来启动、监控和控制Scrapy爬虫,实现一个用户友好的爬虫管理系统。以下是实现这种结合的关键步骤: 1. **创建Django项目和应用**:首先,我们需要创建一个新的Django...

    基于Django的分布式爬虫框架设计与实现.pdf

    总体来看,文章深入探讨了基于Django的分布式爬虫框架的设计和实现过程,为网络爬虫的开发者们提供了一个高效、灵活和可扩展的解决方案。通过任务队列、自动重新载入以及断点续传等技术的应用,文章所提出的框架为...

    通过Django在web上实现xshell的功能

    通过Django在web上实现xshell的功能 需安装requirements.txt中的包其中pywin32为twisted在windows上的依赖,linux不必安装。部署参见channels的文档。使用需执行python manage.py paramiko_proxy启动paramiko的代理...

    Django爬虫后台管理系统

    【Django爬虫后台管理系统】是一个使用Python编程语言构建的高级项目,旨在为爬虫提供一个可视化的管理和监控平台。这个系统结合了Django框架、Selenium自动化测试工具、MySQL数据库以及SimpleUI前端界面,实现了从...

    DJango跟Scrapy爬虫框架实现-ScrapydAPI

    3. **配置Scrapyd**:在服务器上安装并配置Scrapyd,确保它可以接收和执行Django发送的爬虫任务。将Scrapy项目打包并上传到Scrapyd服务器。 4. **Django与Scrapyd接口**:在Django项目中,使用`requests`库或者`...

    如何在GAE中轻松使用Django框架

    总结起来,使用Django框架在GAE上构建Web应用需要对两者的特性有深入理解,包括Django的MVT架构、GAE的数据存储机制、以及如何在GAE的环境中配置和部署Django应用。通过阅读指定的博客文章和分析提供的源代码,你...

    Django实现商城网站源码.zip

    Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django...

    在GAE中使用django模板

    在实际操作中,你可能会遇到如何处理GAE的异步I/O模型、数据模型的设计、缓存策略等问题,这些都是在GAE上使用Django时需要考虑的额外因素。 在文件名"1-hello,blog"中,"hello"可能是一个简单的示例应用,而"blog...

    Surgo-django-on-gae

    10. **测试和调试**:使用 Django 自带的测试框架进行单元测试和集成测试,同时利用 GAE 的模拟器进行本地测试,以确保在生产环境上的表现。 在提供的文件名 "Surgo-django-on-gae-0d749f13781dbc0c2aefc81f9ed47...

    使用Django+MySQL实现的在线电影推荐系统源码.zip

    使用Django+MySQL实现的在线电影推荐系统源码 使用Django+MySQL实现的在线电影推荐系统源码 使用Django+MySQL实现的在线电影推荐系统源码 使用Django+MySQL实现的在线电影推荐系统源码 使用Django+MySQL实现...

    python课程设计(Django搭建电影网站,Django+爬虫+html+MySQL数据库)

    考虑到不同设备的浏览体验,我们需要确保网站具有响应式设计,使得在手机、平板和电脑上都能良好显示。 10. 错误处理与测试 使用Django的错误处理机制,我们可以优雅地处理404和500等错误。同时,通过编写单元...

    django项目实战之反爬虫技术的研究(源码+说明+演示视频).zip

    此次利用python来进行爬虫与反爬虫的设计,主要是通过python来进行爬虫的识别以及爬虫的拒绝来最终达到反爬虫的功能。首先在爬虫的过程中,需要有以下方面: (1)请求网络数据, (2)HTML页面解析, (3)数据的...

    Python-djangodynamicscraper通过Django管理界面创建爬虫

    `django-dynamic-scraper` 是一个非常实用的库,它允许开发者利用Django的管理界面来创建、编辑和运行Web爬虫,而无需编写大量的代码。这个强大的工具将Django的灵活性和Scrapy的高效爬取能力结合在一起,使得非...

Global site tag (gtag.js) - Google Analytics