python爬虫scrapy图书分类实例讲解


Posted in Python onNovember 23, 2020

我们去图书馆的时候,会直接去自己喜欢的分类栏目找寻书籍。如果其中的分类不是很细致的话,想找某一本书还是有一些困难的。同样的如果我们获取了一些图书的数据,原始的文件里各种数据混杂在一起,非常不利于我们的查找和使用。所以今天小编教大家如何用python爬虫中scrapy给图书分类,大家一起学习下:

spider抓取程序:

在贴上代码之前,先对抓取的页面和链接做一个分析:

python爬虫scrapy图书分类实例讲解

网址:http://category.dangdang.com/pg4-cp01.25.17.00.00.00.html

这个是当当网图书的链接,经过分析发现:大种类的id号对应 cp01.25 中的25,小种类对应id号中的第三个 17,pg4代表大种类 —>小种类下图书的第17页信息。

为了在抓取图书信息的同时找到这本图书属于哪一大种类下的小种类的归类信息,我们需要分三步走,第一步:大种类划分,在首页找到图书各大种类名称和对应的id号;第二步,根据大种类id号生成的链接,找到每个大种类下的二级子种类名称,及对应的id号;第三步,在大种类 —>小种类的归类下抓取每本图书信息。

分步骤介绍下:

1、我们继承RedisSpider作为父类,start_urls作为初始链接,用于请求首页图书数据

# -*- coding: utf-8 -*-
import scrapy
import requests
from scrapy import Selector
from lxml import etree
from ..items import DangdangItem
from scrapy_redis.spiders import RedisSpider
 
class DangdangSpider(RedisSpider):
  name = 'dangdangspider'
  redis_key = 'dangdangspider:urls'
  allowed_domains = ["dangdang.com"]
  start_urls = 'http://category.dangdang.com/cp01.00.00.00.00.00.html'
  def start_requests(self):
    user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 \
           Safari/537.36 SE 2.X MetaSr 1.0'
    headers = {'User-Agent': user_agent}
    yield scrapy.Request(url=self.start_urls, headers=headers, method='GET', callback=self.parse)

2、在首页中抓取大种类的名称和id号,其中yield回调函数中传入的meta值为本次匹配出的大种类的名称和id号

def parse(self, response):
    user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 \
           Safari/537.36 SE 2.X MetaSr 1.0'
    headers = {'User-Agent': user_agent}
    lists = response.body.decode('gbk')
    selector = etree.HTML(lists)
    goodslist = selector.xpath('//*[@id="leftCate"]/ul/li')
    for goods in goodslist:
      try:
        category_big = goods.xpath('a/text()').pop().replace('  ','') # 大种类
        category_big_id = goods.xpath('a/@href').pop().split('.')[1]  # id
        category_big_url = "http://category.dangdang.com/pg1-cp01.{}.00.00.00.00.html".\
                 format(str(category_big_id))
        # print("{}:{}".format(category_big_url,category_big))
        yield scrapy.Request(url=category_big_url, headers=headers,callback=self.detail_parse,
                   meta={"ID1":category_big_id,"ID2":category_big})
      except Exception:
        Pass

3、根据传入的大种类的id号抓取每个大种类下的小种类图书标签,yield回调函数中传入的meta值为大种类id号和小种类id号

def detail_parse(self, response):
    ID1:大种类ID  ID2:大种类名称  ID3:小种类ID ID4:小种类名称
    url = 'http://category.dangdang.com/pg1-cp01.{}.00.00.00.00.html'.format(response.meta["ID1"])
    category_small = requests.get(url)
    contents = etree.HTML(category_small.content.decode('gbk'))
    goodslist = contents.xpath('//*[@class="sort_box"]/ul/li[1]/div/span')
    for goods in goodslist:
      try:
        category_small_name = goods.xpath('a/text()').pop().replace(" ","").split('(')[0]
        category_small_id = goods.xpath('a/@href').pop().split('.')[2]
        category_small_url = "http://category.dangdang.com/pg1-cp01.{}.{}.00.00.00.html".\
                 format(str(response.meta["ID1"]),str(category_small_id))
        yield scrapy.Request(url=category_small_url, callback=self.third_parse, meta={"ID1":response.meta["ID1"],\
            "ID2":response.meta["ID2"],"ID3":category_small_id,"ID4":category_small_name})
 
        # print("============================ {}".format(response.meta["ID2"])) # 大种类名称
        # print(goods.xpath('a/text()').pop().replace(" ","").split('(')[0])  # 小种类名称
        # print(goods.xpath('a/@href').pop().split('.')[2])  # 小种类ID
      except Exception:
        Pass

4、抓取各大种类——>小种类下的图书信息

def third_parse(self,response):
    for i in range(1,101):
      url = 'http://category.dangdang.com/pg{}-cp01.{}.{}.00.00.00.html'.format(str(i),response.meta["ID1"],\
                                           response.meta["ID3"])
      try:
        contents = requests.get(url)
        contents = etree.HTML(contents.content.decode('gbk'))
        goodslist = contents.xpath('//*[@class="list_aa listimg"]/li')
        for goods in goodslist:
          item = DangdangItem()
          try:
            item['comments'] = goods.xpath('div/p[2]/a/text()').pop()
            item['title'] = goods.xpath('div/p[1]/a/text()').pop()
            item['time'] = goods.xpath('div/div/p[2]/text()').pop().replace("/", "")
            item['price'] = goods.xpath('div/p[6]/span[1]/text()').pop()
            item['discount'] = goods.xpath('div/p[6]/span[3]/text()').pop()
            item['category1'] = response.meta["ID4"]    # 种类(小)
            item['category2'] = response.meta["ID2"]    # 种类(大)
          except Exception:
            pass
          yield item
      except Exception:
        pass

到此这篇关于python爬虫scrapy图书分类实例讲解的文章就介绍到这了,更多相关python爬虫中scrapy如何给图书分类内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现把回车符\r\n转换成\n
Apr 23 Python
在Python中处理字符串之isdecimal()方法的使用
May 20 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
使用tensorflow实现AlexNet
Nov 20 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
Mar 23 Python
python实现抽奖小程序
Apr 15 Python
Python基础学习之时间转换函数用法详解
Jun 18 Python
Python 类的魔法属性用法实例分析
Nov 21 Python
Python内置函数locals和globals对比
Apr 28 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
python解压zip包中文乱码解决方法
Nov 27 Python
python爬取youtube视频的示例代码
Mar 03 Python
scrapy处理python爬虫调度详解
Nov 23 #Python
利用Python将多张图片合成视频的实现
Nov 23 #Python
Python系统公网私网流量监控实现流程
Nov 23 #Python
Python 调用 ES、Solr、Phoenix的示例代码
Nov 23 #Python
10个示例带你掌握python中的元组
Nov 23 #Python
详解anaconda安装步骤
Nov 23 #Python
Python可以用来做什么
Nov 23 #Python
You might like
php二维数组转成字符串示例
2014/02/17 PHP
Prototype Template对象 学习
2009/07/19 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
ExtJS的拖拽效果示例
2013/12/09 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python实现二分查找算法实例
2015/05/26 Python
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
QML使用Python的函数过程解析
2019/09/26 Python
python使用建议与技巧分享(二)
2020/08/17 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
如何手工释放资源
2013/12/15 面试题
应届毕业生求职信范例分享
2013/12/17 职场文书
给水工程专业毕业生自荐信
2014/01/28 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
项目投资合作意向书
2014/07/29 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书