Django-Scrapy生成后端json接口的方法示例


Posted in Python onOctober 06, 2020

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

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

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

希望能坚持下来。加油!

学习点:

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

实现效果:

Django-Scrapy生成后端json接口的方法示例

django与scrapy的创建:

django的创建:

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

例如:

Django-Scrapy生成后端json接口的方法示例

scrapy的创建:

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

例如:

Django-Scrapy生成后端json接口的方法示例 

setting的设置:

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

在scrapy中的setting设置;

import os
import django

#导入
os.environ['DJANGO_SETTINGS_MODULE'] = 'job_hnting.settings'
#手动初始化
django.setup()

如:

Django-Scrapy生成后端json接口的方法示例

scrapy_djangoitem使用:

pip install scrapy_djangoitem

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

import scrapy
# 引入django中app中models文件中的类
from app51.models import app51data
# scrapy与django对接的库
from scrapy_djangoitem import DjangoItem


class JobprojectItem(DjangoItem):
  #引用django下的model中的类名
  django_model = app51data

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

scrapy爬取保存部分:

首先编写scrapy爬虫部分:

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

爬取分为三个函数:

  • 主函数
  • 解析函数
  • 总页数函数

51job的反爬手段:

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

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

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

获得关键字总页数:

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

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

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

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

for job_item in jsonObject["engine_search_result"]:
      items = JobprojectItem()
      items['job_name'] = job_item['job_name']
      items['company_name'] = job_item["company_name"]
      # 发布时间
      items['Releasetime'] = job_item['issuedate']
      items['salary'] = job_item['providesalary_text']
      items['site'] = job_item['workarea_text']
      .......

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

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

class SeemeispiderPipeline(object):
  def process_item(self, item, spider):
    item.save()
    return item

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

设置数据库:

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

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

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

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

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

[client]
database = blog
user = blog
password = blog
host =127.0.0.1
port = 3306
default-character-set = utf8

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

DATABASES = {
  # 方法二:
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'OPTIONS': {
      'read_default_file': 'utils/dbs/my.cnf',
    },
  }
}

启用Django与mysql的连接

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

Django-Scrapy生成后端json接口的方法示例

import pymysql
pymysql.install_as_MySQLdb()

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

from django.db import models
# Create your models here.
#定义app51的数据模型
class app51data(models.Model):
  #发布时间,长度20
  Releasetime = models.CharField(max_length=20)
  #职位名,长度50
  job_name =models.CharField(max_length=50)
  #薪水
  salary = models.CharField(max_length=20)
  #工作地点
  site = models.CharField(max_length=50)
  #学历水平
  education = models.CharField(max_length=20)
  #公司名称
  company_name = models.CharField(max_length=50)
  #工作经验
  Workexperience = models.CharField(max_length=20)
  #指定表名
  class Meta:
    db_table = 'jobsql51'

  def __str__(self):
    return self.job_name

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

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

python manage.py makemigrations
python manage.py migrate

到此mysql数据库配置完成

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

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

解决方法:

找到Django安装目录

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

编辑operations.py;

将146行的decode修改成encode

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

django配置:

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

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

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
#引入数据
from .models import app51data
import json

def index(request):
  # return HttpResponse("hello world")
  # return render(request,'index.html')
  #获取所有的对象,转换成json格式
  data =app51data.objects.all()
  list3 = []
  i = 1
  for var in data:
    data = {}
    data['id'] = i
    data['Releasetime'] = var.Releasetime
    data['job_name'] = var.job_name
    data['salary'] = var.salary
    data['site'] = var.site
    data['education'] = var.education
    data['company_name'] = var.company_name
    data['Workexperience'] = var.Workexperience
    list3.append(data)
    i += 1

  # a = json.dumps(data)
  # b = json.dumps(list2)

  # 将集合或字典转换成json 对象
  c = json.dumps(list3)
  return HttpResponse(c)

实现效果:

Django-Scrapy生成后端json接口的方法示例

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

到此这篇关于Django-Scrapy生成后端json接口的方法示例的文章就介绍到这了,更多相关Django Scrapy生成json接口内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
python用户管理系统的实例讲解
Dec 23 Python
Python3实现的简单验证码识别功能示例
May 02 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
python3利用venv配置虚拟环境及过程中的小问题小结
Aug 01 Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
python的一些加密方法及python 加密模块
Jul 11 Python
20行Python代码实现视频字符化功能
Apr 13 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
Python生成器传参数及返回值原理解析
Jul 22 Python
Python如何定义有默认参数的函数
Aug 10 Python
Python3如何使用range函数替代xrange函数
Oct 05 #Python
Python threading模块condition原理及运行流程详解
Oct 05 #Python
Python urllib库如何添加headers过程解析
Oct 05 #Python
Python3获取cookie常用三种方案
Oct 05 #Python
Python collections.deque双边队列原理详解
Oct 05 #Python
Python全局变量与global关键字常见错误解决方案
Oct 05 #Python
Python定时任务框架APScheduler原理及常用代码
Oct 05 #Python
You might like
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
EsLint入门学习教程
2017/02/17 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
Python2包含中文报错的解决方法
2018/07/09 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
UGG英国官方网站:UGG UK
2018/02/08 全球购物
几个人围成一圈的问题
2013/09/26 面试题
大学系主任推荐信范文
2013/12/24 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
煤矿安全保证书
2015/02/27 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python