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 相关文章推荐
python3 拼接字符串的7种方法
Sep 12 Python
python实现剪切功能
Jan 23 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
wxPython实现分隔窗口
Nov 19 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
May 15 Python
django rest framework 自定义返回方式
Jul 12 Python
python如何控制进程或者线程的个数
Oct 16 Python
Python 实现PS滤镜的旋涡特效
Dec 03 Python
用python对oracle进行简单性能测试
Dec 05 Python
python中的getter与setter你了解吗
Mar 24 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
php高级编程-函数-郑阿奇
2011/07/04 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
详解php协程知识点
2018/09/21 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
心扬JS分页函数代码
2010/09/10 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
js+html制作简单验证码
2017/02/16 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
python操作CouchDB的方法
2014/10/08 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
Python字典遍历操作实例小结
2019/03/05 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
python动态视频下载器的实现方法
2019/09/16 Python
python实现简单成绩录入系统
2019/09/19 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
python如何操作mysql
2020/08/17 Python
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
MySQL面试题目集锦
2016/04/14 面试题
计算机开发个人求职信范文
2013/09/26 职场文书
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
初中生个人学习的自我评价
2013/12/04 职场文书
运动会解说词50字
2014/01/18 职场文书
岗位职责说明书
2014/05/07 职场文书
教师聘用意向书
2015/05/11 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
2022年四月新番
2022/03/15 日漫
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python