Поиск по блогу

среда, 23 июля 2014 г.

Как сохранить response.body в файл прямо из спайдера Scrapy (filename = "spider_"+response.url.split("/")[-2])

Чтобы проект имел законченый вид, надо бы записать (куда-нибудь) результаты. Сделать это проще всего в текстовый (csv) файл. Нашел пример Creating a simple python crawler with scrapy и попробовал. Все получилось. Сама по себе идея об оработке файла в процессе парсинга пришла после того, как я вспомнил про CacheMiddleWare...

Вопросы, которые возникли после распарсивания csv файла

Куда все это сохранить (осовить pipeline)
Процесс дебаггинга влкючен по умолчанию, из вывода на экран все можно посмотреть, а в shell я не смог этим кправлять
Не получилось считать "неправильный" csv файл, для реального файла проще не считывать (или стереть) первых три срочки...
Можно просто скачать весь файл, но к нему надо добавить url (где есть вся информация)... Но куда его добавлять, чтобы сохранить?

К вопросу о дебаггинге. Можно использовать 'parse' ...?

На странице документации Command line tool есть разные инструменты, опции которых нужно изучать, полагаю, что они на все случай жизни подойдут. Еще можно посмотреть к ним исходники:
In [1]:
!chcp 65001
!dir  C:\Users\kiss\Anaconda\Lib\site-packages\scrapy\commands
Active code page: 65001
 Volume in drive C has no label.
 Volume Serial Number is 6017-2A0B

 Directory of C:\Users\kiss\Anaconda\Lib\site-packages\scrapy\commands

09.12.2013  15:39    <DIR>          .
09.12.2013  15:39    <DIR>          ..
09.12.2013  15:38               610 bench.py
09.12.2013  15:39             1В 276 bench.pyc
09.12.2013  15:38             2В 985 check.py
09.12.2013  15:39             4В 091 check.pyc
09.12.2013  15:38             2В 157 crawl.py
09.12.2013  15:39             2В 999 crawl.pyc
09.12.2013  15:38             8В 793 deploy.py
09.12.2013  15:39            11В 494 deploy.pyc
09.12.2013  15:38             1В 014 edit.py
09.12.2013  15:39             2В 169 edit.pyc
09.12.2013  15:38             2В 083 fetch.py
09.12.2013  15:39             3В 522 fetch.pyc
09.12.2013  15:38             4В 710 genspider.py
09.12.2013  15:39             5В 909 genspider.pyc
09.12.2013  15:38               402 list.py
09.12.2013  15:39             1В 109 list.pyc
09.12.2013  15:38             8В 187 parse.py
09.12.2013  15:39             9В 210 parse.pyc
09.12.2013  15:38             3В 114 runspider.py
09.12.2013  15:39             4В 219 runspider.pyc
09.12.2013  15:38             1В 511 settings.py
09.12.2013  15:39             2В 166 settings.pyc
09.12.2013  15:38             1В 532 shell.py
09.12.2013  15:39             2В 883 shell.pyc
09.12.2013  15:38             1В 796 startproject.py
09.12.2013  15:39             2В 748 startproject.pyc
09.12.2013  15:38             1В 172 version.py
09.12.2013  15:39             2В 157 version.pyc
09.12.2013  15:38               629 view.py
09.12.2013  15:39             1В 544 view.pyc
09.12.2013  15:38                 0 __init__.py
09.12.2013  15:39               155 __init__.pyc
              32 File(s)         98В 346 bytes
               2 Dir(s)  394В 114В 240В 512 bytes free

Pipeline - изучить и решить вопросы об обработке файлов Item Pipeline.

Интересны несколько вопросов (в свете предыдущего скрапинга csv-файла): первый - как сохранить скачаный текстовый файл целиком, второй - как вырезать стереть из него первые три строчки, третий, как склеить все файлы в один, четвертый, как добавить столбец... Пока все эти задачи ассоциируются с отдельным модулем, который надо писать самому...
Однако, после беглого знакомства с текстом, вспомнилось, что мне нужно посмотреть схему architecture
После чтения про загрузку я понял, что на самом деле мне хочется использовать кэш HttpCacheMiddlewar
Действительно, если просто разрешить кэш, то можно тупо "забыть" про то, что я нагружаю сайты, если обращаюсь к ним несколько раз... Превый раз, когда просто скачиваю сырец CSV, потом я этот сырец очищаю от первых трех строк и тут же добавляю столбец (или столбцы) с данными из response.url
Потом кэш уничтожается и все промежуточные фалы удаляются в два приема (два кэша) ... первый - это сырцы, второй - это парсинг из очищенных сырцов... В противном случае все это надо программировать самому...

Из двух функций работает только одна, та которая сохраняет сразу в файл... А вторая тоже оказывается "работает", она создает объект item

In [6]:
%load "C:\\Users\\kiss\\Documents\\GitMyScrapy\\scrapy_csv_2\\scrapy_csv_2\\spiders\\mail_csv.py"
In []:
from scrapy.contrib.spiders import CSVFeedSpider
from scrapy_csv_2.items import ScrapyCsv1Item

class MailCsvSpider(CSVFeedSpider):
    name = 'mail_csv'
    #allowed_domains = ['file://C:/Users/kiss/Documents/GitHub_2/scrapy_csv_2/']
    #start_urls = ['nissan_9_1_00.csv']
 
    headers = ['N', 'N100', 'purl']
    delimiter = ';'
    start_urls = ['file://C:/Users/kiss/Documents/GitMyScrapy/scrapy_csv_2/nissan_.csv']
 
        
   
   # Do any adaptations you need here
   #def adapt_response(self, response):
   #    return response
    def parse(self, response):
        filename = "spider_"+response.url.split("/")[-2]
        file = open(filename,'wb')
        file.write(response.body)
        file.close()

 
    def parse_row(self, response, row):
     #log.msg('Hi, this is a row!: %r' % row)
     
        i = ScrapyCsv1Item()
        i['N'] = row['N']
        i['N100'] = row['N100']
        i['purl'] = row['purl']
        return i
In []:
C:\Users\kiss\Documents\GitMyScrapy\scrapy_csv_2>scrapy crawl mail_csv
2014-07-22 18:48:16+0400 [scrapy] INFO: Scrapy 0.20.1 started (bot: scrapy_csv_1)
2014-07-22 18:48:16+0400 [scrapy] DEBUG: Optional features available: ssl, http11, boto, django
2014-07-22 18:48:16+0400 [scrapy] DEBUG: Overridden settings: {'NEWSPIDER_MODULE': 'scrapy_csv_2.spiders', 'SPIDER_MODULES': ['scrap
y_csv_2.spiders'], 'BOT_NAME': 'scrapy_csv_1'}
2014-07-22 18:48:17+0400 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderStat
e
2014-07-22 18:48:18+0400 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMid
dleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMid
dleware, ChunkedTransferMiddleware, DownloaderStats
2014-07-22 18:48:18+0400 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlL
engthMiddleware, DepthMiddleware
2014-07-22 18:48:18+0400 [scrapy] DEBUG: Enabled item pipelines:
2014-07-22 18:48:18+0400 [mail_csv] INFO: Spider opened
2014-07-22 18:48:18+0400 [mail_csv] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2014-07-22 18:48:18+0400 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2014-07-22 18:48:18+0400 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2014-07-22 18:48:18+0400 [mail_csv] DEBUG: Crawled (200) <GET file://C:/Users/kiss/Documents/GitMyScrapy/scrapy_csv_2/nissan_.csv> (
referer: None)
2014-07-22 18:48:18+0400 [mail_csv] INFO: Closing spider (finished)
2014-07-22 18:48:18+0400 [mail_csv] INFO: Dumping Scrapy stats:
        {'downloader/request_bytes': 264,
         'downloader/request_count': 1,
         'downloader/request_method_count/GET': 1,
         'downloader/response_bytes': 218,
         'downloader/response_count': 1,
         'downloader/response_status_count/200': 1,
         'finish_reason': 'finished',
         'finish_time': datetime.datetime(2014, 7, 22, 14, 48, 18, 714000),
         'log_count/DEBUG': 7,
         'log_count/INFO': 3,
         'response_received_count': 1,
         'scheduler/dequeued': 1,
         'scheduler/dequeued/memory': 1,
         'scheduler/enqueued': 1,
         'scheduler/enqueued/memory': 1,
         'start_time': datetime.datetime(2014, 7, 22, 14, 48, 18, 610000)}
2014-07-22 18:48:18+0400 [mail_csv] INFO: Spider closed (finished)

C:\Users\kiss\Documents\GitMyScrapy\scrapy_csv_2>
Теперь в папке проекта должен появиться сохраненный файл. Да, так и есть, но имя странноватое:
In [7]:
%load C:\\Users\\kiss\\Documents\\GitMyScrapy\\scrapy_csv_2\\spider_scrapy_csv_2
In []:
"N";"N100";"purl"
"7371";"39,46";"http://auto.mail.ru/catalogue/nissan/"
"1416";"7,58";"http://auto.mail.ru/catalogue/nissan/qashqai/"
"1179";"6,31";"http://auto.mail.ru/catalogue/nissan/x-trail/"
Имя, как видно из фрагментов выше взято из строчки start_urls = ['file://C:/Users/kiss/Documents/GitMyScrapy/scrapy_csv_2/nissan_.csv']
Итак, спайдер сработал и мы записали тело запроса целиком в файл. А вторая функция def parse_row ? Она просто ничего не выводит ...даже в дебаггере ничего нет.
Я поменял местами процедуры и filename = "spider_"+response.url.split("/")[-1] ... После выполнения измененного скрипта спайдера в папке проект появился файл:
In [8]:
%load C:\\Users\\kiss\\Documents\\GitMyScrapy\\scrapy_csv_2\\spider_nissan_.csv
In []:
"N";"N100";"purl"
"7371";"39,46";"http://auto.mail.ru/catalogue/nissan/"
"1416";"7,58";"http://auto.mail.ru/catalogue/nissan/qashqai/"
"1179";"6,31";"http://auto.mail.ru/catalogue/nissan/x-trail/"


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий