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重试装饰器示例
Feb 11 Python
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 Python
python中返回矩阵的行列方法
Apr 04 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
Jun 19 Python
python retrying模块的使用方法详解
Sep 25 Python
Python web如何在IIS发布应用过程解析
May 27 Python
Python用类实现扑克牌发牌的示例代码
Jun 01 Python
python批量处理多DNS多域名的nslookup解析实现
Jun 28 Python
序列化Python对象的方法
Aug 01 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
pyqt5打包成exe可执行文件的方法
May 14 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
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
javascript 数组排序函数
2009/08/20 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
python异步存储数据详解
2019/03/19 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
成功的酒店创业计划书
2013/12/27 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
英语课外活动总结
2014/08/27 职场文书
社区党员公开承诺书
2014/08/30 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android