scrapy 爬取苏宁图书
一.项目要求
- 从每个大分类中获取里面的小分类
- 从小分类里面获取图书列表,并进行翻页获取
- 从图书列表里面获取每本书里面的详细信息
二. 需要用到的库
- 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 爬取苏宁图书相关推荐
- scrapy爬取苏宁所有图书
苏宁图书 https://book.suning.com/ 目标: 爬取苏宁图书下所有书本的系信息 爬取每个大分类(文学艺术)下的中间分类(小说)下的每个小分类(中国当代小说)的书本信息,并且进行翻页 ...
- 小福利,带你使用scrapy框架爬取苏宁图书海量信息
大家好,我是天空之城,今天给大家带来小福利,带你使用scrapy框架爬取苏宁图书海量信息 下图为项目的目录结构 看下最后的数据截图,可以存为excel文件,也可以存入mysql数据库,参见前面文章介绍 ...
- 爬虫Scrapy框架学习(三)-爬取苏宁图书信息案例
爬取苏宁图书案例 1.项目文件架构 2.爬取数据网页页面 3.suning.py文件 # -*- coding: utf-8 -*- import scrapy from copy import de ...
- Python集成scrapy和selenium爬取苏宁图书
Python集成scrapy和selenium爬取苏宁图书 环境:python3.6 pycharm2018.1.3 前言 本人渣渣一枚,为爬虫苏宁图书获取数据,将获得的数据保存在MangoDB中,现 ...
- Python进阶之Scrapy抓取苏宁图书数据
Python进阶之Scrapy抓取苏宁图书数据 1. 需求 2. 代码示例: 创建项目 start.py settings.py iterms.py snb.py pipelines.py 3. 注意 ...
- Scrapy爬取当当网图书销售前100
scrapy爬取当当网图书畅销榜 一.采集任务 爬取当当网图书畅销榜信息,获取热销图书前500相关数据. 二.网页解析 1. 打开当当网,按照图书榜>图书畅销榜 进入当当网图书畅销榜[http: ...
- 三级页面爬取苏宁图书
接上篇文章:https://blog.csdn.net/weixin_43094046/article/details/107930745 还是新创建一个项目suningDemo.其实可以在上次的项目 ...
- 使用scrapy爬取苏宁易购图书信息
理论基础详见:https://blog.csdn.net/apollo_miracle/article/details/84987459 # -*- coding: utf-8 -*- import ...
- Scrapy爬一下苏宁图书
别说了,GKD,滴滴学生卡 不上注释了哦 如果那里我写的不明白就留言哈 # -*- coding: utf-8 -*- import scrapy,re from copy import deepco ...
最新文章
- 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
- 斐波那契问题的递归和动态规划
- 用HttpListener做web服务器,简单解析post方式过来的参数、上传的文件
- iOS中的图像处理(一)——基础滤镜
- Generic 打印ID对应的object type的工具
- 当女朋友问你会不会出轨的时候,该怎么回答?
- Node学习笔记:建立TCP服务器和客户端之间的通信
- CSS3 之 flex
- C++的基础知识有哪些?
- 十年,从网管到首席架构师,我的成长感悟
- 2018年四大爬虫代理IP提供商对比
- intptr java_intptr_t 其实不是指针类型 (转载)
- 机器学习(周志华) 第五章神经网络
- 桃李的修行小结【转】
- 税务知识科普|开具红字发票需要收回原发票吗
- javaweb_笔记1(系统架构;servlet分析,注册,生命周期;Servletconfig对象(四个方法)和Servletcontext对象;http协议,get,post)
- 电脑调整分区后分区不见恢复数据的方法
- Ubuntu查找软件源
- (四)Java游戏部署在BlackBerry仿真器上(RIM)
- 《地球毁灭日》5希望号诺亚方舟