Scrapy笔记十二:简单爬取苏宁书籍网站

简单爬取苏宁书籍网站

参考网址:

网址1:https://book.suning.com/
网址2:https://list.suning.com/1-502325-0.html
网址3:https://product.suning.com/0070213869/10580157816.html?safp=d488778a.10038.resultsRblock.12&safc=prd.3.ssdln_502325_pro_pic01-1_0_0_10580157816_0070213869

整个爬取过程思路:

1.(parse函数)(进入网址1,在左边栏的"全部商品分类"下面)先爬取book大分类的类型,例如:文学艺术、少儿...
2.(parse函数)爬取每个大分类下的小分类的类型,例如:文学艺术下有:小说、散文随笔、青春文学...
3.(parse_book_list函数)进入步骤2中每个小分类的url下,这个网页下有很多关于书的商品,爬取每个书商品栏对应的书名和对应的url
4.(parse_book_detail函数)进入步骤3中每本书下对应的url,然后爬取对应的作者名字(想爬取价格,虽然在浏览器检查里	面有价格,但是在源码中是没有的,它是有一定逻辑拼接起来的url,有点复杂,所以不弄价格)
5.(parse_book_list函数)翻页操作:在每个小分类的url下,由于在浏览器最下面对应的码数是没有对应的url的而且翻页是应用ajax技术,所以可以打开F12里面的Network,然后点击下一页,在下面找到对应的ajax网页,从中找到有规律的url地址,然后在parse_book_list函数执行完 第3步 操作后添加翻页操作
6.在这次scrapy爬取中每个函数之间会传递item且是浅拷贝传递,而scrapy是多线程爬取,所以在多个线程同时执行时,会影响item里面的值。所以需要让item传递变成深拷贝的
7.为了防止浏览器发现是机器人,所以可以在settings里面引入USER_AGENT
8.把item保存为json格式文件
未解决的问题:

第3步中,爬取每个对应的书的书名和url,其实只爬取了几个,因为该网页是运用ajax技术,所以下面很多书的信息都没有爬取到,在这里不爬取先。

代码如下:
# -*- coding: utf-8 -*-
import scrapy
import re
import json
from copy import deepcopy

class SnSpider(scrapy.Spider):
    name = 'sn'
    allowed_domains = ['suning.com','suning.cn']
    start_urls = ['http://book.suning.com/']

    def parse(self, response):
        # 大分类的分组
        div_list = response.xpath("//div[@class='menu-list']/div[@class='menu-item']")
        for div in div_list:
            item= {}
            item['b_cata'] = div.xpath('./dl/dt/h3/a/text()').get()
            a_list = div.xpath('.//dd/a')
            # 小分类的分组
            for a in a_list:
                # 小说分类
                item['s_cate'] = a.xpath('./text()').get()
                item['s_href'] = a.xpath('./@href').get()

                yield scrapy.Request(
                    item['s_href'],
                    callback=self.parse_book_list,
                    meta={"item":deepcopy(item)}
                )


    def parse_book_list(self,response):
        item = response.meta['item']
        li_list = response.xpath('//ul[@class="clearfix"]/li')
        for li in li_list:
            # item['img_url'] = li.xpath('.//a[@class="sellPoint"]/img/@src2').get()
            # item['img_url'] = 'https:' + item['img_url']
            item['book_url'] = li.xpath('.//a[@class="sellPoint"]/@href').get()
            item['book_url'] = 'https:' + item['book_url']

            item['book_name'] = li.xpath('.//a[@class="sellPoint"]/img/@alt').get()

            yield scrapy.Request(
                item['book_url'],
                callback=self.parse_book_detail,
                meta={"item":deepcopy(item)}
            )
        #https://list.suning.com/emall/showProductList.do?ci=502325&pg=03&cp=1
        """
        param.currentPage = "1";
        param.pageNumbers = "100";  
        """
        currentPage = int(re.findall(r'param.currentPage = "(.*?)";',response.body.decode())[0])
        pageNumbers = int(re.findall(r'param.currentPage = "(.*?)";',response.body.decode())[0])
        ci = item['s_href'][26:32]
        if currentPage < pageNumbers:
            next_url = 'https://list.suning.com/emall/showProductList.do?ci=' + ci + '502325&pg=03&cp=' + str(
                currentPage+1)
            yield scrapy.Request(
                next_url,
                callback=self.parse_book_list,
                meta={"item":item}
            )

    def parse_book_detail(self,response):
        item = response.meta['item']
        item['book_author'] = response.xpath('//ul[@class="bk-publish clearfix"]/li[1]/text()').get().strip()
        print(item)
        with open('book.json','a',encoding='utf-8') as f:
            f.write(json.dumps(item,ensure_ascii=False))


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值