利用scrapy爬虫时我们经常会遇到列表页可以爬取一些信息,详情页又可以爬到一些信息。同时详情页的url需要在列表页请求之后才可以获得。因此就需要垂直爬取,也就是先请求获得详情页的html,解析出详情页后再去请求以获得详情页的内容。同时,如果此时需要保存一些数据,如:列表页保存几个数据,详情页也需要保存几个数据,此时就需要设置多个item来获得。因此,本文记录了遇到垂直爬取与多个item保存并且下载某个item中内容的方法。

1 垂直爬取

垂直爬取其实比较简单,主要是就是利用yield  Request()以及创建parse函数,Request去请求url将返回内容回调给parse_()函数,parse_()函数解析产生新的url及其他内容,若想进一步请求新的url,则继续去yield Request ,从而垂直爬取下去。

import scrapy
from scrapy import Request
from xiezhen.items import XiezhenItem
import time
import random
import re
from scrapy.http import request
import math
from xiezhen.items import ModelItemclass XzSpider(scrapy.Spider):name = 'xz'allowed_domains = ['tujigu.com']def start_requests(self):for i in range(1, 2):if i == 1:url = 'https://www.tujigu.com/riben/'else:url = 'https://www.tujigu.com/riben/' + str(i) + '.html'time.sleep(random.randint(1, 3))yield Request(url=url, callback=self.parse_list)def parse_list(self, response):html = response.css('.hezi ul li')for url in html:item2 = XiezhenItem()item2['list_url'] = url.css('a::attr(href)').extract_first()item2['title'] = url.css('p.biaoti a::text ').extract_first()item2['jigou'] = url.css('p a::text').extract()[0]item2['model'] = url.css('p a::text').extract()[1]item2['biaoqian'] = url.css('p a::text').extract()[2:-1]item2['pic_num'] = url.css('span.shuliang::text ').extract()[0][:-1]time.sleep(random.random())yield item2pic_num = url.css('span.shuliang::text ').extract()[0][:-1]if int(pic_num) >= 100:page = math.ceil(int(pic_num) / 6)else:page = math.ceil(int(pic_num) / 5)for i in range(1, page + 1):if i == 1:url = item2['list_url']else:url = item2['list_url'] + str(i) + '.html'yield Request(url=url, callback=self.parse_item)def parse_item(self, response):item = ModelItem()item['pic_urls'] = response.css('.content img::attr(src)').extract()item['model'] = response.css('.tuji p a::text').extract()[-2]item['model_info'] = response.css('.tuji p::text').extract()[-1].replace('\n', '').replace("''", '')yield item

2 对于处理多个item ,首先在item中创建多个Item类,其继承于scrapy的Item。通过将两个item类分别倒入spider中,分别实例化,便可以将数据存入想要存入的item中。最后将其yield。

import scrapy
from scrapy import Itemclass ModelItem(Item):model = scrapy.Field()model_info = scrapy.Field()pic_urls = scrapy.Field()class XiezhenItem(Item):# define the fields for your item here like:# name = scrapy.Field()jigou = scrapy.Field()model = scrapy.Field()biaoqian = scrapy.Field()title = scrapy.Field()list_url = scrapy.Field()pic_num = scrapy.Field()

前边这部分并不会出现什么问题。主要问题出现在通过pipeline下载图片或文件过程中。此时需要指定Pipeline操作的是哪个item对象。代码如下:通过if  isinstance(item,(想要操作的item类名)),从而选定了当下Pipeline此时操作的item。从而使得Pipeline 去下载响应item中的内容。当前在下载之前我们需要在setting中指定下载的位置,设定ITEM_PIPELINES等就可以开始下载了。其setting设置见最下。

from scrapy import Request
from xiezhen.items import ModelItem
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
# class XiezhenPipeline:
#     def process_item(self, item, spider):
#         return itemclass ImagePipeline(ImagesPipeline):# def process_item(self, item, spider):#     return itemdef get_media_requests(self, item, info):if isinstance(item, ModelItem):urls = item['pic_urls']for i in urls:yield Request(url=i)def file_path(self, request, response=None, info=None):url = request.urlfile_name = url.split('/')[-2] + url.split('/')[-1]return file_namedef item_completed(self, results, item, info):image_paths = [x['path'] for ok, x in results if ok]if not image_paths:raise DropItem('Image Download Filed')return item
IMAGES_STORE = './images'
ITEM_PIPELINES = {'xiezhen.pipelines.ImagePipeline': 1,
}

scrapy垂直爬取及多个item下载问题(爬取某个写真网)相关推荐

  1. python 24位图转 8位_Python爬取PPT模板小工具下载-Python爬取PPT模板小工具免费版下载v1.0...

    由于很多PPT抓取工具都会因为版本问题无法使用,所以论坛大神就自己写了这款Python爬取PPT模板小工具,可以帮助用户轻松获取各种PPT模板,使用的时候注意一次只能下载一种类型.软件仅供交流学习,下 ...

  2. Scrapy 爬虫框架初体验二 —— 以一个新闻站点爬取为例

    一.搭建基础 Scrapy 工程框架 创建项目 输入如下命令: scrapy startproject NewsSpider # 创建项目 cd NewsSpider scrapy genspider ...

  3. scrapy中集成selenium+浏览器池实现selenium的并发爬取LCSC网站中非结构化表格数据+异步存储进mysql+完整代码

    爬取https://lcsc.com/products/Connectors_365.html这个网址下所有的表格数据. 蓝色的都是要爬取的子页面,要爬取子页面里面的表格数据 ,表格数据如下: 右上角 ...

  4. 基于scrapy框架的关于58同城招聘网站信息的爬取

    起因: 学校项目实训,要求我们爬取招聘网站信息并对其进行分析,在此我和大家分享一下关于我爬取58同城招聘网站信息的过程和结果~ 前期准备步骤: 1.搭建环境:首先把scrapy需要的环境搭建好,再次我 ...

  5. Scrapy爬虫实战| 手把手教你使用CrawlSpider框架爬取数码宝贝全图鉴

    大家好,之前给大家分享过Scrapy框架各组件的详细配置,今天就来更新一篇实战干货:CrawlSpider框架爬取数码宝贝全图鉴.可能本文爬的这个网站你不感兴趣,但我希望你能通过下面的爬取分析.操作中 ...

  6. 《Learning Scrapy》(中文版)第11章 Scrapyd分布式抓取和实时分析

    序言 第1章 Scrapy介绍 第2章 理解HTML和XPath 第3章 爬虫基础 第4章 从Scrapy到移动应用 第5章 快速构建爬虫 第6章 Scrapinghub部署 第7章 配置和管理 第8 ...

  7. 使用Scrapy,帮你快速抓取网页数据(代码可下载)!

    Scrapy 是一套基于基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网站数据.提取结构性数据以及各种图片,非常方便.Sc ...

  8. python爬取链家新房_Python爬虫项目--爬取链家热门城市新房

    本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确 ...

  9. Scrapy从入门到精通(3)--使用Item封装数据

    使用Item封装数据 前两篇博客介绍了从页面中提取数据的方法,现在用item封装爬取到的数据 Item和Field Scrapy提供了Item和Field类,可以用他们自定义数据类,封装爬取到的数据 ...

最新文章

  1. node项目架构与优化
  2. 在正确的方向坚持下去,一直坚持下去,直到有成果
  3. SQLI DUMB SERIES-16
  4. C++ 常用拷贝和替换算法
  5. winform第三方控件wmp
  6. svg载入html,SVG系列教程:SVG简介与嵌入HTML页面的方式
  7. 7-13 简单计算器 (25 分)
  8. iOS 开发常用链接总结
  9. 剧情介绍:“造雨人”
  10. matlab符号函数sgn,latex 符号函数sgn
  11. 魔方矩阵 C++实现
  12. 用Java生成word文档
  13. dota2 服务器尚未更新到最新版本,dota2更新不动_steam dota2更新不动
  14. 字幕基础:字幕介绍、字幕种类及常见格式
  15. Unity Spine 换装方案
  16. unity学习手记之角色动画
  17. vpp之浅谈插件和使用
  18. 大数据早报:谷歌Cloud Natural Languages API推新技术 全球三分之二的人口通过移动设备上网(9.21)
  19. 3650M5 IMM 配置升级
  20. Caffeine实战教程篇

热门文章

  1. Unity动作游戏集合
  2. 计算机erp基础入门,ERP基础知识73条 - ERP新手入门-基础知识理论
  3. 百度网盘空间大缩水,最终会走向趣头条模式吗?
  4. 批量修改文件扩展名,并在扩展名的前面或后面插入特定的文字
  5. 大学期间加入导师工作室有用吗?
  6. python爬虫论文总结与展望_python爬虫回顾与总结
  7. 用Android Studio设计的一个简单的闹钟APP
  8. 山石防火墙怎么映射服务器,hillstone防火墙如何设置
  9. 交换机端口假死(err-disable)解决方法
  10. 计算机软件系统一般分为什么两大部分,1、计算机软件系统一般分为( A )两大部分...