1. # -*- coding: utf-8 -*-
    import scrapy
    from copy import deepcopy
  2.  
  3. class SnbookSpider(scrapy.Spider):
    name = 'snbook'
    allowed_domains = ['suning.com']
    start_urls = ['https://book.suning.com/']
  4.  
  5. def parse(self, response):
    div_list=response.xpath('//div[@class="menu-list"]/div[@class="menu-item"]')
    div_sub_list=response.xpath('//div[@class="menu-list"]/div[@class="menu-sub"]')
    for i in div_list:
    item={}
    # 大分类的名字
    item['b_name']=i.xpath(".//h3/a/text()").extract_first()
    # 当前大分类下的中间分类
    # a_list=i.xpath('.//dd/a').extract()
    #
    # for i in a_list:
    # # 中分类的名字
    # item['m_name'] =i.xpath('.//a/text()').extract_first()
  6.  
  7. for i in div_sub_list:
    # 中分类的名字
    item['m_name']=i.xpath('.//p[@class="submenu-item"]/a/text()').extract_first()
  8.  
  9. li_list=i.xpath('.//ul[@class="book-name-list clearfix"]/li')
    for i in li_list:
    # 小分类的名字
    item['s_name']=i.xpath('./a/text()').extract_first()
  10.  
  11. # 小分类的URL地址
    item["s_href"] = i.xpath("./a/@href").extract_first()
  12.  
  13. # 请求图书的列表页
    yield scrapy.Request(
    item["s_href"],
    callback=self.parse_book_list,
    meta={"item": deepcopy(item)}
    )
  14.  
  15. def parse_book_list(self,response):
    item = response.meta["item"]
    li_list=response.xpath('//ul[@class="clearfix"]/li')
    for i in li_list:
    # #书名
    item['book_name']=i.xpath('.//p[2]/a/text()').extract_first().strip()
    # 书的url地址,不完整
    item['book_href']=i.xpath('.//p[2]/a/@href').extract_first()
    detail_url='https:'+item['book_href']
  16.  
  17. # 书店名
    item['book_store_name']=i.xpath('.//p[4]/a/text()').extract_first()
  18.  
  19. # 请求图书详情页
    yield scrapy.Request(
    detail_url,
    callback=self.detail_book_list,
    meta={"item": deepcopy(item)}
    )
    page_list=response.xpath('//div[@id="bottom_pager"]/a')
  20.  
  21. for i in page_list:
    page=i.xpath('./@href').extract_first()
    page_url='https://list.suning.com'+page
    yield scrapy.Request(
    url=page_url,
    callback=self.parse_book_list,
    meta={'item':item}
    )
  22.  
  23. def detail_book_list(self,response):
    item = response.meta["item"]
    import re
    item['book_price']=re.findall('"itemPrice":"(.*?)",',response.body.decode())[0]
  24.  
  25. print(item)

sn图书spider的更多相关文章

  1. Spring 声明式事务管理(11)

    案例分析 本案例是图书管理系统精简部分,在数据库中有3张表.分别保存图书库存.图书信息和用户信息.下面是建表SQL语句 1 DROP TABLE IF EXISTS store; 2 DROP TAB ...

  2. 基于visual Studio2013解决C语言竞赛题之0802图书信息查询

     题目 解决代码及点评 /* 功能:有一批图书,每本书有:书名(name),作者(author) , 编号(num),出版日期(date)四个数据, 希望输入后按书名的字母顺序将各书的记录排列好, ...

  3. 一个scrapy框架的爬虫(爬取京东图书)

    我们的这个爬虫设计来爬取京东图书(jd.com). scrapy框架相信大家比较了解了.里面有很多复杂的机制,超出本文的范围. 1.爬虫spider tips: 1.xpath的语法比较坑,但是你可以 ...

  4. Scrapy爬虫(5)爬取当当网图书畅销榜

      本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下:   我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲 ...

  5. scrapy爬虫--苏宁图书

    实现业务逻辑如下: 1. 创建scrapy项目,并生成 爬虫2. 在suning.py中实现Schedul 和 Spider业务逻辑3. 修改start_urls为正确的初始请求地址4. 构造pars ...

  6. python爬虫1——获取网站源代码(豆瓣图书top250信息)

    # -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...

  7. 第十七节:Scrapy爬虫框架之item.py文件以及spider中使用item

    Scrapy原理图: item位于原理图的最左边 item.py文件是报存爬取数据的容器,他使用的方法和字典很相似,但是相比字典item多了额外的保护机制,可以避免拼写错误或者定义错误. 1.创建it ...

  8. 第十六节:Scrapy爬虫框架之项目创建spider文件数据爬取

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取所设计的, 也可以应用在获取API所返回的数据或 ...

  9. 使用Scrapy爬取图书网站信息

    重难点:使用scrapy获取的数值是unicode类型,保存到json文件时需要特别注意处理一下,具体请参考链接:https://www.cnblogs.com/sanduzxcvbnm/p/1030 ...

随机推荐

  1. stream之累加求和

    1.集合中直接包含BigDecimal元素的累加 List<Integer> list = new ArrayList<>();list.add(3);list.add(7); ...

  2. [原创]iFPGA-Cable FT2232H Xilinx / Altera / Lattice 三合一JTAG & UART调试器-详细使用说明

    iFPGA-Cable调试器使用说明 全文分为6部分: 第0部分:实物.连线及其驱动安装说明 第1部分:Xilinx JTAG 第2部分:UART 第3部分:Altera JTAG 第4部分:Latt ...

  3. PHP搜索优化 sphinx 实战

    环境:win7 64 wamp 解压sphinx安装包后,简历如下结构.注意,conf目录是我的配置文件目录 在conf目录下,简历newdefend.conf文件,配置内容如下 # 配置数据源 so ...

  4. 使用线程 Monitor.Wait() 和 Monitor.Pulse()

      Wait() 和 Pulse() 机制用于线程间交互.当在一个对象上使用Wait() 方法时,访问这个对象的线程就会一直等待直到被唤醒.Pulse() 和 PulseAll() 方法用来通知等待的 ...

  5. 【solr】Solr5.5.4单机部署

    Solr5.5.4单机部署 Solr5和Solr4有很大区别,最为明显的就是Solr5已经可以独立部署,从Solr5开始,Solr已经不再以war包形式部署,Solr已经成为了一个独立的java服务端 ...

  6. Prime Ring Problem HDU - 1016 (dfs)

    Prime Ring Problem HDU - 1016 A ring is compose of n circles as shown in diagram. Put natural number ...

  7. Asio与Boost.Asio

    译自http://think-async.com/Asio/AsioAndBoostAsio Asio有两种变体:(非Boost)Asio和Boost.Asio.本文概要描述二者的不同. 1. 源代码 ...

  8. quartz 通用的多线程定时任务

    TaskManager package mytest.task; import java.text.ParseException; import org.quartz.CronTrigger; imp ...

  9. js判断类型为数字的方法实现总汇——原生js判断isNumber()

    方法一[推荐]: 最容易想到的是用typeof来判断是否是number类型 ,但是如果为NaN会被认为也是number类型,因此我们需要使用isNaN来排除NaN的情况. function isNum ...

  10. 最短路 HDU - 2544 (dijkstra算法或Floyd算法)

    Dijkstra解法: #include <stdio.h> #include <iostream> #include <cstring> #include < ...