Django-Scrapy生成后端json接口:

网上的关于django-scrapy的介绍比较少,该博客只在本人查资料的过程中学习的,如果不对之处,希望指出改正;

以后的博客可能不会再出关于django相关的点;

人心太浮躁,个人深度不够,只学习了一些皮毛,后面博客只求精,不求多;

希望能坚持下来。加油!


学习点:

  1. 实现效果
  2. django与scrapy的创建
  3. setting中对接的位置和代码段
  4. scrapy_djangoitem使用
  5. scrapy数据爬取保存部分
  6. 数据库设计以及问题部分
  7. django配置

实现效果:

django与scrapy的创建:

django的创建:

  1. django startproject 项目名称
  1. cd 项目名称
  2. python manage.py startapp appname

例如:

scrapy的创建:

  1. # cd django的根目录下
  2. cd job_hnting
  3. scrapy startproject 项目名称
  4. #创建爬虫
  5. scrapy genspider spidername 'www.xxx.com'

例如:

setting的设置:

在scrapy框架中的setting指向django,让django知道有scrapy;

在scrapy中的setting设置;

  1. import os
  2. import django
  3. #导入
  4. os.environ['DJANGO_SETTINGS_MODULE'] = 'job_hnting.settings'
  5. #手动初始化
  6. django.setup()

如:

scrapy_djangoitem使用:

  1. pip install scrapy_djangoitem

该库在scrapy项目下的item中编写引入:

  1. import scrapy
  2. # 引入django中app中models文件中的类
  3. from app51.models import app51data
  4. # scrapy与django对接的库
  5. from scrapy_djangoitem import DjangoItem
  6. class JobprojectItem(DjangoItem):
  7. #引用django下的model中的类名
  8. django_model = app51data

数据存储部分对接在后面解释,现在大体框架完整;

scrapy爬取保存部分:

首先编写scrapy爬虫部分:

我们选取的是51招聘网站的数据:

爬取分为三个函数:

  1. 主函数
  2. 解析函数
  3. 总页数函数

51job的反爬手段:

将json的数据格式隐藏在网页结构中,网上教程需要别的库解析(自行了解),

我们的方法是使用正则匹配提取定位到数据部分,使用json库解析:

  1. # 定位数据位置,提取json数据
  2. search_pattern = "window.__SEARCH_RESULT__ = (.*?)</script>"
  3. jsonText = re.search(search_pattern, response.text, re.M | re.S).group(1)

获得关键字总页数:

  1. # 解析json数据
  2. jsonObject = json.loads(jsonText)
  3. number = jsonObject['total_page']

在主函数中构造页面url并给到解析函数:

  1. for number in range(1,int(numbers)+1):
  2. next_page_url = self.url.format(self.name,number)
  3. # print(next_page_url)
  4. #构造的Urlcallback到data_parse函数中
  5. yield scrapy.Request(url=next_page_url,callback=self.data_parse)

最后在解析函数中提取需要的数据:

  1. for job_item in jsonObject["engine_search_result"]:
  2. items = JobprojectItem()
  3. items['job_name'] = job_item['job_name']
  4. items['company_name'] = job_item["company_name"]
  5. # 发布时间
  6. items['Releasetime'] = job_item['issuedate']
  7. items['salary'] = job_item['providesalary_text']
  8. items['site'] = job_item['workarea_text']
  9. .......

相关的细节部分需要自己调整,完整代码在GitHub中。

数据爬取部分解决后,需要到scrapy项目中的pipline文件保存;

  1. class SeemeispiderPipeline(object):
  2. def process_item(self, item, spider):
  3. item.save()
  4. return item

记得在setting文件中取消掉pipline的注释

设置数据库:

Django配置数据库有两种方法:

方法一:直接在settings.py文件中添加数据库配置信息(个人使用的)

  1. DATABASES = {
  2. # 方法一
  3. 'default': {
  4. 'ENGINE': 'django.db.backends.mysql', # 数据库引擎
  5. 'NAME': 'mysite', # 数据库名称
  6. 'USER': 'root', # 数据库登录用户名
  7. 'PASSWORD': '123', # 密码
  8. 'HOST': '127.0.0.1', # 数据库主机IP,如保持默认,则为127.0.0.1
  9. 'PORT': 3306, # 数据库端口号,如保持默认,则为3306
  10. }
  11. }

方法二:将数据库配置信息存到一个文件中,在settings.py文件中将其引入。

新建数据库配置文件my.cnf(名字随意选择)

  1. [client]
  2. database = blog
  3. user = blog
  4. password = blog
  5. host =127.0.0.1
  6. port = 3306
  7. default-character-set = utf8

在settings.py文件中引入my.cnf文件

  1. DATABASES = {
  2. # 方法二:
  3. 'default': {
  4. 'ENGINE': 'django.db.backends.mysql',
  5. 'OPTIONS': {
  6. 'read_default_file': 'utils/dbs/my.cnf',
  7. },
  8. }
  9. }

启用Django与mysql的连接

在生产环境中安装pymysql并且需要在settings.py文件所在包中的__init__.py中导入pymysql

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

对应前面的item,在spider中编写时按照model设置的即可;;

  1. from django.db import models
  2. # Create your models here.
  3. #定义app51的数据模型
  4. class app51data(models.Model):
  5. #发布时间,长度20
  6. Releasetime = models.CharField(max_length=20)
  7. #职位名,长度50
  8. job_name =models.CharField(max_length=50)
  9. #薪水
  10. salary = models.CharField(max_length=20)
  11. #工作地点
  12. site = models.CharField(max_length=50)
  13. #学历水平
  14. education = models.CharField(max_length=20)
  15. #公司名称
  16. company_name = models.CharField(max_length=50)
  17. #工作经验
  18. Workexperience = models.CharField(max_length=20)
  19. #指定表名
  20. class Meta:
  21. db_table = 'jobsql51'
  22. def __str__(self):
  23. return self.job_name

当指定完表名后,在DBMS中只需要创建对应的数据库即可,表名自动创建

每次修改数据库都要进行以下命令:

  1. python manage.py makemigrations
  2. python manage.py migrate

到此mysql数据库配置完成

配置数据库时遇到的错误:

  1. Django启动报错:AttributeError: 'str' object has no attribute 'decode'

解决方法:

找到Django安装目录

  1. G:\env\django_job\Lib\site-packages\django\db\backends\mysql\operations.py

编辑operations.py;

将146行的decode修改成encode

  1. def last_executed_query(self, cursor, sql, params):
  2. # With MySQLdb, cursor objects have an (undocumented) "_executed"
  3. # attribute where the exact query sent to the database is saved.
  4. # See MySQLdb/cursors.py in the source distribution.
  5. query = getattr(cursor, '_executed', None)
  6. if query is not None:
  7. #query = query.decode(errors='replace')
  8. uery = query.encode(errors='replace')
  9. return query

django配置:

关于django的基础配置,如路由,app的注册等基础用法,暂时不过多说明;

以下主要关于APP中视图的配置,生成json;

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. # Create your views here.
  4. #引入数据
  5. from .models import app51data
  6. import json
  7. def index(request):
  8. # return HttpResponse("hello world")
  9. # return render(request,'index.html')
  10. #获取所有的对象,转换成json格式
  11. data =app51data.objects.all()
  12. list3 = []
  13. i = 1
  14. for var in data:
  15. data = {}
  16. data['id'] = i
  17. data['Releasetime'] = var.Releasetime
  18. data['job_name'] = var.job_name
  19. data['salary'] = var.salary
  20. data['site'] = var.site
  21. data['education'] = var.education
  22. data['company_name'] = var.company_name
  23. data['Workexperience'] = var.Workexperience
  24. list3.append(data)
  25. i += 1
  26. # a = json.dumps(data)
  27. # b = json.dumps(list2)
  28. # 将集合或字典转换成json 对象
  29. c = json.dumps(list3)
  30. return HttpResponse(c)

实现效果:

完整代码在GitHub中,希望随手star,感谢!

如果有问题欢迎留言,日常在线。

Django-Scrapy生成后端json接口的更多相关文章

  1. scrapy生成json中文为ASCII码解决

    修改pipelines.py 即可 修改内容如下: import json import codecs import os class BaiduNewsPipeline(object): #增加的 ...

  2. 循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

    循序渐进VUE+Element 前端应用开发的系列文章中,前面介绍了系统各个功能的处理实现,本篇随笔从一个主线上介绍前后端开发的整合,让我们从ABP框架后端的查询接口的处理,前端API接口调用的封装, ...

  3. 如何使用 Python 编写后端 API 接口

    如何使用 Python 编写后端 API 接口 get API Python3 # coding:utf-8 import json # ModuleNotFoundError: No module ...

  4. 使用egg.js开发后端API接口系统

    什么是Egg.js Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本.详细的了解可以参考Egg.js的官网:https:// ...

  5. Loadrunner模拟JSON接口请求进行测试

    Loadrunner模拟JSON接口请求进行测试     一.loadrunner脚本创建 1.Insert - New step -选择Custom Request -  web_custom_re ...

  6. js根据条件json生成随机json:randomjson

    前端开发中,在做前后端分离的时候,经常需要手写json数据,有3个问题特别揪心: 1,数据是写死的,不能按一定的条件随机生成长度不一,内容不一的数据 2,写数组的时候,如果有很多条,需要一条一条地写, ...

  7. 纯CSS菜单样式,及其Shadow DOM,Json接口 实现

    先声明,要看懂这篇博客要求你具备少量基础CSS知识, 当然如果你只是要用的话就随便了,不用了解任何知识 完整项目github链接:https://github.com/git-Code-Shelf/M ...

  8. JSON 接口如何实现 RSA 非对称加密与签名

    代码地址如下:http://www.demodashi.com/demo/14000.html 一.概述 1. 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套公 ...

  9. [淘宝客技术篇008](无需登录)淘宝天猫优惠券JSON接口1

    今天,小星给大家分享的是一个非常重要,非常有意义的接口:获取淘宝天猫优惠券的JSON接口. 先上个链接: http://uland.taobao.com/cp/coupon_list?pid=mm_2 ...

随机推荐

  1. laravel核心Ioc容器

    laravel容器和依赖注入 啥是Ioc容器,方便我们实现依赖注入的一种实现,也就是说依赖注入不一定需要控制反转容器,只不过使用容器可能会方便些. laravel通过向容器中绑定接口的具体实现,可实现 ...

  2. 【转】LeakCanary

    LeakCanary:检测所有的内存泄漏 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0509/2854.html 原文: L ...

  3. 基于PHP实现CMS识别

    最近正在开发一款基于PHP实现的Web安全检测平台,写到了CMS识别这一功能,便写一篇文章总结一下. 首先需要梳理的是CMS识别的几种方法: 1.网页源代码特征:例如源代码中包含CMS的名称或是某种特 ...

  4. Johnson全源最短路

    例题:P5905 [模板]Johnson 全源最短路 首先考虑求全源最短路的几种方法: Floyd:时间复杂度\(O(n^3)\),可以处理负权边,但不能处理负环,而且速度很慢. Bellman-Fo ...

  5. 阿里云体验实验室 体验教程《Linux指令入门-系统管理》

    体验平台简介 阿里云开发者实验室提供免费云资源和丰富的场景化实践,旨在帮助开发者在学习应用技术,了解阿里云产品的特性. 阿里云体验实验室地址:https://developer.aliyun.com/ ...

  6. 写Junit测试时用Autowired注入的类实例始终为空怎么解?

    踩坑半天多,终于在网上寻觅到了解决方案,特此分享一下. 重要前提:src/main/java下的根包名必须和src/test/main的根包名完全一致,否则就会发生死活不能注入的情况,要继续进行下面的 ...

  7. ELK入门及基本使用

    预备知识-Restful 起源 在没有前后端分离概念之前,一个网站的完成总是“all in one”,在这个阶段,页面.数据.渲染全部在服务端完成,这样做的最大的弊端是后期维护,扩展极其痛苦,开发人员 ...

  8. docker 容器中部署 Go 服务时,请求 https 文件时抛错

    错误提示: Get https://res.ddkt365.com/ddktRes/imageRes/wx_headimg/0f1d9e55913c22bcaf7cca9b38048d29.jpeg: ...

  9. 干Java这一行,应该怎样提升自己?

    前段时间,字节跳动在阿里巴巴的大本营杭州悄悄的建立一个研发中心,最近在疯狂招人. 相信最近一段时间,杭州的很多的互联网公司的开发人员都接到过猎头的电话.据了解,字节跳动杭州研发中心主要负责字节跳动新增 ...

  10. Medium

    https://www.medium.com 破解阅读限制 https://medium-unlimited.ml/download/