做项目(Django)的小模块积累---python及爬虫

标签: 分页

今日语:积少成多,积水成渊

     一、分页代码,我想不管在什么网站上都避免不了分页,那我就简单介绍一下python中的分页代码吧~~

    1.先看后台的代码:(在apps的views中实现)

from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage

 # 用GET方式请求页面
  pagenum = request.GET.get('pagenum', 1)
 #括号中的“2”指的是一页放几块内容
  pa = Paginator(all_courses, 2)
  #用try...except捕获翻页时出现的一些错误,包括小数页
  try:
    page_list = pa.page(pagenum)
  except PageNotAnInteger:
    page_list = pa.page(1)
 # 捕获最后一页
  except EmptyPage:
        page_list = pa.page(pa.num_pages)

    2.接下来看前端页面的分页代码~~

 <div class="pageturn">
              <ul class="pagelist">
                      {% if page_list.has_previous %}
                               <li class="long"><a href="?pagenum={{ page_list.previous_page_number }}&sort={{ sort_type }}">上一页</a>
               </li>
                      {% else %}
                               <li class="long"><a href="?pagenum=1&sort={{ sort_type }}">上一页</a></li>
                                {% endif %}

  {% for num in page_list.paginator.page_range %}        
                  <li {% if num == page_list.number %}class="active"{% endif %}><a href="?pagenum={{ num }}&sort={{ sort_type }}">{{ num }}</a></li>
                           {% endfor %}
                                    {% if page_list.has_next %}
                                        <li class="long"><a
                                                href="?pagenum={{ page_list.next_page_number }}&sort={{ sort_type }}">下一页</a>
                                        </li>
                                    {% else %}
                                        <li class="long"><a
                                                href="?pagenum={{ page_list.paginator.num_pages }}&sort={{ sort_type }}">下一页</a>
                                        </li>
                                    {% endif %}
                                </ul>
                            </div>

总结一下:此分页器做的是简单的少数分页,并不是我们在大网站上见到的那样中间有省略号的;效果如下:(感觉这样看起来还事蛮不错的呢~)

这里写图片描述

3.使用scrapy框架,将爬取出的数据存入数据库中(mongodb)
配置思路
1、不遵循爬虫协议;
2、配置mongo相关配置;
3、禁用cookie;
4、配置浏览器身份;

a.首先要配置settings.py
这里写图片描述
这里写图片描述
这里写图片描述

b.pipelines.py
配置思路
1)在init方法中得到mongo配置信息
2)根据配置信息创建数据库和表,并且连接
3)在process_item插入数据,插入前转成字典(dict),并且一定要注意返回item,否则级别低的管道建会没有数据

import pymongo
from  pymongo import MongoClient
from scrapy.conf import settings
from DouBan.settings import MONGO_HOST
from DouBan.settings import MONGO_PORT
from DouBan.settings import MONGO_DBNAME
from DouBan.settings import SHEET_NAME

class DoubanMongodbPipeline(object):
    def __init__(self):
        print("DoubanMongodbPipeline.__init__----")
        host = settings["MONGO_HOST"]
        port = settings["MONGO_PORT"]
        dbname = settings["MONGO_DBNAME"]
        sheetname = settings["SHEET_NAME"]
        print("host===",host)
        print("port===", port)
        print("dbname===", dbname)
        print("sheetname===", sheetname)

        #创建客户端
        client = pymongo.MongoClient(host=host,port=port)
        #得到或者创建数据库对象
        mydb = client[dbname]
        #得到或者创建表
        self.post = mydb[sheetname]

    def process_item(self,item,spider):
        dict_item = dict(item)
        #往mongodb里面插入数据
        self.post.insert(dict_item)
        return item

    def close_spider(self,spider):
        print("DoubanMongodbPipeline.close_spider-----")

效果:
这里写图片描述
查看mongodb数据

首先启动MongoDB数据库需要两个命令:
mongod:是mongoDB数据库进程本身
mongo:是命令行shell客户端
sudo mongod     首先启动数据库服务,再执行Scrapy
sudo mongo     启动数据库shell
在mongo shell下使用命令:
查看当前数据库
db
列出所有的数据库
show dbs
连接douban数据库
use douban
列出所有表
show collections
查看表里的数据
db.Douban250.find()
这里写图片描述
接下来查看数据库:
这里写图片描述

     二、浅谈一下AJAX,首先介绍一下它的作用。

1.页面只会局部刷新,在页面内与服务器异步通信,给用户以更好的体验
2.Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。
3.具有更加迅速的响应能力,因为它使用异步的方式与服务器通信,不需要打断用户。

{% block myjs %}
    <script>
        $(function () {
            $('#jsRightBtn').click(function () {
                {#val:表单类元素值#}
                var loveid = {{ teacher.orginfo.id }};
                var lovetype = $(this).attr('data-fav-type');

                $.ajax({
                    type: 'GET',
                    url: '{% url 'operations:user_love' %}',
                    data: {
                        'loveid': loveid,
                        'lovetype': lovetype

                    },
                    success: function (callback) {
                        if (callback.status == 'ok') {
                            $('#jsRightBtn').text(callback.msg);

                        } else {
                            alert(callback.msg)
                        }
                    }
                })
            });
            $('#jsLeftBtn').click(function () {
                {#val:表单类元素值#}
                var loveid = {{ teacher.id }};
                var lovetype = $(this).attr('data-fav-type');

                $.ajax({
                    type: 'GET',
                    url: '{% url 'operations:user_love' %}',
                    data: {
                        'loveid': loveid,
                        'lovetype': lovetype

                    },
                    success: function (callback) {
                        if (callback.status == 'ok') {
                            $('#jsLeftBtn').text(callback.msg);

                        } else {
                            alert(callback.msg)
                        }
                    }
                })
            });

        })
    </script>
{% endblock %}

三.前后端分离类目和图片不显示的原因:(除了跨域的错误)

1.此图之前是配置分页的时候写的,如果想显示美丽的界面和类目,就需要注释掉,因为这是全局的,会影响数据显示。
这里写图片描述
2.跨域问题:settings中的配置:
这里写图片描述
这里写图片描述
这里写图片描述
之后前后端运行起来,刷新,就有好看的界面喽~
这里写图片描述

注意:大坑,一定要注意!

版权声明:本文为qq_37143745原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37143745/article/details/80821057

智能推荐

mybatis+ehcache二级缓存

导入jar包 mapper.xml文件开启二级缓存 pojo类实现序列化接口 配置ehcache.xml 测试...

python+opencv实现图像拼接

任务 拍摄两张图片去除相同部分,拼接在一起 原图 结果 步骤 读取两张图片 使用sift检测关键点及描述因子 匹配关键点 处理并保存关键点 得到变换矩阵 图像变换并拼接 代码实现 扩展 这里对右边图像进行变换,右边变得模糊,可以修改代码对左边图像变换 这里只有两张图片拼接,可以封装实现多张图片拼接 可以修改代码实现上下图片的拼接...

python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)         本文主要目的是通过一个简单的小...

memmove函数与memcpy函数的模拟实现

memmove函数和memcpy函数都是在内存复制任意类型的,但是它俩也有区别。当源区域和目标区域有重复的,memmove函数会复制缓冲区重叠的部分,而memcpy相反,会报出未知错误。 下面给出两个函数的实现 首先,memmove函数。 实现的基本原理如下图。 具体代码如下: memcpy函数的实现很简单,就直接给出源代码了...

猜你喜欢

SpringFramework核心 - IOC容器的实现 - 总结

1. 概述 把Spring技术内幕第一章和第二章过了一遍,也做了一些笔记, 对IOC容器的实现有了一定皮毛理解,现在跟着源码再过一遍总结一下IOC容器的初始化,Bean的初始化的过程,做一下总结 ① IOC容器和简单工厂模式 在开始之前,先想想我们平时是怎么使用IOC容器为我们管理Bean的,假设我们要把下面的User类交给IOC容器管理 我们不想关心如何创建一个User对象实例的,仅仅在需要他的...

Python和Django的安装

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈  一、下载并安装Python Python 官方下载地址:http://www.python.org/ftp/python/ 我们这里选择的是 Python 2.7.2 。虽然目前最新版是Python 3.2.2, 但是Django目前还不支持 Python 3.2.2。 安装步骤很简单,双击安装包开...

OpenStack代码贡献初体验

为什么80%的码农都做不了架构师?>>>     OpenStack如今已成为开源云平台中的明星项目,得到广泛关注。OpenStack的优秀出众依赖于众多开发者的努力,在享受其带来的便利与快捷的同时,为其做一份贡献也是一个开发者的义务。  在前段时间的OpenStack的测试过程中,我发现Nova项目中的一个Bug,于是向社区提交了Bug报...

SQL Server之8:sql查询每个学生得分最高的两门课

这是一道面试题,今天有空把它记下来,以后遇到此类问题作个参考!刚一看到这个题目,估计好多人都会想到关键字top,其实这里用到的关键字是partition, 好了,先看看表结构,及数据吧!     接下来看一看partition的功能,执行语句   结果如下:   到这里一目了然知道最终结果了!   View Code     &...

vue-video-player 浏览器缩放

文章目录 前言 一、vue-video-player的封装 二、调用 1. 引入 2. vue template代码 2. 主要js代码 效果 前言 此篇是在上一次《[Vue 播放rtmp直播流]》基础之上的更新及补充;近期接到客户需求,需要在视频流上显示额外的信息;当然,视频流上叠加信息可以通过canvas来完成(透明canvas实现),但是在测试的过程中发现,当浏览器缩放时,叠加的图层信息与初...