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 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
浅谈python为什么不需要三目运算符和switch
Jun 17 Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
python对于requests的封装方法详解
Jan 03 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
Python logging设置和logger解析
Aug 28 Python
快速查找Python安装路径方法
Feb 06 Python
Python3 中sorted() 函数的用法
Mar 24 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 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中new static() 和 new self() 的区别介绍
2015/01/09 PHP
php数组使用规则分析
2015/02/27 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
jQuery 使用个人心得
2009/02/26 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
python队列queue模块详解
2018/04/27 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
利用python画出AUC曲线的实例
2020/02/28 Python
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
2014年公司庆元旦活动方案
2014/03/05 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
委托书英文
2015/01/28 职场文书
大学班长竞选稿
2015/11/20 职场文书
初中政治教学反思
2016/02/23 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
JS 4个超级实用的小技巧 提升开发效率
2021/10/05 Javascript
Android Rxjava3 使用场景详解
2022/04/07 Java/Android