Я написал парсер, который должен искать определенный шаблон в 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
}