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 中文乱码问题深入分析
Mar 13 Python
python中threading超线程用法实例分析
May 16 Python
Python中Random和Math模块学习笔记
May 18 Python
django+js+ajax实现刷新页面的方法
May 22 Python
python 中的int()函数怎么用
Oct 17 Python
python+opencv实现动态物体追踪
Jan 09 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
通过实例解析Python return运行原理
Mar 04 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
详解Python openpyxl库的基本应用
Feb 26 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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
删除无限级目录与文件代码共享
2006/07/12 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
php判断访问IP的方法
2015/06/19 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
Bootstrap基础学习
2015/06/16 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
vue2实现可复用的轮播图carousel组件详解
2017/11/27 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
antd Upload 文件上传的示例代码
2018/12/14 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
通过代码实例了解Python异常本质
2020/09/16 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
特步官方商城:Xtep
2017/03/21 全球购物
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
2015年教师节贺卡寄语
2015/03/24 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
秋季运动会加油词
2015/07/18 职场文书
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers