Django-Scrapy实现生成后端json接口

发布时间:2020-10-29 23:46:25 作者:Leah
来源:亿速云 阅读:173

这期内容当中小编将会给大家带来有关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__ = (.*&#63;)</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接口

上述就是小编为大家分享的Django-Scrapy实现生成后端json接口了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 基于vue和springmvc前后端分离,json类接口调用介绍
  2. 利用JAVA如何实现JSON前后端的数据传递

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

django-scrapy dj json

上一篇:FTP、FTPS 与 SFTP的区别有哪些

下一篇:C++11新特性std::tuple的用方

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》