接上篇文章:https://blog.csdn.net/weixin_43094046/article/details/107930745
还是新创建一个项目suningDemo。其实可以在上次的项目中进行迭代这里为了以后方便查看就新建了个项目。
首先将上次的项目整个拷贝。
这次爬取的页面:https://book.suning.com/

页面结构:

这里实现三级页面仅对三个文件suingDemoSpider,Middleware,items进行改动就可实现。
困难点:大小分类的对应。
项目结构:

items加入三级页面所需要的注释

import scrapyclass SuningdemoItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()id = scrapy.Field()  # 出版时间bkName = scrapy.Field()  # 图书的名字price = scrapy.Field()  # 图书的价格commentNumber = scrapy.Field()  # 评价的人数bkShop = scrapy.Field()  # 所在的书店bkUrl = scrapy.Field()  # URLauthor = scrapy.Field()  # 作者press = scrapy.Field()  # 出版社publishTime = scrapy.Field()  # 出版时间bkType = scrapy.Field() #图书的类别bkHref = scrapy.Field() #类型的urlbkTypes = scrapy.Field() #图书的小类别

suningDemoSpider

from copy import deepcopyimport scrapyclass SuningdemospiderSpider(scrapy.Spider):name = 'suningDemoSpider'allowed_domains = ['suning.com']start_urls = ['https://book.suning.com/']# start_urls = ['https://list.suning.com/1-502320-0.html']def parse(self, response):book_type = response.xpath('//div[@class="menu-item"]/dl/dt')item = {}for book in book_type:item['bkType'] = book.xpath('./h3/a/text()').extract_first()book_href = book.xpath('./following-sibling::* /a')#识别大小分类,进行循环输出for bk in book_href:item['bkTypes'] = bk.xpath('./text()').extract_first()item['bkHref'] = bk.xpath('./@href').extract_first()yield scrapy.Request(item["bkHref"], callback=self.parse_frist, meta={"item": deepcopy(item)})def parse_frist(self, response):#解析item = response.meta["item"]book_lists = response.xpath('//div[@id="filter-results"]/ul/li')print(len(book_lists))for book in book_lists:item['bkName'] = book.xpath('.//div[@class="res-info"]/p[2]/a/text()').extract_first()price1 = str(book.xpath('.//div[@class = "res-info"]/p[1]/em/text()').extract_first())price2 = str(book.xpath('//*[@id="filter-results"]/ul/li[1]/div/div/div/div[2]/p[1]/em/i[1]/text()').extract_first())item["price"] = price1 + price2item['commentNumber'] = book.xpath('.//div[@class="res-info"]/p[3]/a[1]/text()').extract_first()item['bkShop'] = book.xpath('.//div[@class="res-info"]/p[4]/a[1]/text()').extract_first()item['bkUrl'] = "https:" + book.xpath('.//div[@class="res-info"]/p[2]/a[1]/@href').extract_first()yield scrapy.Request(item["bkUrl"], callback=self.parse_detail, meta={"item": deepcopy(item)})def parse_detail(self, response):item = response.meta["item"]item["author"] = response.xpath('//li[@class="pb-item"][1]/text()').extract_first() if response.xpath('//li[@class="pb-item"][1]/text()').extract_first() is not None else "未知"item["press"] = response.xpath('//li[@class="pb-item"][2]/text()').extract_first() if response.xpath('//li[@class="pb-item"][2]/text()').extract_first() is not None else "未知"item["publishTime"] = response.xpath('//li[@class="pb-item"][3]/span[2]/text()').extract_first() if response.xpath('//li[@class="pb-item"][3]/span[2]/text()').extract_first() is not None else "未知"yield itemprint(item)

错误写法:

def parse(self, response):book_type = response.xpath('//div[@class="menu-item"]/dl/dt')book_href = resonse.xpath('//div[@class="menu-item"]/dl/dd')item = {}for book in book_type:item['bkType'] = book.xpath('./h3/a/text()').extract_first() for bk in book_href:item['bkTypes'] = bk.xpath('./a/text()').extract_first()item['bkHref'] = bk.xpath('./a/@href').extract_first()yield scrapy.Request(item["bkHref"], callback=self.parse_frist, meta={"item": deepcopy(item)})

这样也能爬取数据但是循环的是整个的小标题,不管这个大标题下有没有都循环输出,导致大小分类出现错误,也就是数据不对应。开始我就天真的下来了,后面查看数据的时候发现少儿下居然有4级书就觉得这个数据不对应。所以就用了我上面的写法通过大类来循环小类。下面是我做大小分类测试时候,控制台输出很明显能看出来区别。期刊杂志和进口原版书的页面布局与其他的不一样这里就暂不做爬取。
正确截图:

错误截图:

Middleware这里我只是稍微改动了下,爬取的是单页面的数据,分类下来也很多了。

class SeleniumDownloaderMiddleware:"""构造方法"""def __init__(self):self.browser = webdriver.Chrome(r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')  # 每个spider初始化一次driver"""动态网页处理中间件"""def process_request(self, request, spider):#普通selenium的使用if spider.name == 'suningDemoSpider' and not (request.url.startswith("https://product")):# 根据特定Spider 决定是否利用selenium模拟浏览器爬取self.browser.get(request.url)  # selenium请求了网页 获得的Response 因此process_request不需要再返回Request给Downloadertime.sleep(10)  # 延时10s 待网页完全加载后打印html文本print("访问:", request.url)print("current_url", self.browser.current_url)# urlchangecnt = 0# while (urlchangecnt < 3) :self.browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')time.sleep(10)body = self.browser.page_source#     self.browser.find_element_by_id('nextPage').send_keys(Keys.ENTER)#     urlchangecnt = urlchangecnt + 1print("二级访问:", request.url)return HtmlResponse(self.browser.current_url, body=body,encoding="utf-8", request=request)  # 这里必须返回Response的类或派生类#只有这样Scrapy才不会返回Request给Downloader

----------------------------------------8.20更新-------------------------------------------------
早就更改了项目,一直没时间来更新。
上面的项目存在几个问题,爬取的速度慢,数据获取不完全和报错,这次针对这三个问题做了更改。其实之前这个项目也在报错但我没注意这也是其中导致数据量获取不完全的原因。
主要是在settings上做文章

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16'# Obey robots.txt rules
ROBOTSTXT_OBEY = False
LOG_LEVEL = 'WARNING'
LOG_FILE = 'log.txt'
CONCURRENT_REQUESTS = 1000
COOKIES_ENABLED = False
RETRY_ENABLED = False
CONCURRENT_REQUESTS_PER_DOMAIN = 10000
CONCURRENT_REQUESTS_PER_IP = 0
# DOWNLOAD_TIMEOUT = 20


首先说报错,由于我是在上次的项目上进行迭代的。则保留了timeout =3,就有些链接会超时,这样就得不全数据,我就调高了等待时间,也不行,后来查阅了一下更改了请求头将原来的http更改成https这样才好。剩下的仅仅是写微调这里就不做太多展示了。还写了一个爬取更多页面,分类更加的细致。这两者大同小异只是这个数据量更大,以至于跑一遍不想再跑第二遍。爬取页面部分截图见下图。等过段时间把项目都放在GitHub上吧。

三级页面爬取苏宁图书相关推荐

  1. 爬虫Scrapy框架学习(三)-爬取苏宁图书信息案例

    爬取苏宁图书案例 1.项目文件架构 2.爬取数据网页页面 3.suning.py文件 # -*- coding: utf-8 -*- import scrapy from copy import de ...

  2. 小福利,带你使用scrapy框架爬取苏宁图书海量信息

    大家好,我是天空之城,今天给大家带来小福利,带你使用scrapy框架爬取苏宁图书海量信息 下图为项目的目录结构 看下最后的数据截图,可以存为excel文件,也可以存入mysql数据库,参见前面文章介绍 ...

  3. Python集成scrapy和selenium爬取苏宁图书

    Python集成scrapy和selenium爬取苏宁图书 环境:python3.6 pycharm2018.1.3 前言 本人渣渣一枚,为爬虫苏宁图书获取数据,将获得的数据保存在MangoDB中,现 ...

  4. scrapy 爬取苏宁图书

    一.项目要求 从每个大分类中获取里面的小分类 从小分类里面获取图书列表,并进行翻页获取 从图书列表里面获取每本书里面的详细信息 二. 需要用到的库 scrapy(整个爬虫的实现) re(需要用正则匹配 ...

  5. scrapy爬取苏宁所有图书

    苏宁图书 https://book.suning.com/ 目标: 爬取苏宁图书下所有书本的系信息 爬取每个大分类(文学艺术)下的中间分类(小说)下的每个小分类(中国当代小说)的书本信息,并且进行翻页 ...

  6. scrapy+redis+mongodb爬取苏宁商城图书价格

    之前的爬取苏宁图书信息的时候因为懒得分析图书的价格,所有今天把图书的价格给弄了 图书的价格是动态生成的,不过稍稍花点时间就分析出来了,本来长长的·一大串,慢慢删减慢慢试就剩一个,看下图 然后我在网页源 ...

  7. 爬虫:Scrapy分类爬取苏宁易购书城

     目录 1.scrapy框架概述 2.Scrapy爬取苏宁图书案例 3.设置配置文件 ​ 4.如何获取USER_AGENT ​ 5.编写items.py文件 6.编写爬虫suning.py程序 1.s ...

  8. Python爬虫20-Scrapy爬取苏宁易购图书

    Scrapy爬取苏宁易购图书 1.创建一个scrapy项目 scrapy startproject book 2.生成一个爬虫文件 scrapy genspider su book.suning.co ...

  9. Python爬虫入门 | 4 爬取豆瓣TOP250图书信息

      先来看看页面长啥样的:https://book.douban.com/top250   我们将要爬取哪些信息:书名.链接.评分.一句话评价--   1. 爬取单个信息 我们先来尝试爬取书名,利用之 ...

最新文章

  1. Django-缓存的配置
  2. Script that build Dual Stack route
  3. 元对象我所理解的设计模式(C++实现)——享元模式(Flyweight Pattern)
  4. python模仿百度云桌面_利用百度云接口实现车牌识别!人称Python调包侠!
  5. Pytorch(2)-tensor常用操作
  6. 非标准语法;请使用 _一文读懂使用MCU SPI访问具有非标准SPI接口ADC的方法
  7. java编写一个人的类,statement到底是个什么东西?接口、类,谁能说明白它的原理,100分只给一个人...
  8. 【JAVASCRIPT】javascript获取屏幕,浏览器,网页高度宽度
  9. python中的深浅拷贝的区别
  10. 转:tomcat7源码导入Eclipse
  11. LayaAir 2.0 开发 2048 小游戏
  12. Qt实现带验证码的输入框
  13. python冒泡排序_python实现基本算法之冒泡排序(Bubble Sort)
  14. 英文科技论文写作与学术报告Lecture1习题答案
  15. 脑科学家:神经科学与大数据的结合带来的新领域
  16. Win10桌面壁纸、锁屏壁纸保存位置
  17. php 验证手机号邮箱,PHP正则验证真实姓名、手机号码、邮箱
  18. web项目获取webpp文件下的图片
  19. mac使用Simulator打开IOS模拟器(不使用Xcode打开IOS模拟器)
  20. week07 13.3 NewsPipeline之 三News Deduper之 tf_idf 查重

热门文章

  1. 这份Redis6.0集群搭建教程,项目肯定用得上
  2. 鼎盛合方案——轮胎充气泵方案
  3. 台湾作家林清玄去世 多篇作品入选大陆语文教材
  4. 回收站删除的文件怎么恢复?4招快速搞定!
  5. 想实时了解键盘功能键(Caps Lock/Num Lock/Scroll Lock)状态?用它就行了——Wireless Keyboard Indicator
  6. blktrace 梁斌说
  7. 程序员提升之道-人际交往篇
  8. 波兰表达式与逆波兰表达式
  9. 【java笔记】常用接口:Cloneable接口
  10. 金属氧化物半导体场效应晶体管的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告