看看完成后的项目吧
搜索
得到结果
点击链接
下面开始讲解
关于爬虫
关于爬虫的之前的文章里已经提到过,因此不再叙述关于爬虫细节的部分。
在这里要做的就是把之前的爬虫封装成一个类具体代码在这里,经过封装后,爬虫类的工作模式如下:
关于后端逻辑
下面来看一下最主要的部分即搜索之后返回结果,在没有加入爬虫功能之前看起来就像下面这样
加入爬虫功能之后:
搭建Django项目
把项目建立在XieChengProject文件夹中
django-admin startproject mysite
python manage.py startapp polls
之后要把之前写的爬虫放在目录XieChengProject/mysite/polls/
下面。
完成之后目录看起来就像下面这样:
关于数据库设置,其实这个项目不需要数据库设置,因为票价变动地实在太快,因此随便设置即可。
设计数据库的好处
- 能够让程序更快,因为从数据库里提取数据比爬取数据要快
- 能够让项目更加人性化
不过我自己的能力不够,因此跳过了数据库的设置
但是要把polls app
包含在我们的项目里面关于INSTALLED_APPS
的设置是必不可少的
mysite/settings.py
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
弄好之后再来处理页面显示问题以及数据处理问题
设置搜索界面的URL
http://127.0.0.1:8000.polls/
设置结果页面的URL
http://127.0.0.1:8000/polls/results/
因此在polls/urls.py
文件中编写代码如下:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.index, name='index'),
path('results/', views.results, name='results'),
]
只有这是不够的,因为Django把后端服务器存储在了mysite
文件中,上面的代码只是定义了URL的路径,但是如果想要访问这两个URL的话,我们还需要在mysite/urls.py
文件中做一个映射,这样我们才能正常访问URL:
from django.urls import include, path
from django.contrib import admin
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
定义好URL路径之后,要考虑的就是展示页面问题,这时候就需要视图函数了,视图函数定义的是对于每次访问URL的请求,程序要做些什么?最直接的就是对于访问URL的请求我们返回一个页面
polls/views.py
from django.shortcuts import render
from . import XieChengSpider
def index(request):
return render(request, 'polls/index.html', context=None)
返回的页面index.html
我们要存放在XieChengProject/mysite/polls/templates/polls/
目录下
相应的静态文件如css,js文件我们要存放在XieChengProject/mysite/polls/static/polls/
目录下
对于http://127.0.0.1:8000/polls/
这个链接我们要返回一个页面,并且在页面中要包含一个表单,这样我们才能把数据POST到http://127.0.0.1:8000/polls/results/
表单定义如下:
<form action="{% url 'polls:results' %}" method="post">
{% csrf_token %}
<input type="text" name="search" value="Search Template" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Search Template';}">
<input type="submit" value="Search"/>
</form>
这时候提交数据会出现错误,因为我们并没有定义关于http://127.0.0.1:8000/polls/results/
这个链接的视图函数
定义一下
polls/views.py
from django.shortcuts import render
from . import XieChengSpider
def index(request):
return render(request, 'polls/index.html', context=None)
def results(request):
spider = XieChengSpider.xiecheng()
string = request.POST['search']
city = string.split(' ')[0]
date = string.split(' ')[1]
original_city = city.split('-')[0]
target_city = city.split('-')[1]
k, lowerprice_url = spider.crawl(original_city, target_city, date)
return render(request, 'polls/results.html', {
'date': k,
'lowerprice_url': lowerprice_url,
})
流程图(以输入:郑州-北京 2018-1-3为例)
一张图略微拥挤因此放了两张图
这样就大功告成了
讲解不当的地方,欢迎提问
代码风格不是很好,后续会做一些优化,这篇文章算是开个头把,后续要做什么也不清楚。
参考文献
[1]Django Writing your first app