Scrapy дает только последние данные и объединяет данные Scrapy в один - PullRequest
0 голосов
/ 06 июня 2019

Я собираю какой-то новостной веб-сайт с платформой scrapy, кажется, что он хранит только последний элемент, скопированный и повторенный в цикле

Я хочу сохранить заголовок, дату и ссылку, которые я вычищаю с первой страницыа также хранить всю статью новостей.Поэтому я хочу объединить статью, хранящуюся в списке, в одну строку.

Код товара

import scrapy
class ScrapedItem(scrapy.Item):
# define the fields for your item here like:
title = scrapy.Field()
source = scrapy.Field()
date = scrapy.Field()
paragraph = scrapy.Field()

Код паука

import scrapy
from ..items import ScrapedItem


class CBNCSpider(scrapy.Spider):
name = 'kontan'
start_urls = [
    'https://investasi.kontan.co.id/rubrik/28/Emiten'
]

def parse(self, response):
    box_text = response.xpath("//ul/li/div[@class='ket']")
    items = ScrapedItem()

    for crawl in box_text:

        title = crawl.css("h1 a::text").extract()
        source ="https://investasi.kontan.co.id"+(crawl.css("h1 a::attr(href)").extract()[0]) 
        date = crawl.css("span.font-gray::text").extract()[0].replace("|","")


        items['title'] = title
        items['source'] =source
        items['date'] = date

        yield scrapy.Request(url = source,
                             callback=self.parseparagraph,
                             meta={'item':items})

def parseparagraph(self, response):
    items_old = response.meta['item']  #only last item stored
    paragraph = response.xpath("//p/text()").extract() 
    items_old['paragraph'] = paragraph #merge into single string
    yield items_old

Я ожидаю, что результат будетДата, Название и Источник могут быть обновлены через цикл.И статью можно объединить в одну строку для хранения в mysql

1 Ответ

0 голосов
/ 06 июня 2019

Я определил пустой словарь и поместил эти переменные в него. Более того, я внес некоторые незначительные изменения в ваши селекторы xpath и css, чтобы сделать их менее подверженными ошибкам. Скрипт теперь работает как надо:

import scrapy

class CBNCSpider(scrapy.Spider):
    name = 'kontan'
    start_urls = [
        'https://investasi.kontan.co.id/rubrik/28/Emiten'
    ]

    def parse(self, response):
        for crawl in response.xpath("//*[@id='list-news']//*[@class='ket']"):
            d = {}
            d['title'] = crawl.css("h1 > a::text").get()
            d['source'] = response.urljoin(crawl.css("h1 > a::attr(href)").get())
            d['date'] = crawl.css("span.font-gray::text").get().strip("|")
            yield scrapy.Request(
                url=d['source'],
                callback=self.parseparagraph,
                meta={'item':d}
             )

    def parseparagraph(self, response):
        items_old = response.meta['item']
        items_old['paragraph'] = response.xpath("//p/text()").getall()
        yield items_old
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...