scrapy 爬取当当图书名字图片

1。创建项目和创建爬虫参考上一篇博客。

2.dang.py

import scrapy
from scrapy_dangdang.items import ScrapyDangdangItem

class DangSpider(scrapy.Spider):
    name = 'dang'
    # 多页下载要注意  allowed_domains 范围,一般只写域名
    allowed_domains = ['category.dangdang.com']
    start_urls = ['http://category.dangdang.com/cp01.01.02.00.00.00.html']
    base_url = 'http://category.dangdang.com/pg' 
    page = 1
    def parse(self, response):
        li_list = response.xpath('//ul[@id="component_59"]/li')  # xpath 选择要爬取的内容路径
        for li in li_list:
            src = li.xpath('.//img/@data-original').extract_first()  
            # 懒加载反爬 第一张图片和其他图片的标签属性是不一样的,第一张图片是可以使用 src 的,其他图片的地址是 data-original
            if src:
                src = src
            else:
                src = li.xpath('.//img/@src').extract_first()
            name = li.xpath('.//img/@alt').extract_first()
            price = li.xpath('.//p[@class="price"]/span[1]/text()').extract_first()
            book = ScrapyDangdangItem(src=src,name=name,price=price)
            yield book  # 获取一个 book 就将 book 交给 pipelines ,yield 类似 return

# 每一页的爬取逻辑是一样的。只需要将执行页的请求再次调用 parse 方法
        if self.page < 100:
            self.page = self.page + 1
            url = self.base_url +str(self.page) + '-cp01.01.02.00.00.00.html'  # 每页的url链接拼接
            # callback 要执行的函数
            yield  scrapy.Request(url=url,callback=self.parse)

3. items 定义数据结构

items.py

import scrapy
class ScrapyDangdangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    src = scrapy.Field()        # 图片
    name = scrapy.Field()       # 名字
    price = scrapy.Field()      # 价格

4.管道 pipelines 下载数据

pipelines.py

import urllib.request
from itemadapter import ItemAdapter

# 如果想使用管道 ,必须在 settings 开启管道
class ScrapyDangdangPipeline:
    # 在爬虫文件开始之前执行
    def open_spider(self,spider):
        self.fp = open('book.json','a',encoding='utf-8')
    # item 就是yield 后面的 book 对象
    def process_item(self, item, spider):
        # write 方法必须是一个字符串
        # 对文件打开关闭操作过于频繁,不推荐这样做
        # with open('book.json','a',encoding='utf-8') as fp:
        #     fp.write(str(item))
        self.fp.write(str(item) + ',')
        return item
    # 在爬虫文件执行完之后 执行
    def cloxe_spider(self,spider):
        self.fp.close()

# 再开一条管道下载
# 1)定义管道类,并在 settings 中增加 'scrapy_dangdang.pipelines.DangDangDownloadPipeline': 301,
class DangDangDownloadPipeline:  # 定义管道类
    def process_item(self,item,spider):
        url = 'http:' + item.get('src')  # 图片地址拼接
        filename = r'C:\Users\Administrator\Desktop\books' + './' + item.get('name') + '.jpg'
        urllib.request.urlretrieve(url=url,filename=filename)  # 下载图片
        return item

5.爬取下载的部分数据保存在 json

 6.保存的图片

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值