1. 程式人生 > 程式設計 >python爬蟲scrapy圖書分類例項講解

python爬蟲scrapy圖書分類例項講解

我們去圖書館的時候,會直接去自己喜歡的分類欄目找尋書籍。如果其中的分類不是很細緻的話,想找某一本書還是有一些困難的。同樣的如果我們獲取了一些圖書的資料,原始的檔案裡各種資料混雜在一起,非常不利於我們的查詢和使用。所以今天小編教大家如何用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,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如何給圖書分類內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!