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

尚硅谷爬虫note15n

1. 多条管道

多条管道开启(2步):
          (1)定义管道类
        (2)在settings中开启管道

在pipelines中:

import urllib.request
# 多条管道开启
#(1)定义管道类
#(2)在settings中开启管道
# "demo_nddw.pipelines.dangdangDownloadPipeline": 301
class dangdangDownloadPipeline:
    def process_item(self, item, spider):
        url = 'http:' + item.get('src')
        filename = './books' + item.get('name') + '.jpg'

        urllib.request.urlretrieve(url = url, filename=filename())

        return item

2. 多页下载

        爬取每页的业务逻辑都是一样的,将执行那页的请求再次调用就可以了

# 如果是多页下载的话,必须调整allowed_domains的范围,一般只写域名
allowed_domains = ["category.dangdang.com"]

ddw.py中:

#多页下载
# 爬取每页的业务逻辑是一样的,将执行那页的请求再次调用parse方法就可以了
# https://category.dangdang.com/cp01.27.01.06.00.00.html
# https://category.dangdang.com/pg2-cp01.27.01.06.00.00.html
# https://category.dangdang.com/pg3-cp01.27.01.06.00.00.html
if self.page < 100:
    self.page = self.page + 1
    url = self.basic_url + str(self.page) + '-cp01.27.01.06.00.00.html'

    # 怎么调用parse方法
    # scrapy.Request就是scrapy的get请求
    #url就是请求地址、callback就是要执行的函数,不需要()
    yield scrapy.Request(url = url, callback =self.parse)

3. 电影天堂

        获取:

                第一页的名字

                第二页的图片

涉及到两个页面:使用meta进行传递

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 DemoDyttPipeline:
    #开始
    def open_spider(self,spider):
        self.fp = open('dytt.json','w',encoding='utf-8')

    def process_item(self, item, spider):
        #中间
        self.fp.write(str(item))
        return item

    #结束
    def close_spider(self,spider):
        self.fp.close()

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 DemoDyttItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # pass
    # 名字
    name = scrapy.Field()
    # 图片
    src = scrapy.Field()

dytt.py

import scrapy

#导入:从项目的items中导入
from demo_dytt.items import DemoDyttItem


class DyttSpider(scrapy.Spider):
    name = "dytt"
    # 调整allowed_domains访问范围:只要域名
    allowed_domains = ["www.dydytt.net"]
    start_urls = ["https://www.dydytt.net/html/gndy/dyzz/20250306/65993.html"]

    def parse(self, response):
        # pass
        # print('===========================================================')
    # 要第一页的图片,和第二页的名字
        a_list = response.xpath('//div[@class = "co_content8"]//tr[2]//a[2]')

        for a in a_list:
            # 获取第一页的name,和要点击的链接
            name = a.xpath('./text()').extract_first()
            href  =a.xpath('/@href').extract_first()

            # 第二页的地址
            url = 'https://www.dydytt.net' + href

            # 对第二页链接发起访问
            # 1)meta字典:传递
            yield scrapy.Request(url = url,callback=self.parse_second,meta={'name':name})

        def parse_second(self,response):
            # 拿不到数据,检查xpath语法是否错误
            src = response.xpath('//div[@id = "Zoom"]/span/img/@src').extract_first()
            print(src)
            #2)接收meta字典
            meta = response.meta['name']

            dytt = DemoDyttItem(src = src, name = name)

            #将dytt返回给管道,需要在settings中开启管道:解除管道注释即是开启管道
            # ITEM_PIPELINES = {
            #     "demo_dytt.pipelines.DemoDyttPipeline": 300,
            # }
            yield dytt

开启管道:

        在settings.py中解除管道的注释即是开启管道

ITEM_PIPELINES = {
   "demo_dytt.pipelines.DemoDyttPipeline": 300,
}

4. CrawlSpider

        继承自scrapy.spider

CrawlSpider:what?

        1)定义规则

        2)提取符合规则的链接

        3)解析

链接提取器

        1)导入链接提取器

from scrapy.linkextractors import LinkExtractor

        2)

allow = ()        :正则表达式

restrict_xpaths = ()        :xpath

restrict_css = ()        :不推荐

        scrapy shell 网址,然后进行3)4)的链接提取

导入链接提取器:

        from scrapy.linkextractors import LinkExtractor

        3)allow = ()  语法

link = LinkExtraactor(allow = r' /book/1188_\d+\.html')

        \d表示数字

        +表示1~多

查看:

link.extract_links(response)

        4)restrict_xpaths = ()语法

link1 = LinkExtractor(restrict_xpaths = r' //div[@class = "pages"]/a/@href ')

查看:

link.extract_links(response)

5. CrawlSpider案例

1)创建文件:

        scrapy genspider -t crawl 文件名 网址

2)首页不在提取规则,所以不能提取首页

修改start_urls:

        start_urls = ["https://www.dushu.com/book/1157.html"]

 修改后:

        start_urls = ["https://www.dushu.com/book/1157_1.html"]

相关文章:

  • day18-后端Web开发——Maven高级
  • NewStar CTF week3 web wp
  • 玩转python:掌握Python数据结构之栈Stack
  • SPI学习笔记
  • 数电笔记——第二章 逻辑代数基础(二)
  • seacmsv9报错注入管理员密码+orderby+limit
  • Django下防御Race Condition
  • 【时间序列】因果推断:从时序数据中探寻“因”与“果”
  • GStreamer —— 2.9、Windows下Qt加载GStreamer库后运行 - “教程9:媒体信息收集“(附:完整源码)
  • WebSocket(WS)协议系列(四)SSL/TLS协议
  • flask学习3-深入
  • ConcurrentHashMap底层原理
  • RK3588部署YOLOv8(2):OpenCV和RGA实现模型前处理对比
  • 网络安全需要报班学习吗?
  • 重塑未来:生成式AI如何重构企业数据基因?三大技术重构的生死局
  • Paper Reading | AI 数据库融合经典论文回顾
  • ‌HTTP/1.0、HTTP/2.0和HTTP/3.0的区别
  • Pytest自动化框架
  • 深入理解 JavaScript 执行上下文
  • 【LTSPCIE】D触发器的搜索和使用
  • 网页站点怎么命名/建立网站需要什么
  • 旅游的网站建设策划书/seo发展前景怎么样啊
  • 做印刷厂网站/百度广告投放技巧
  • 有源码就可以自己做H5网站吗/怎样推广产品
  • 网站开发手机编译器/沈阳seo排名优化软件
  • 龙岩网站建设推广/雅虎搜索引擎入口