Django-Scrapy生成后端json接口的方法示例
網(wǎng)上的關(guān)于django-scrapy的介紹比較少,該博客只在本人查資料的過(guò)程中學(xué)習(xí)的,如果不對(duì)之處,希望指出改正;
以后的博客可能不會(huì)再出關(guān)于django相關(guān)的點(diǎn);
人心太浮躁,個(gè)人深度不夠,只學(xué)習(xí)了一些皮毛,后面博客只求精,不求多;
希望能堅(jiān)持下來(lái)。加油!
學(xué)習(xí)點(diǎn):
- 實(shí)現(xiàn)效果
- django與scrapy的創(chuàng)建
- setting中對(duì)接的位置和代碼段
- scrapy_djangoitem使用
- scrapy數(shù)據(jù)爬取保存部分
- 數(shù)據(jù)庫(kù)設(shè)計(jì)以及問(wèn)題部分
- django配置
實(shí)現(xiàn)效果:

django與scrapy的創(chuàng)建:
django的創(chuàng)建:
django startproject 項(xiàng)目名稱(chēng)
cd 項(xiàng)目名稱(chēng) python manage.py startapp appname
例如:

scrapy的創(chuàng)建:
# cd django的根目錄下 cd job_hnting scrapy startproject 項(xiàng)目名稱(chēng) #創(chuàng)建爬蟲(chóng) scrapy genspider spidername 'www.xxx.com'
例如:
setting的設(shè)置:
在scrapy框架中的setting指向django,讓django知道有scrapy;
在scrapy中的setting設(shè)置;
import os import django #導(dǎo)入 os.environ['DJANGO_SETTINGS_MODULE'] = 'job_hnting.settings' #手動(dòng)初始化 django.setup()
如:

scrapy_djangoitem使用:
pip install scrapy_djangoitem
該庫(kù)在scrapy項(xiàng)目下的item中編寫(xiě)引入:
import scrapy # 引入django中app中models文件中的類(lèi) from app51.models import app51data # scrapy與django對(duì)接的庫(kù) from scrapy_djangoitem import DjangoItem class JobprojectItem(DjangoItem): #引用django下的model中的類(lèi)名 django_model = app51data
數(shù)據(jù)存儲(chǔ)部分對(duì)接在后面解釋?zhuān)F(xiàn)在大體框架完整;
scrapy爬取保存部分:
首先編寫(xiě)scrapy爬蟲(chóng)部分:
我們選取的是51招聘網(wǎng)站的數(shù)據(jù):
爬取分為三個(gè)函數(shù):
- 主函數(shù)
- 解析函數(shù)
- 總頁(yè)數(shù)函數(shù)
51job的反爬手段:
將json的數(shù)據(jù)格式隱藏在網(wǎng)頁(yè)結(jié)構(gòu)中,網(wǎng)上教程需要?jiǎng)e的庫(kù)解析(自行了解),
我們的方法是使用正則匹配提取定位到數(shù)據(jù)部分,使用json庫(kù)解析:
# 定位數(shù)據(jù)位置,提取json數(shù)據(jù)
search_pattern = "window.__SEARCH_RESULT__ = (.*?)</script>"
jsonText = re.search(search_pattern, response.text, re.M | re.S).group(1)
獲得關(guān)鍵字總頁(yè)數(shù):
# 解析json數(shù)據(jù)
jsonObject = json.loads(jsonText)
number = jsonObject['total_page']
在主函數(shù)中構(gòu)造頁(yè)面url并給到解析函數(shù):
for number in range(1,int(numbers)+1):
next_page_url = self.url.format(self.name,number)
# print(next_page_url)
#構(gòu)造的Urlcallback到data_parse函數(shù)中
yield scrapy.Request(url=next_page_url,callback=self.data_parse)
最后在解析函數(shù)中提取需要的數(shù)據(jù):
for job_item in jsonObject["engine_search_result"]:
items = JobprojectItem()
items['job_name'] = job_item['job_name']
items['company_name'] = job_item["company_name"]
# 發(fā)布時(shí)間
items['Releasetime'] = job_item['issuedate']
items['salary'] = job_item['providesalary_text']
items['site'] = job_item['workarea_text']
.......
相關(guān)的細(xì)節(jié)部分需要自己調(diào)整,完整代碼在 GitHub 中。
數(shù)據(jù)爬取部分解決后,需要到scrapy項(xiàng)目中的pipline文件保存;
class SeemeispiderPipeline(object):
def process_item(self, item, spider):
item.save()
return item
記得在setting文件中取消掉pipline的注釋
設(shè)置數(shù)據(jù)庫(kù):
Django配置數(shù)據(jù)庫(kù)有兩種方法:
方法一:直接在settings.py文件中添加數(shù)據(jù)庫(kù)配置信息(個(gè)人使用的)
DATABASES = {
# 方法一
'default': {
'ENGINE': 'django.db.backends.mysql', # 數(shù)據(jù)庫(kù)引擎
'NAME': 'mysite', # 數(shù)據(jù)庫(kù)名稱(chēng)
'USER': 'root', # 數(shù)據(jù)庫(kù)登錄用戶名
'PASSWORD': '123', # 密碼
'HOST': '127.0.0.1', # 數(shù)據(jù)庫(kù)主機(jī)IP,如保持默認(rèn),則為127.0.0.1
'PORT': 3306, # 數(shù)據(jù)庫(kù)端口號(hào),如保持默認(rèn),則為3306
}
}
方法二:將數(shù)據(jù)庫(kù)配置信息存到一個(gè)文件中,在settings.py文件中將其引入。
新建數(shù)據(jù)庫(kù)配置文件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的連接
在生產(chǎn)環(huán)境中安裝pymysql 并且需要在settings.py文件所在包中的 __init__.py 中導(dǎo)入pymysql

import pymysql pymysql.install_as_MySQLdb()
對(duì)應(yīng)前面的item,在spider中編寫(xiě)時(shí)按照model設(shè)置的即可;;
from django.db import models
# Create your models here.
#定義app51的數(shù)據(jù)模型
class app51data(models.Model):
#發(fā)布時(shí)間,長(zhǎng)度20
Releasetime = models.CharField(max_length=20)
#職位名,長(zhǎng)度50
job_name =models.CharField(max_length=50)
#薪水
salary = models.CharField(max_length=20)
#工作地點(diǎn)
site = models.CharField(max_length=50)
#學(xué)歷水平
education = models.CharField(max_length=20)
#公司名稱(chēng)
company_name = models.CharField(max_length=50)
#工作經(jīng)驗(yàn)
Workexperience = models.CharField(max_length=20)
#指定表名
class Meta:
db_table = 'jobsql51'
def __str__(self):
return self.job_name
當(dāng)指定完表名后,在DBMS中只需要?jiǎng)?chuàng)建對(duì)應(yīng)的數(shù)據(jù)庫(kù)即可,表名自動(dòng)創(chuàng)建
每次修改數(shù)據(jù)庫(kù)都要進(jìn)行以下命令:
python manage.py makemigrations python manage.py migrate
到此mysql數(shù)據(jù)庫(kù)配置完成
配置數(shù)據(jù)庫(kù)時(shí)遇到的錯(cuò)誤:
Django啟動(dòng)報(bào)錯(cuò):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配置:
關(guān)于django的基礎(chǔ)配置,如路由,app的注冊(cè)等基礎(chǔ)用法,暫時(shí)不過(guò)多說(shuō)明;
以下主要關(guān)于APP中視圖的配置,生成json;
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
#引入數(shù)據(jù)
from .models import app51data
import json
def index(request):
# return HttpResponse("hello world")
# return render(request,'index.html')
#獲取所有的對(duì)象,轉(zhuǎn)換成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)
# 將集合或字典轉(zhuǎn)換成json 對(duì)象
c = json.dumps(list3)
return HttpResponse(c)
實(shí)現(xiàn)效果:

完整代碼在 GitHub 中,希望隨手star,感謝!
到此這篇關(guān)于Django-Scrapy生成后端json接口的方法示例的文章就介紹到這了,更多相關(guān)Django Scrapy生成json接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python標(biāo)準(zhǔn)算法實(shí)現(xiàn)數(shù)組全排列的方法
這篇文章主要介紹了python標(biāo)準(zhǔn)算法實(shí)現(xiàn)數(shù)組全排列的方法,實(shí)例分析了全排列的原理與Python實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-03-03
TensorFlow keras卷積神經(jīng)網(wǎng)絡(luò) 添加L2正則化方式
這篇文章主要介紹了TensorFlow keras卷積神經(jīng)網(wǎng)絡(luò) 添加L2正則化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
python函數(shù)超時(shí)自動(dòng)退出的實(shí)操方法
在本篇文章里小編給大家整理的是一篇關(guān)于python函數(shù)超時(shí)自動(dòng)退出的實(shí)操方法,有需要的朋友們可以學(xué)習(xí)下。2020-12-12
常見(jiàn)的在Python中實(shí)現(xiàn)單例模式的三種方法
這篇文章主要介紹了常見(jiàn)的在Python中實(shí)現(xiàn)單例模式的三種方法,單例模式在各個(gè)編程語(yǔ)言的學(xué)習(xí)中都是需要掌握的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-04-04
pycharm創(chuàng)建scrapy項(xiàng)目教程及遇到的坑解析
這篇文章主要介紹了pycharm創(chuàng)建scrapy項(xiàng)目教程及遇到的坑解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python實(shí)現(xiàn)定時(shí)任務(wù)的九種方案總結(jié)
定時(shí)任務(wù)是編程中常見(jiàn)的需求,它可以按照預(yù)定的時(shí)間表執(zhí)行特定的任務(wù)或操作,在Python中,有多種方法可以實(shí)現(xiàn)定時(shí)任務(wù),下面小編就來(lái)和大家詳細(xì)講講吧2023-11-11
Python爬蟲(chóng)之App爬蟲(chóng)視頻下載的實(shí)現(xiàn)
這篇文章主要介紹了Python爬蟲(chóng)之App爬蟲(chóng)視頻下載的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Python 統(tǒng)計(jì)Jira的bug 并發(fā)送郵件功能
這篇文章主要介紹了Python 統(tǒng)計(jì)Jira的bug 并發(fā)送郵件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01

