• 售前

  • 售后

热门帖子
入门百科

Django结合使用Scrapy爬取数据入库的方法示例

[复制链接]
earth20011 显示全部楼层 发表于 2021-10-26 13:50:13 |阅读模式 打印 上一主题 下一主题
在django项目根目次位置创建scrapy项目,django_12是django项目,ABCkg是scrapy爬虫项目,app1是django的子应用

2.在Scrapy的settings.py中参加以下代码
  1. import os
  2. import sys
  3. sys.path.append(os.path.dirname(os.path.abspath('.')))
  4. os.environ['DJANGO_SETTINGS_MODULE'] = 'django_12.settings'  # 项目名.settings
  5. import django
  6. django.setup()
复制代码
3.编写爬虫,下面代码以ABCkg为例,abckg.py
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. from ABCkg.items import AbckgItem
  4. class AbckgSpider(scrapy.Spider):
  5.   name = 'abckg'  #爬虫名称
  6.   allowed_domains = ['www.abckg.com'] # 允许爬取的范围
  7.   start_urls = ['http://www.abckg.com/'] # 第一次请求的地址
  8.   def parse(self, response):
  9.     print('返回内容:{}'.format(response))
  10.     """
  11.     解析函数
  12.     :param response: 响应内容
  13.     :return:
  14.     """
  15.     listtile = response.xpath('//*[@id="container"]/div/div/h2/a/text()').extract()
  16.     listurl = response.xpath('//*[@id="container"]/div/div/h2/a/@href').extract()
  17.     for index in range(len(listtile)):
  18.       item = AbckgItem()
  19.       item['title'] = listtile[index]
  20.       item['url'] = listurl[index]
  21.       yield scrapy.Request(url=listurl[index],callback=self.parse_content,method='GET',dont_filter=True,meta={'item':item})
  22.     # 获取下一页
  23.     nextpage = response.xpath('//*[@id="container"]/div[1]/div[10]/a[last()]/@href').extract_first()
  24.     print('即将请求:{}'.format(nextpage))
  25.     yield scrapy.Request(url=nextpage,callback=self.parse,method='GET',dont_filter=True)
  26.     # 获取详情页
  27.   def parse_content(self,response):
  28.     item = response.meta['item']
  29.     item['content'] = response.xpath('//*[@id="post-1192"]/dd/p').extract()
  30.     print('内容为:{}'.format(item))
  31.     yield item
复制代码
4.scrapy中item.py 中引入django模子类
  1. pip install scrapy-djangoitem
复制代码
  1. from app1 import models
  2. from scrapy_djangoitem import DjangoItem
  3. class AbckgItem(DjangoItem):
  4.   # define the fields for your item here like:
  5.   # name = scrapy.Field()      # 普通scrapy爬虫写法
  6.   # title = scrapy.Field()
  7.   # url = scrapy.Field()
  8.   # content = scrapy.Field()
  9.   django_model = models.ABCkg   # 注入django项目的固定写法,必须起名为django_model =django中models.ABCkg表
复制代码
5.pipelines.py中调用save()
  1. import json
  2. from pymongo import MongoClient
  3. # 用于接收parse函数发过来的item
  4. class AbckgPipeline(object):
  5.   # i = 0
  6.   def open_spider(self,spider):
  7.     # print('打开文件')
  8.     if spider.name == 'abckg':
  9.       self.f = open('abckg.json',mode='w')
  10.   def process_item(self, item, spider):
  11.     # # print('ABC管道接收:{}'.format(item))
  12.     # if spider.name == 'abckg':
  13.     #   self.f.write(json.dumps(dict(item),ensure_ascii=False))
  14.     # # elif spider.name == 'cctv':
  15.     # #   img = requests.get(item['img'])
  16.     # #   if img != '':
  17.     # #     with open('图片\%d.png'%self.i,mode='wb')as f:
  18.     # #       f.write(img.content)
  19.     # #   self.i += 1
  20.     item.save()
  21.     return item  # 将item传给下一个管道执行
  22.   def close_spider(self,spider):
  23.     # print('关闭文件')
  24.     self.f.close()
复制代码
6.在django中models.py中一个模子类,字段对应爬取到的数据,选择恰当的范例与长度
  1. class ABCkg(models.Model):
  2.   title = models.CharField(max_length=30,verbose_name='标题')
  3.   url = models.CharField(max_length=100,verbose_name='网址')
  4.   content = models.CharField(max_length=200,verbose_name='内容')
  5.   class Meta:
  6.     verbose_name_plural = '爬虫ABCkg'
  7.   def __str__(self):
  8.     return self.title
复制代码
7.通过下令启动爬虫:scrapy crawl 爬虫名称
8.django进入admin配景即可看到爬取到的数据。
到此这篇关于Django联合使用Scrapy爬取数据入库的方法示例的文章就先容到这了,更多相干Django Scrapy爬取数据入库内容请搜索草根技术分享以前的文章或继续欣赏下面的相干文章渴望大家以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作