Соскоб онлайн социальный форум - не в состоянии получить дату - PullRequest
0 голосов
/ 03 февраля 2020

Я сейчас пытаюсь почистить этот онлайн-форум: https://community.whattoexpect.com/forums/postpartum-depression.html

Как видите, главная страница - это страница списка со всеми сообщениями, и тогда мне придется нажмите на каждое сообщение, чтобы получить полное содержание и ответы. Информация, которая мне нужна для каждого сообщения: Заголовок, Автор, Дата и содержание сообщения. Мне также нужна та же информация для каждого ответа на каждое сообщение (автор, дата и содержание)

Проблема, с которой я столкнулся до сих пор, заключается в том, что я могу видеть дату публикации на веб-сайте, но не с Scrapy. Вот проверка элемента:

enter image description here

Но в оболочке Scrapy есть пустое место, где должен быть текст даты: enter image description here

Я перепробовал много методов CSS и Xpath, но ничего не работает.

В конце концов, я хочу, чтобы мой результирующий CSV-файл содержал исходную информацию о записи в первой строке, а затем информацию об ответах в следующей строке. Это позволяет отслеживать взаимодействия. И заголовок сообщения или другой идентификатор сообщения будет общим идентификатором. Вот пример:

enter image description here

Хорошо, вот мой паук Scrapy. Это очень грязно, потому что я пытался решить проблему с датой.

    import scrapy

class PeripartumSpider (scrapy.Spider): name = 'respartum'

start_urls = ['http://www.community.whattoexpect.com/forums/postpartum-depression.html']

def parse(self, response):
    for post_link in response.xpath('//*[@class="group-discussions__list__item__block"]/a/@href').extract():
        link = response.urljoin(post_link)
        yield scrapy.Request(link, callback=self.parse_post)

    # Checks if the main page has a link to next page if True keep parsing.
    next_page = response.xpath('(//a[@class="page-link"])[1]/@href').extract_first()
    if next_page:
        yield scrapy.Request(next_page, callback=self.parse)


def parse_thread(self, response):

    original_post = response.xpath("//*[@class='__messageContent fr-element fr-view']/p/text()").extract()
    title = response.xpath("//*[@class='discussion-original-post__title']/text()").extract_first()
    author_name = response.xpath("//*[@class='discussion-original-post__author__name']/text()").extract_first()
    timestamp = response.xpath("//*[@class='discussion-original-post__author__updated']/text()").extract_first()
    replies_list = response.xpath("//*[@class='discussion-replies__list']").getall()

    for reply in replies_list:
        # reply content
        replies = "".join(reply.xpath(".//*[@class='wte-reply__content']/p/text()").extract())
        reply_author= reply.xpath("//*[@class='wte-reply__author']/text()").extract_first()

    yield {
        "title": title,
        "post": original_post,
        "author_name": author_name,
        "replies": replies,
        "reply_author": reply_author,
        "time": timestamp
    }

1 Ответ

0 голосов
/ 03 февраля 2020

человекочитаемая дата отображается на странице с помощью JS из атрибута дата-дата . Это число Unix метка времени .

Вы можете легко справиться с этим.

import datetime  # We need this module to deal with date

unixtimestamp = response.xpath("//*[@class='discussion-original-post__author__updated']/@data-date").extract_first()  # Extracting timestamp

unixtimestamp = int(unixtimestamp)/1000  # Removing milliseconds
timestamp = datetime.datetime.utcfromtimestamp(unixtimestamp).strftime("%m/%d/%Y %H:%M")

Дата указана в UT C. Если вам нужен другой часовой пояс - вам нужно добавить несколько часов или преобразовать в другой tz.

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