scrapy:电影天堂案例

嵌套数据封装成一个item(一个item包含多级页面的数据):每条记录的名称+点进去之后第二页中的图片

image-20230525150658615

image-20230525150736645


1. 创建爬虫项目

scrapy startproject scrapy_movie_5

image-20230525151228816

2. 创建爬虫文件

scrapy genspider mv https://www.ygdy8.net/html/gndy/china/index.html

image-20230525151623723

3. 实现爬虫

image-20230525153330779

image-20230525153304662

image-20230525153448661

image-20230525160626025

image-20230525160651044

image-20230525160707319

image-20230525160725909

import scrapy
from scrapy_movie_5.items import ScrapyMovie5Item


class MvSpider(scrapy.Spider):
    name = "mv"
    # allowed_domains = ["https://www.ygdy8.net/html/gndy/china/index.html"]
    allowed_domains = ['www.dytt8.net']
    start_urls = ['https://www.dytt8.net/html/gndy/china/index.html']

    def parse(self, response):
        # 第一页的名字和第二页的图片
        a_list = response.xpath('//div[@class="co_content8"]//td[2]//a[2]')
        for a in a_list:
            # 获取第一页的name 和 要点击的链接
            name = a.xpath('./text()').extract_first()
            href = a.xpath('./@href').extract_first()
            # 第二页的地址
            url = 'https://www.dytt8.net' + href  # 注意要修改allowed_domains,因为需要访问的第二页不再原范围内
            # 对第二页的链接发起访问
            yield scrapy.Request(url=url, callback=self.parse_second, meta={'name': name})
            # 注意当涉及多级页面时,要用meta来存参数

    def parse_second(self, response):
        # 注意 如果拿不到数据的情况下  一定检查你的xpath语法是否正确
        src = response.xpath('//div[@id="Zoom"]//img/@src').extract_first()
        # 接受到请求的那个meta参数的值
        name = response.meta['name']
        movie = ScrapyMovie5Item(src=src, name=name)
        yield movie

scrapy crawl mv

image-20230525161253244

posted @ 2023-05-25 16:13  yub4by  阅读(55)  评论(0编辑  收藏  举报