Django+爬虫 搭建一个机票查询页面

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eye_water/article/details/78962295

看看完成后的项目吧

搜索
这里写图片描述
得到结果
这里写图片描述
点击链接
这里写图片描述

下面开始讲解

关于爬虫

关于爬虫的之前的文章里已经提到过,因此不再叙述关于爬虫细节的部分。
在这里要做的就是把之前的爬虫封装成一个类具体代码在这里,经过封装后,爬虫类的工作模式如下:
这里写图片描述

关于后端逻辑

下面来看一下最主要的部分即搜索之后返回结果,在没有加入爬虫功能之前看起来就像下面这样
这里写图片描述
加入爬虫功能之后:
这里写图片描述

搭建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

猜你喜欢

转载自blog.csdn.net/eye_water/article/details/78962295
今日推荐