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

  • 1. 需求
  • 2. 代码示例:
    • 创建项目
    • start.py
    • settings.py
    • iterms.py
    • snb.py
    • pipelines.py
  • 3. 注意事项

1. 需求

  • 1.抓取苏宁图书数据
  • 2.把数据存在txt文件中

2. 代码示例:

创建项目

scrapy startproject snbook
cd snbook
scrapy genspider snb suning.com

start.py

from scrapy import cmdline# cmdline.execute(['scrapy','snb','wxapp'])
cmdline.execute('scrapy crawl snb'.split())

settings.py

BOT_NAME = 'snbook'SPIDER_MODULES = ['snbook.spiders']
NEWSPIDER_MODULE = 'snbook.spiders'
LOG_LEVEL = 'WARNING'
# ROBOTSTXT_OBEY = True
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
ITEM_PIPELINES = {'snbook.pipelines.SnbookPipeline': 300,
}

iterms.py

import scrapyclass SnbookItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()cate = scrapy.Field()cate_little = scrapy.Field()url_little = scrapy.Field()ci = scrapy.Field()b_name = scrapy.Field()b_url = scrapy.Field()b_src = scrapy.Field()img_name = scrapy.Field()writer = scrapy.Field()publisher = scrapy.Field()p_data = scrapy.Field()

snb.py

import scrapy
from copy import deepcopy
from snbook.items import SnbookItem
# 目标:抓取苏宁图书class SnbSpider(scrapy.Spider):name = 'snb'# url-little访问的是search.suning.com# 如果allowed_domains写book.suning.com则找不到allowed_domains = ['suning.com'] # 定义了数据来源的域名,如果范围过细,可能导致本文这种对不上的情况start_urls = ['http://book.suning.com/']def parse(self, response):# 先获取主页大分类dl_list = response.xpath('//div[@class="menu-list"]/div/dl')# print(dl_list)item = SnbookItem()for dl in dl_list:# 获取大分类item['cate'] = dl.xpath('./dt/h3/a/text()').extract_first()# 获取小分类little_cates = dl.xpath('./dd/a')for a in little_cates:# 获取小分类名称item['cate_little'] = a.xpath('./text()').extract_first()# 获取小分类的地址item['url_little'] = a.xpath('./@href').extract_first()# 获取ci的数字分类# item['ci'] = item['url_little'][26:32]# print(item)# 可以在哎此处做翻页逻辑yield scrapy.Request(url=item['url_little'],callback=self.parse_book_list,meta={'item':deepcopy(item)},)# 定义处理小分类数据的方法def parse_book_list(self,response):item = response.meta.get('item')# 获取li标签lis = response.xpath('//ul[@class="clearfix"]/li')# 获取每一本书的信息for li in lis:# 获取书的名称item['b_name'] = li.xpath('//div[@class="res-img"]/div/a/img/@alt').extract_first()# 获取书的urlitem['b_url'] = 'https:' + li.xpath('//div[@class="res-img"]/div/a/@href').extract_first()# 获取书封页图片# 发现无法获取数据,把src地址在网页源码中找,发现源码中位src2# xpath是在源码中寻找的,所以应该/@src2item['b_src'] = 'https:' + li.xpath('//div[@class="res-img"]/div/a/img/@src2').extract_first().split('.jpg')[0]+'.jpg'item['img_name'] = item['b_src'].split('/')[-1]# 向详情页处理程序传递数据yield scrapy.Request(url=item['b_url'],callback=self.parse_detail_page,meta={'item':deepcopy(item)})def parse_detail_page(self,response):item = response.meta.get('item')spans = response.xpath('//li[@class="pb-item"]/span')# 处理格式问题item['writer'] = response.xpath('//li[@class="pb-item"][1]/text()').extract_first().replace('\n','').replace('\t','').replace(' ','')item['publisher'] = response.xpath('//li[@class="pb-item"][2]/text()').extract_first().replace('\n','').replace('\t','').replace(' ','')item['p_data'] = response.xpath('//li[@class="pb-item"][3]/span[2]/text()').extract_first()# 发现输出结果不全,考虑深浅copy# print(item)yield item

pipelines.py

from itemadapter import ItemAdapter
import jsonclass SnbookPipeline:def process_item(self, item, spider):with open('./sn.txt','a',encoding='utf-8',newline='\n') as f:f.write(json.dumps({k:v for k,v in item.items()},ensure_ascii=False) + '\n')# print(item)return item

3. 注意事项

  • 1.allowed_domains设置一定要覆盖项目的数据源

  • 2.xpath中也可以使用[]索引进行定位

  • 3.传递item数据时,如果存在多次传递的情况,最好使用deepcopy()避免数据丢失

  • 4.可以灵活运用切片[:]和split()获取想要的数据

  • 5.replace()可以连续使用实现替换字符串

  • 6.在element中确认xpath语句正确的情况下,如果获取数据为空,则查看源代码查看是否有反爬,比如本项目中的src对应的网页源码中位src2

  • 7.可以灵活的运用re来获取没有在标签中或者无法准确定位的内容

  • 8.本例中pipeline数据存储时,如果直接json.dumps()存,会报错:

    TypeError: Object of type ‘SnbookItem’ is not JSON serializable

    • 原因大概是因为JSON在解析某些日期数据和image Field()数据时会出现序列化错误
    • 所以本项目中曲线救国通过字典推导式存储数据,相当于把原来的数据按照字典格式重新生成了一遍
  • PS:>如果各位朋友知道导致本案例中JSON序列化错误的具体原因,希望大家可以留言告知,谢谢.

Python进阶之Scrapy抓取苏宁图书数据相关推荐

  1. python怎么爬虎牙_使用python爬虫框架scrapy抓取虎牙主播数据

    前言 本文利用python的scrapy框架对虎牙web端的主播.主播订阅数.主播当前观看人数等基本数据进行抓取,并将抓取到的数据以csv格数输出,以及存储到mongodb中 思路 观察虎牙网站后确认 ...

  2. scrapy抓取苏宁所有图书并保存到数据库

    scrapy抓取苏宁所有图书 采用mongodb存储爬取图书数据,爬取苏宁全网图书信息(图书名,图书所属详细分类商店,价格) 注意 需要根据苏宁图书网页分类建立相应分类 图书详情页每页有60条图书数据 ...

  3. selenium抓取苏宁图书

    selenium绕过js,实现滚动条自动向下滑动,抓取苏宁图书 目标url:烹饪/美食[报价 品牌 口碑评价 测评 正品行货 限时低价 分期] -苏宁易购 from selenium import w ...

  4. 爬虫进阶:Scrapy 抓取 boss 直聘、拉勾心得经验

    关于使用Scrapy的体会,最明显的感受就是这种模板化.工程化的脚手架体系,可以说是拿来即可开箱便用,大多仅需按一定的规则套路配置,剩下的就是专注于编写跟爬虫业务有关的代码.绝大多数的反反爬虫策略,大 ...

  5. 用nodejs配合python破解X-Ca-Signature,抓取博客积分数据

    世界上最稀缺的资源是时间. 在某一瞬间我惊恐得发现,一生三万天,已过三分之一,念及年少不更事,蹉跎而过,觉得心中有愧.至今无建树,脑袋里想起一句话,"不因虚度年华而悔恨,也不因碌碌无为而羞耻 ...

  6. python地产成本_Python3抓取 深圳房地产均价数据,通过真实数据为购置不动产做决策分析(二)...

    接下来处理下之前收集到的房地产数据数据: 先分享一个学习数据预处理,数据挖掘,机器学习的实用网站:http://scikit-learn.org/stable/,有很多对应的教程. 本文中提到的数据清 ...

  7. scrapy 爬取苏宁图书

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

  8. Python进阶之Scrapy利用ImagesPipeline抓取汽车之家宝马5系缩略图

    Python进阶之Scrapy利用ImagesPipeline抓取汽车之家宝马5系缩略图 1. 创建项目 2. 使用ImagesPipeline爬取数据 items.py setings.py aut ...

  9. python爬虫天气实例scrapy_python爬虫之利用scrapy框架抓取新浪天气数据

    scrapy中文官方文档:点击打开链接 Scrapy是Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘 ...

最新文章

  1. python【Matlibplot绘图库】-认识Matploblib
  2. 多功能雨伞项目计划书_雨伞项目投资计划书
  3. Python入门-day1变量和简单数据类型
  4. Windows Server 2012系列之一安装初体验
  5. Codeforces - 102222C - Caesar Cipher
  6. 原生JS数组去重的几种方法
  7. 用Flask开发Web版日历应用
  8. 拼多多12.12“全民真香节”启动 “真香”农货成为核心与亮点
  9. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )
  10. freemarker mysql 生成bean_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.6.6版)...
  11. python 线程 的类库_python类库32[多线程同步Lock+RLock+Semaphore+Event]
  12. bootstraptable 数字不换行_不知道这些数据录入技巧,你就凹凸了!|Excel093
  13. 倍增法求LCA(最近公共最先)
  14. java实例化是什么意思_什么是java实例化
  15. 安卓APK反编译详解(多图)
  16. Squid安装及运行控制_wuli大世界_新浪博客
  17. java实现基金浮动_Java: 实现自回归分析/线性回归分析/基金各项指标计算等
  18. 医疗时鲜资讯:如何玩转医学影像中心?
  19. 今日芯声 | 微软 Xbox 老大:关闭游戏直播平台 Mixer,我没有遗憾
  20. 怎样把视频中的音频提取成mp3?

热门文章

  1. 为什么WIMAX消失了
  2. matlab griddata插值太慢,非常慢的插值使用`scipy.interpolate.griddata`
  3. ubuntu20.04下安装LinuxQQ自动崩溃退出的解决
  4. 神经网络学习小记录68——Tensorflow2版 Vision Transformer(VIT)模型的复现详解
  5. 计算机系统结构:流水线技术总结
  6. Steve jobs
  7. SpringBoot--启动时的事件机制
  8. c++ 独一无二的不可拷贝拷贝对象
  9. 2007年流行金曲精彩推荐
  10. [UVa 1610] 聚会游戏(Party Games)