Python爬虫---scrapy框架---下载嵌套数据

./spider/movie.py文件 

import scrapy
from scrapy_movie_20240116.items import ScrapyMovie20240116Item


class MovieSpider(scrapy.Spider):
    name = "movie"
    # 如果是多页下载的话, 那么必须要调整的是allowed_domains的范围 一般情况下只写城名
    allowed_domains = ["dy2018.com"]
    start_urls = ["https://dy2018.com/html/tv/hytv/index.html"]

    def parse(self, response):
        # 获取第一页名字和第二页图片
        a_list = response.xpath("//div[@class='co_content8']//td[2]//a")  # xpath语法

        for a in a_list:
            # extract_first()  从某个数据结构中提取第一个元素
            # 获取第一页的name 和 要点击的链接
            name = a.xpath("./text()").extract_first()
            href = a.xpath("./@href").extract_first()

            # 第2页的地址是:
            url = "https://dy2018.com" + href

            # 对第二页的链接发起访问
            # scrapy.Request就是scrpay的get请求 url就是请求地址
            # callback是你要执行的那个函数注意不需要加()
            # meta 把这个方法的name传到parse_second方法中
            yield scrapy.Request(url=url, callback=self.parse_second, meta={'name': name})

    def parse_second(self, response):
        # 获取第2页的图片
        src = response.xpath("//div[@id='Zoom']/img/@src").extract_first()    # xpath语法

        # 接受到请求的那个meta参数的值
        name = response.meta["name"]

        # 将爬取的数据放在对象里
        movie = ScrapyMovie20240116Item(src=src, name=name)

        # 获取一个movie 将movie交给pipelines,将对象放在管道里
        yield movie

items.py文件

import scrapy

class ScrapyMovie20240116Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

    # 通俗的说就是你要下载的数据都有什么
    name = scrapy.Field()
    src = scrapy.Field()

 pipelines.py文件

class ScrapyMovie20240116Pipeline:
    # 在爬虫文件开始之前就执行的方法
    def open_spider(self, spider):
        self.fp = open("movie.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()

settings.py文件:

# 开启管道
ITEM_PIPELINES = {
   "scrapy_movie_20240116.pipelines.ScrapyMovie20240116Pipeline": 300,
}

你可能感兴趣的:(python,爬虫,scrapy)