Django-Scrapy生成后端json接口的方法示例

网上的关于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

Django-Scrapy生成后端json接口的方法示例

扫一扫手机访问