Django-Scrapy生成后端json接口的方法示例
作者:欢迎来到xbhog博客 发布时间:2021-07-16 18:46:46
网上的关于django-scrapy的介绍比较少,该博客只在本人查资料的过程中学习的,如果不对之处,希望指出改正;
以后的博客可能不会再出关于django相关的点;
人心太浮躁,个人深度不够,只学习了一些皮毛,后面博客只求精,不求多;
希望能坚持下来。加油!
学习点:
实现效果
django与scrapy的创建
setting中对接的位置和代码段
scrapy_djangoitem使用
scrapy数据爬取保存部分
数据库设计以及问题部分
django配置
实现效果:
django与scrapy的创建:
django的创建:
django startproject 项目名称
cd 项目名称
python manage.py startapp appname
例如:
scrapy的创建:
# cd django的根目录下
cd job_hnting
scrapy startproject 项目名称
#创建爬虫
scrapy genspider spidername 'www.xxx.com'
例如:
setting的设置:
在scrapy框架中的setting指向django,让django知道有scrapy;
在scrapy中的setting设置;
import os
import django
#导入
os.environ['DJANGO_SETTINGS_MODULE'] = 'job_hnting.settings'
#手动初始化
django.setup()
如:
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
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)
实现效果:
完整代码在 GitHub 中,希望随手star,感谢!
来源:https://www.cnblogs.com/xbhog/p/13761988.html


猜你喜欢
- 限定范围拖拽目录代码实例与简易拖拽的差异下载源码链接 代码实例* { padding: 0; margin: 0;}#box1 {
- 首先停止mysql服务: root@webserver:/home/webmaster# service mysql stop 接着采用忽略
- PJBLOG3的相关日志,现在网上好像还没有谁有相关的修改说明吧,反正升级之后,正好有必要,也就写了个,在这里也给大家共享共享。当前相关日志
- 动态添加input并动态添加新验证方式!init状态: 点击“+”后: 验证后:知识点:1 先去官网下载:http://
- 本文实例讲述了微信小程序MUI导航栏透明渐变功能。分享给大家供大家参考,具体如下:导航栏透明渐变效果实现原理1. 利用position:ab
- what's the math 模块Python math 模块提供了许多对浮点数的数学运算函数。需要注意的是,这些函数一般是对平台
- 详解python实现读取邮件数据并下载附件的实例实现结果图:实现代码:#!/usr/bin/python2.7# _*_ coding: u
- web表单是web应用程序的基本功能。它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入
- 有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS
- 尽管某些书籍上总是说避免使用全局变量,但是在实际的需求不断变化中,往往定义一个全局变量是最可靠的方法,但是又必须要避免变量名覆盖。Pytho
- 递归函数两大特点:1.能够调用函数自身2.至少有一个出口(结束函数自身调用)函数实现:def calnum(num): if n
- 本文为大家分享了多种方法求质数python实现代码,供大家参考,具体内容如下题目要求是求所有小于n的质数的个数。 求质数方法1: 穷举法:
- list/tuple转置:以二维grid[][]为例:grid = [[row[i] for row in grid] for i in r
- 一.下载安装包1.安装网址https://www.jetbrains.com/pycharm/2.在导航栏输入网址回车3.点击 DOWNLO
- 很多人可能认为门户网站首页设计只是把一些导航、资讯内容和广告堆积起来摆放得好看就可以了,虽然这个观点也并不是完全错误的,确实门户网站首页是由
- 本文实例为大家分享了python机器学习实现决策树的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-&quo
- #HelloWorld是文件名称,Hello是类from HelloWorld import Hello调用,Hello类的方法:>&
- 一,写在前面的话最近公司需要按天,按小时查看数据,可以直观的看到时间段的数据峰值。接到需求,就开始疯狂百度搜索,但是搜索到的资料有很多都不清
- Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼。装饰器引入初期及问题诞生假如
- 前言: 不要试图用强制方法杀掉一个python线程,这从服务设计上就存在不合理性。 多线程本用来任务的协