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模拟登录12306的方法
Dec 30 Python
python检测远程端口是否打开的方法
Mar 14 Python
python利用正则表达式提取字符串
Dec 08 Python
深入理解Python爬虫代理池服务
Feb 28 Python
win7+Python3.5下scrapy的安装方法
Jul 31 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
面向对象学习之pygame坦克大战
Sep 11 Python
python常用运维脚本实例小结
Feb 14 Python
Mac中PyCharm配置Anaconda环境的方法
Mar 04 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
python判断一个变量是否已经设置的方法
Aug 13 Python
python实现简单的tcp 文件下载
Sep 16 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/10/09 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
php 猴子摘桃的算法
2017/06/20 PHP
php数据序列化测试实例详解
2017/08/12 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
如何使用python爬取csdn博客访问量
2016/02/14 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
PageFactory设计模式基于python实现
2020/04/14 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
抽象方法、抽象类怎样声明
2014/10/25 面试题
物业管理大学生个人的自我评价
2013/10/10 职场文书
技校生自我鉴定
2013/12/08 职场文书
机动车交通事故协议书
2015/01/29 职场文书
签约仪式致辞
2015/07/30 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书