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浏览相关文档。
分享到:
相关推荐
该项目是使用Python和Django框架实现的一个京东商品详情数据的爬虫系统,旨在从京东网站上抓取商品信息,如价格、评价、销量等,并进行数据存储和分析。以下是这个项目涉及的关键知识点: 1. Python基础:Python是...
【Python-通过Django在web上实现xshell的功能】 Django是Python中广泛使用的Web开发框架,它提供了高效、简洁且实用的工具,用于构建高质量的Web应用。本项目的目标是利用Django来构建一个类似xshell的Web应用,...
本文将详细介绍如何利用Django的`routers`来实现URL路由的高效分发。 首先,Django的`routers`模块主要服务于基于RESTful API的开发,特别是当使用Django Rest Framework(DRF)时,它的功能更为强大。DRF中的`...
通过CSDN爬虫爬取博客,利用Whoosh实现倒排索引与排序,django作为后端实现小型CSDN搜索引擎 3.环境: python3.6 + django2.1 + 若干python库 4.配置 (1)django settings.py DATABASES = { 'default': { '...
在Python的Web开发框架Django中,`filters`是一个强大的工具,用于在数据库查询时进行数据筛选和过滤,从而实现精准或模糊查询。本篇将深入探讨如何利用Django的`filter`功能来处理多种查询场景,包括复选框多值准确...
将Django与Scrapy结合,可以利用Django的Web功能来启动、监控和控制Scrapy爬虫,实现一个用户友好的爬虫管理系统。以下是实现这种结合的关键步骤: 1. **创建Django项目和应用**:首先,我们需要创建一个新的Django...
总体来看,文章深入探讨了基于Django的分布式爬虫框架的设计和实现过程,为网络爬虫的开发者们提供了一个高效、灵活和可扩展的解决方案。通过任务队列、自动重新载入以及断点续传等技术的应用,文章所提出的框架为...
通过Django在web上实现xshell的功能 需安装requirements.txt中的包其中pywin32为twisted在windows上的依赖,linux不必安装。部署参见channels的文档。使用需执行python manage.py paramiko_proxy启动paramiko的代理...
【Django爬虫后台管理系统】是一个使用Python编程语言构建的高级项目,旨在为爬虫提供一个可视化的管理和监控平台。这个系统结合了Django框架、Selenium自动化测试工具、MySQL数据库以及SimpleUI前端界面,实现了从...
3. **配置Scrapyd**:在服务器上安装并配置Scrapyd,确保它可以接收和执行Django发送的爬虫任务。将Scrapy项目打包并上传到Scrapyd服务器。 4. **Django与Scrapyd接口**:在Django项目中,使用`requests`库或者`...
总结起来,使用Django框架在GAE上构建Web应用需要对两者的特性有深入理解,包括Django的MVT架构、GAE的数据存储机制、以及如何在GAE的环境中配置和部署Django应用。通过阅读指定的博客文章和分析提供的源代码,你...
Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django...
在实际操作中,你可能会遇到如何处理GAE的异步I/O模型、数据模型的设计、缓存策略等问题,这些都是在GAE上使用Django时需要考虑的额外因素。 在文件名"1-hello,blog"中,"hello"可能是一个简单的示例应用,而"blog...
10. **测试和调试**:使用 Django 自带的测试框架进行单元测试和集成测试,同时利用 GAE 的模拟器进行本地测试,以确保在生产环境上的表现。 在提供的文件名 "Surgo-django-on-gae-0d749f13781dbc0c2aefc81f9ed47...
使用Django+MySQL实现的在线电影推荐系统源码 使用Django+MySQL实现的在线电影推荐系统源码 使用Django+MySQL实现的在线电影推荐系统源码 使用Django+MySQL实现的在线电影推荐系统源码 使用Django+MySQL实现...
考虑到不同设备的浏览体验,我们需要确保网站具有响应式设计,使得在手机、平板和电脑上都能良好显示。 10. 错误处理与测试 使用Django的错误处理机制,我们可以优雅地处理404和500等错误。同时,通过编写单元...
此次利用python来进行爬虫与反爬虫的设计,主要是通过python来进行爬虫的识别以及爬虫的拒绝来最终达到反爬虫的功能。首先在爬虫的过程中,需要有以下方面: (1)请求网络数据, (2)HTML页面解析, (3)数据的...
`django-dynamic-scraper` 是一个非常实用的库,它允许开发者利用Django的管理界面来创建、编辑和运行Web爬虫,而无需编写大量的代码。这个强大的工具将Django的灵活性和Scrapy的高效爬取能力结合在一起,使得非...