Очистить некоторые данные Facebook, но не все?Scrapy / Всплеск / Python - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть паук, который выглядит следующим образом:

import scrapy
from scrapy_splash import SplashRequest

class BarkbotSpider(scrapy.Spider):
    name = 'barkbot'
    start_urls = [
        'http://www.facebook.com/pg/TheBarkFL/events/?ref=page_internal/'
    ]
    custom_settings = {
        'FEED_URI': 'output/barkoutput.json'
    }

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(
                url,
                self.parse,
            )

    def parse(self, response):
        for href in response.css("div#upcoming_events_card a::attr(href)").extract():
            yield response.follow(href, self.parse_concert)

    def parse_concert(self, response):
        concert = {

            "headliner" : response.xpath(
                "//h1[@id='seo_h1_tag']/text()"
            ).extract_first(),

            "venue" : "The Bark",
            "venue_address" : "507 All Saints St.",
            "venue_website" : "https://www.facebook.com/TheBarkFL",

            "date_time" : response.xpath(
                "//li[@id='event_time_info']//text()"
            ).extract(),

            "notes" : response.xpath(
                "//div[@data-testid='event-permalink-details']/span/text()"
            ).extract()

        }

        if concert['headliner']:
            yield concert

Я запускаю паука, и он успешно заканчивается.Но все ключи «notes» и «date_time» возвращают пустые списки.Я особенно запутался в примечаниях, поскольку это кажется довольно простым, если xpath не может использовать data-testid в качестве атрибута.Тем не менее, я получаю ключ хедлайнера успешно, поэтому я, очевидно, подключаюсь к каждой странице.

Я новичок в очистке контента, сгенерированного JavaScript, и, следовательно, Splash, но мне удалось его получить.другой паук работает успешно, только не на фейсбуке.Что дает?

1 Ответ

0 голосов
/ 31 декабря 2018

, если xpath не может использовать data-testid в качестве атрибута

Нет, это не так;Я только что проверил с помощью Scrapy 1.5.1, и ваш xpath отлично соответствовал образцу документа.Он даже соответствовал другим атрибутам data-testid в этом документе, поэтому я почти уверен, что вы попали в состояние гонки, потому что event-permalink-details не отображается в HTML;он загружается из XHR-вызова в их конечную точку graphql.Что в вашем случае может быть хорошо из-за Splash, но если ваш селектор не совпадает, то этот селектор работает до разрешения XHR.Я не знаю достаточно Splash, чтобы помочь разобраться с этой ситуацией.


Я не знаю ответа на ваш date_time вопрос, но на самом деле держу пари, что вы действительно хотите, это .xpath('//li[@id="event_time_info"]//@content'), потому что этосодержит 2019-01-03T17:30:00-08:00 to 2019-01-03T20:30:00-08:00, который выглядит намного лучше, чем набор строк, которые неквалифицированные text() соответствуют

...