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实现读取excel写入mysql的小工具详解
Nov 20 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
Python测试人员需要掌握的知识
Feb 08 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
使用python3实现操作串口详解
Jan 01 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
Python PO设计模式的具体使用
Aug 16 Python
PyTorch预训练的实现
Sep 18 Python
十个Python自动化常用操作,即拿即用
May 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图像处理类代码分享
2012/01/19 PHP
浅析php面向对象public private protected 访问修饰符
2013/06/30 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
php技巧小结【推荐】
2017/01/19 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
js 幻灯片的实现
2011/12/06 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
jQuery为DOM动态追加事件的方法
2017/02/16 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
python读写csv文件方法详细总结
2019/07/05 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
python中的yield from语法快速学习
2020/11/06 Python
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
最热门的自我评价
2013/12/30 职场文书
仓库管理制度
2014/01/21 职场文书
运动会广播稿50字
2015/08/19 职场文书
创业计划书之服装
2019/10/07 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL