Как разобрать содержимое iFrame в пауке сканирования с помощью Python - PullRequest
0 голосов
/ 23 октября 2019

Я успешно анализирую основную часть веб-сайта, но обратный вызов не вызывает вторую функцию, поэтому я не получаю данные iframe. Веб-сайт https://www.farfeshplus.com/Video.asp?ZoneID=297

Код паука выглядит следующим образом:

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule





    class YuSpider(CrawlSpider):
        name = 'yu'
        allowed_domains = ['farfeshplus.com']
        start_urls = ['https://www.farfeshplus.com/Video.asp?ZoneID=297']

        rules = (
            Rule(LinkExtractor(restrict_xpaths='//td[@class="text6"]'), callback='parse_item', follow=True),

        )

        def parse_item(self, response):
            for url in response.xpath('//html'):
                yield {
                    'NAME': url.xpath('//h1/div/text()').extract(),
                    }
                frames = url.xpath('//iframe[@width="750"]/@src').extract_first()

                yield scrapy.Request(url=frames, callback=self.parse_frame)

        def parse_frame(self, response):
            for f in response.xpath('//div[@class="rmp-content"]/video'):
                yield {
                    'URL': f.xpath('//div[@class="rmp-content"]/video/@src').extract(),

                }

Попытка изменить имя parse_item на parse_start_url, но не повезло.

1 Ответ

1 голос
/ 24 октября 2019

Если бы я хорошо понял вашу цель, я бы попытался изменить ваш код следующим образом:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule





class YuSpider(CrawlSpider):
    name = 'yu'
    allowed_domains = ['farfeshplus.com']
    start_urls = ['https://www.farfeshplus.com/Video.asp?ZoneID=297']

    rules = (
        Rule(LinkExtractor(restrict_xpaths='//td[@class="text6"]'), callback='parse_item', follow=True),

    )

    def parse_item(self, response):
        for url in response.xpath('//html'):

            response.meta['NAME']=url.xpath('//h1/div/text()').extract()
            frames = url.xpath('//iframe[@width="750"]/@src').extract_first()

            yield scrapy.Request(url=frames, callback=self.parse_frame, meta=response.meta)

    def parse_frame(self, response):
        name=response.meta['NAME']
        for f in response.xpath('//div[@class="rmp-content"]/video'):
            yield {
                'URL': f.xpath('//div[@class="rmp-content"]/video/@src').extract(),
                'NAME':name

            }

Я думаю, что проблема связана с двумя инструкциями yield в parse_frame ( прочитайте это ). Итак, я использую response.meta для передачи имени между parse_item и parse_frame методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...