Scrapy Crawler: почему этот код создает десятки дубликатов? - PullRequest
0 голосов
/ 08 июля 2020

Я написал парсер, который должен искать определенный шаблон в URL-адресах, в данном случае «id /» после Tagesschau.de, а затем очищать статьи и комментарии.

Это работает ..., вроде, как бы, что-то вроде. У меня до 38! дубликаты для одной статьи (последняя очистка 107!), и я понятия не имею, почему.

Кто-нибудь видит мою ошибку? Вот мой полный код. Пробую 3 месяца парсить, работает ли этот код. Но за три дня сейчас получается csv-файл размером 350 МБ.

# -*- coding: utf-8 -*-

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from datetime import datetime

class CommentsSpider(CrawlSpider):
    name = 'comments'
    allowed_domains = ['meta.tagesschau.de']
    start_urls = ['https://meta.tagesschau.de/']

    # allow all links with id/ and then go through the following pages
    rules = (
        Rule(LinkExtractor(allow=r'/id/'), callback='parse_article', follow=True),
        # get to the next pages
        Rule(LinkExtractor(restrict_xpaths=".//div[@class='labels']/ul/li[@class='entry nextpage']/a"))
    )

    def parse_article(self, response):

        # focus on the mainpart
        complete_article = response.xpath('//div[@class="content"]')
        for article in complete_article:

            # define the timeslot, which is to be crawled
            beginn = "2020, 7, 8 - 00:01"
            begin = datetime.strptime(beginn, "%Y, %m, %d - %H:%M")
            ende = "2020, 7, 8 - 23:59"
            end = datetime.strptime(ende, "%Y, %m, %d - %H:%M")

            article_date = article.xpath('//div[@class="box viewA"]/h3/text()').get()
            # complicated, but works
            article_date = article_date.replace("Januar", "1")
            article_date = article_date.replace("Februar", "2")
            article_date = article_date.replace("März", "3")
            article_date = article_date.replace("April", "4")
            article_date = article_date.replace("Mai", "5")
            article_date = article_date.replace("Juni", "6")
            article_date = article_date.replace("Juli", "7")
            article_date = article_date.replace("August", "8")
            article_date = article_date.replace("September", "9")
            article_date = article_date.replace("Oktober", "10")
            article_date = article_date.replace("November", "11")
            article_date = article_date.replace("Dezember", "12")

            article_dt = datetime.strptime(article_date, "%d. %m %Y - %H:%M Uhr")

            if begin <= article_dt <= end:
                # get the following features
                maintitle = article.xpath('//div[@class="box viewA"]/h1/span[@class="headline"]/text()').get()
                title = maintitle.strip()
                datum = article_dt.date()
                time = article_dt.time()
                textraw = article.xpath('//span[@class="teasertext"]/p/text()').get()
                text = textraw.strip()
                keywords = article.xpath('//div[@class="taxonomy"][1]/ul/li/a/text()').getall()
                geo = article.xpath('//div[@class="taxonomy"][2]/ul/li/a/text()').getall()
                bewertung = article.xpath('//div[@class="description"]/div[@class="fivestar-summary fivestar-summary-average-count"]/span/span/text()')[0].get()
                votes = article.xpath('//div[@class="description"]/div[@class="fivestar-summary fivestar-summary-average-count"]/span/span/text()')[1].get()
                comment = article.xpath('//div[@id="comments"]//div[@class="box"]').getall()
                url = response.url.encode('utf-8')

                yield {
                    'Titel': title,
                    'Datum': datum,
                    'Zeit': time,
                    'Artikel': text,
                    'Keywords': keywords,
                    'Geokeywords': geo,
                    'Bewertung': bewertung,
                    'Abstimmungen': votes,
                    'Kommentare': comment,
                    'Artikelurl': url
                }
...