Данные таблицы с дополнительными элементами пользователя в CSV с использованием Scrapy - PullRequest
0 голосов
/ 22 февраля 2019

У меня работает скрипт, использующий scrapy, который берет данные из таблицы.Но он сохраняется в формате, потому что исходные данные в порядке аргументов строки:

name 
firstitem
seconditem
...
lastitem

Как я могу сохранить этот файл в формате строки без имени, например

21:00 2019/02/22, firstitem, seconditem,...,lastitem

Я ужеу меня есть список, который содержит текущее время, поэтому мне нужно переписать этот dict как список, чтобы разобрать его в CSV.

EDIT Я заменил ключ словаря аргументом current_time, но проблема с выводомФормат все еще существует.

import scrapy as sp
from time import gmtime, strftime

current_time = strftime("%Y-%m-%d %H:%M:%S", gmtime())

class tableSpider(sp.Spider):
    name='spider'
    start_urls = ['example.com'] #Cant expose real url

    def parse(self, response):
        CLASS_SELECTOR = '.col-xs-3'
        for ex in response.css(CLASS_SELECTOR):
            NAME_SELECTOR = 'a:not(.dep) ::text'
            yield {
                current_time: ex.css(NAME_SELECTOR).extract_first(),
            }

from scrapy.crawler import CrawlerProcess

c = CrawlerProcess({
    'USER_AGENT': 'Chrome/72.0.3626.119',
    'FEED_FORMAT': 'csv',
    'FEED_URI': 'booking.csv',
})
c.crawl(tableSpider)
c.start()

РЕДАКТИРОВАТЬ Целевой Html-код с замененными значениями (мне нужно значение всего «Item»):

<div class="table-responsive catalog">
                <table class="table table-striped table-bordered">
                    <tr class="info">
                        <th class="text-center">#</th>
                        <th>table</th>
                        <th>description</th>
                    </tr>
                                    <tr>
                        <td class="text-center col-xs-1 text-valign">1</td>
                        <td class="col-xs-3">
                                                                                        <a href="scr" target="_blank">ITEM</a>
                                                        <br/>
                            <small>date</small>
                        </td>
                        <td class="col-xs-7 text-valign">adv</td>
                                            </tr>
                                    <tr style="color: #ffffff;background-color: #000000">
                        <td class="text-center col-xs-1 text-valign">2</td>
                        <td class="col-xs-3">
                            <a class="dep" href="scr" title="22">22</a>                                                            <a href="scr" target="_blank">ITEM</a>
                                                        <br/>
                            <small>date</small>
                        </td>
                        <td class="col-xs-7 text-valign">adv</td>
                                            </tr>
                                    <tr>
                        <td class="text-center col-xs-1 text-valign">3</td>
                        <td class="col-xs-3">
                                                                                        <a href="scr" target="_blank">ITEM</a>
                                                        <br/>
                            <small>date</small>
                        </td>
                        <td class="col-xs-7 text-valign">adv</td>

1 Ответ

0 голосов
/ 26 февраля 2019

Item / ItemLoader механизм служит вашей цели.Что-то вроде:

Определение элемента для строки данных:

class DataRowItem(scrapy.Item):
     current_time = scrapy.Field()
     firstitem = scrapy.Field()
     ...

Затем объявите соответствующий ItemLoader:

class DataRowItemLoader(scrapy.ItemLoader):
    default_item_class = DataRowItem
    default_output_processor = TakeFirst()

В функции разбора:

def parse(self, response):
    loader = DataRowItemLoader(DataRowItem(), response=response)
    ... Extract the data here, using loader methods ...
    loader.add_css('current_time', ...)
    loader.add_css('firstitem', ...)
    ...
    yield loader.load_item()  # One item = one line

И затем сериализовать элементы в CSV, используя, например, этот метод: Экспорт CSV-файла из scrapy (не через командную строку)

...