一.项目要求

  • 从每个大分类中获取里面的小分类
  • 从小分类里面获取图书列表,并进行翻页获取
  • 从图书列表里面获取每本书里面的详细信息

二. 需要用到的库

  • scrapy(整个爬虫的实现)
  • re(需要用正则匹配需要的数据)
  • copy(需要用到deepcopy)

三. 开撸

  • 创建爬虫项目及爬虫
scrapy startproject suning
scrapy genspider book suning.com
  • 找到初始url地址
start_urls = ['https://book.suning.com/']
  • 在items.py里面创建需要的字段
class SuningItem(scrapy.Item):big_tag = scrapy.Field()small_tag = scrapy.Field()small_href = scrapy.Field()book_href = scrapy.Field()book_name = scrapy.Field()book_price = scrapy.Field()
  • 对大分类和小分类进行分组,这里使用的是xpath,并对小分组发起请求
def parse(self, response):# 大分组divs = response.xpath('//div[@class="menu-item"]')for div in divs:item = SuningItem()item['big_tag'] = div.xpath('./dl/dt/h3/a/text()').get()# 小分组dd_as = div.xpath('./dl/dd/a')for a in dd_as:item['small_tag'] = a.xpath('./text()').get()# 小分组的urlitem['small_href'] = a.xpath('./@href').get()yield scrapy.Request(item['small_href'],callback=self.parse_small_href,meta={'item': deepcopy(item)})

通过meta将前面的 item 传递给下一个函数,值得注意的是:此处需要使用deepcopy方法将item进行深度复制后再传过去。为什么呢?由于scrapy框架是基于Twisted 异步网络框架写的,因此会导致item的错误调用,而使用deepcopy则可以避免。

  • 对小分组里面的图书列表进行每本图书详情页链接获取,并发起请求
def parse_small_href(self, response):# 接收之前的itemitem = response.meta['item']# 图书列表book_list = response.xpath('//div[@id="filter-results"]//ul[@class="clearfix"]/li')for book in book_list:item['book_href'] = 'https:' + book.xpath('.//div[@class="wrap"]/div[@class="res-img"]//a/@href').get()yield scrapy.Request(item['book_href'],callback=self.parse_xiangqing,meta={'item': deepcopy(item)})
  • 图书列表页中进行翻页
# 获取该图书列表的总页码
all_pages = int(re.findall(r'param.pageNumbers = "(.*?)";', response.body.decode())[0])
# 获取起始页码
page_cont = int(re.findall(r'param.currentPage = "(.*?)";', response.body.decode())[0])
# 构造url需要用到的参数
url_num = re.findall(r'<a    pagenum="1"  name="ssdln_(.*?)_bottom_page-1"',                                        response.body.decode())[0]
# 对是否有下一页进行判断
if page_cont < all_pages:next_url = 'https://list.suning.com' + '/1-{}-{}-0-0-0-0-0-0-4.html'.format(url_num,                     page_cont + 1)yield scrapy.Request(next_url,callback=self.parse_small_href,meta={'item': deepcopy(item)},dont_filter=False)

对!!就是这个地方最扯淡,xpath根本获取不到的url!!! 花了好长时间。。。。。。。

这里使用xpath获取不到下一页的链接,所以我在网页源码中找到了需要的信息并通过正则找到了它,由于获取到的url并不能直接使用,因此需要进行url的构造后再发起请求。

  • 对图书详情页面中的信息进行提取
def parse_xiangqing(self, response):item = response.meta['item']item['book_name'] = response.xpath('//div[@class="proinfo-title"]/h1/text()').extract()  [-1].strip()item['book_price'] = re.findall(r'"itemPrice":"(.*?)"', response.body.decode())[0]yield item

book_name 获取到后发现里面的数据有很多换行符、空白之类的无用信息,这里使用strip()方法进行过滤 ,

然后就是图书的价格,xpath页获取不到,只能在网页源码中找数据,使用正则进行匹配。

  • settings.py文件的配置
# 随便找一个UA就可以
USER_AGENT = ' '
# 关闭robots协议
ROBOTSTXT_OBEY = False
# 设置下载时间间隔
DOWNLOAD_DELAY = 0.5# ITEM_PIPELINES 开不开无所谓,这次也没用到它

四. 部分成果展示

scrapy 爬取苏宁图书相关推荐

  1. scrapy爬取苏宁所有图书

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

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

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

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

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

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

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

  5. Python进阶之Scrapy抓取苏宁图书数据

    Python进阶之Scrapy抓取苏宁图书数据 1. 需求 2. 代码示例: 创建项目 start.py settings.py iterms.py snb.py pipelines.py 3. 注意 ...

  6. Scrapy爬取当当网图书销售前100

    scrapy爬取当当网图书畅销榜 一.采集任务 爬取当当网图书畅销榜信息,获取热销图书前500相关数据. 二.网页解析 1. 打开当当网,按照图书榜>图书畅销榜 进入当当网图书畅销榜[http: ...

  7. 三级页面爬取苏宁图书

    接上篇文章:https://blog.csdn.net/weixin_43094046/article/details/107930745 还是新创建一个项目suningDemo.其实可以在上次的项目 ...

  8. 使用scrapy爬取苏宁易购图书信息

    理论基础详见:https://blog.csdn.net/apollo_miracle/article/details/84987459 # -*- coding: utf-8 -*- import ...

  9. Scrapy爬一下苏宁图书

    别说了,GKD,滴滴学生卡 不上注释了哦 如果那里我写的不明白就留言哈 # -*- coding: utf-8 -*- import scrapy,re from copy import deepco ...

最新文章

  1. 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
  2. 斐波那契问题的递归和动态规划
  3. 用HttpListener做web服务器,简单解析post方式过来的参数、上传的文件
  4. iOS中的图像处理(一)——基础滤镜
  5. Generic 打印ID对应的object type的工具
  6. 当女朋友问你会不会出轨的时候,该怎么回答?
  7. Node学习笔记:建立TCP服务器和客户端之间的通信
  8. CSS3 之 flex
  9. C++的基础知识有哪些?
  10. 十年,从网管到首席架构师,我的成长感悟
  11. 2018年四大爬虫代理IP提供商对比
  12. intptr java_intptr_t 其实不是指针类型 (转载)
  13. 机器学习(周志华) 第五章神经网络
  14. 桃李的修行小结【转】
  15. 税务知识科普|开具红字发票需要收回原发票吗
  16. javaweb_笔记1(系统架构;servlet分析,注册,生命周期;Servletconfig对象(四个方法)和Servletcontext对象;http协议,get,post)
  17. 电脑调整分区后分区不见恢复数据的方法
  18. Ubuntu查找软件源
  19. (四)Java游戏部署在BlackBerry仿真器上(RIM)
  20. 《地球毁灭日》5希望号诺亚方舟

热门文章

  1. 详解pandas中的groupy机制
  2. TL431做比较器该如何理解?
  3. “笨办法”学Python3,Zed A. Shaw, 习题7
  4. [CC-MCO16306]Fluffy and Alternating Subsequence
  5. 美国商会呼吁对ICO进行澄清
  6. 多频外差法(三频四步相移)
  7. canvas重力小球 html+css+js
  8. CPU负载过高的原因
  9. [渝粤教育] 辽宁建筑职业学院 Web服务器端应用开发 参考 资料
  10. 对于环形组网次优和来回路径不一致的解决方法