当前位置: 首页 > news >正文

尚硅谷爬虫note15

一、当当网

1. 保存数据

        数据交给pipelines保存

items中的类名:  DemoNddwItem

class DemoNddwItem(scrapy.Item):

        变量名 = 类名()

            book =  DemoNddwItem(src = src, name = name, price = price)

导入:

        from 项目名.items import 类名

from demo_nddw.items import NddwSpider

2. yield

        return一个返回值

yield book:

        获取一个book,就将book交给pipelines

3. pipelines(管道):

        想使用管道,必须在settings中开启管道:
如何开启——》解除管道的注释即可开启管道

 管道可以有很多个

管道是有优先级的:

        优先级范围:1~1000

        值越小,优先级越高

 pipelines.py

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


class DemoNddwPipeline:
#爬虫文件开始前执行的方法
    def open_spider(self, spider)
        self.fp('book.json', 'w', encoding='utf-8')
    # items:yield后面的book对象
    def process_item(self, item, spider):
# #以下模式不推荐:因为每传进一个对象,就打开一次文件,对文件的操作过于频繁
# #2个方法
# #1)爬虫文件开始前执行的方法
# def open_spider(self,spider)
#     self.fp('book.json','w',encoding = 'utf-8')
# #2)爬虫文件执行完成后执行的方法
# def close_spider(self,spider)
#     self.fp.close()
# # 中间
#     self.fp.write(str(item))

        #将数据保存到文件中
        # (1)write方法必须是一个字符串强制转换:fp.write(item)——》fp.write(str(item))
        # (2)w模式会每一个对象都打开一次文件,后面打开的会覆盖前面打开的,然后关闭:将w模式改为a(追加)模式:解决:‘w’——》‘a’
    #不推荐的模式
        # with open('book.json','a',encoding='utf-8') as fp:
        #     fp.write(str(item))
#中间
        self.fp.write(str(item))

        return item
#爬虫文件执行完成后执行的方法
def close_spider(self,spider)
    self.fp.close()

 不推荐的模式:

# #以下模式不推荐:因为每传进一个对象,就打开一次文件,对文件的操作过于频繁

  #将数据保存到文件中
        # (1)write方法必须是一个字符串强制转换:fp.write(item)——》fp.write(str(item))
        # (2)w模式会每一个对象都打开一次文件,后面打开的会覆盖前面打开的,然后关闭:将w模式改为a(追加)模式:解决:‘w’——》‘a’
    #不推荐的模式
        # with open('book.json','a',encoding='utf-8') as fp:
        #     fp.write(str(item))


2个方法:

# #2个方法
# #1)爬虫文件开始前执行的方法
# def open_spider(self,spider)
#     self.fp('book.json','w',encoding = 'utf-8')
# #2)爬虫文件执行完成后执行的方法
# def close_spider(self,spider)
#     self.fp.close()
# # 中间
#     self.fp.write(str(item))

      复制items中的类名:DemoNddwItem

导入ddw中,

from demo_nddw.items import DemoNddwItem

并在ddw中使用

book = DemoNddwItem(src = src, name = name, price = price)

ddw.py

import scrapy
from demo_nddw.items import DemoNddwItem


class NddwSpider(scrapy.Spider):
    name = "nddw"
    allowed_domains = ["category.dangdang.com"]
    start_urls = ["https://category.dangdang.com/cp01.07.30.00.00.00.html"]

    def parse(self, response):
        # pass
        # src、name、price都有共同的li标签
        # 所有的selector对象,都可以再次调用xpath方法
        li_list = response.xpath('//ul[@id = "component_59"]/li')

        for li in li_list:
            # .extract()提取数据
            # 有data-original,src用data-original替代
            src = li.xpath('.//img/@data-original').extract_first()
            # 第一张图片和其他图片标签不一样,第一张图片的src是可以使用的   其他图片的地址是data-original
            if src:
                src = src
            else:
                # 用src
                src = li.xpath('.//img/@src').extract_first()
            alt = li.xpath('.//img/@alt').extract_first()
            price = li.xpath('.//p[@class = "price"]/span[1]/text()').extract_first()
            print(src, name, price)

            book = DemoNddwItem(src = src, name = name, price = price)

            # yield:return一个返回值
            #获取一个book,就将book交给pipelines
            yield book

           # pipelines(管道):想使用管道,必须在settings中开启管道:如何开启——》解除管道的注释即可开启
# ITEM_PIPELINES = {
#    "demo_nddw.pipelines.DemoNddwPipeline": 300,
# }

items.py

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class DemoNddwItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # pass
    # 图片
    # src = // ul[ @ id = "component_59"] / li // img / @ src
    src = scrapy.Field()
    # 名字
    # alt = // ul[ @ id = "component_59"] / li // img / @ alt
    name = scrapy.Field()
    # 价格
    # price = //ul[@id = "component_59"]/li//p[@class = "price"]/span[1]/text()
    price = scrapy.Field()

4. scrapy使用步骤

1)在终端中创建项目

        scrapy startproject 项目名

2)切换到项目下的spiders目录

        cd 项目名\项目名\spider

3)在spiders中创建文件

        scrapy genspider 文件名  要爬取的网页

4)运行

        scrapy crawl 文件名

相关文章:

  • Linux(Centos 7.6)命令详解:vi
  • 整除分块 2025牛客寒假算法基础集训营3G
  • bfs求解迷宫问题
  • 无人机投屏技术解码过程详解!
  • docker引擎常用目录文件详解
  • 【系统架构设计师】以数据为中心的体系结构风格
  • Better-SQLite3 参数绑定详解
  • 二叉树的遍历
  • 【人工智能】Open WebUI+ollama+deepSeek-r1 本地部署大模型与知识库
  • 【Git】基本指令
  • 【全球化2.0 | ZStack发布Zaku容器云海外版 加速亚太生态布局
  • python项目中连接数据库详细版
  • Ubuntu搭建最简单WEB服务器
  • centos8 虚拟机重启后无法识别网卡 ens33 问题原因总结
  • 算法训练(leetcode)二刷第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • 最短路问题
  • linux上配置免密登录
  • 【每日五题系列】前端面试高频题目
  • VSCode 配置优化指南:打造极致高效的前端开发环境
  • 如何高效使用 Mybatis-Plus 的批量操作
  • 专门做外贸的网站有哪些/网站维护需要学什么
  • 动态网站开发考试/杭州明开seo
  • 绍兴网站建设网站/b站推广引流最佳方法
  • 网站前端改版涉及到的问题/江西百度推广公司
  • 本地拖拽网站建设/公司管理培训课程大全
  • wordpress 模板带数据库/沈阳专业seo