Чтобы проект имел законченый вид, надо бы записать (куда-нибудь) результаты. Сделать это проще всего в текстовый (csv) файл. Нашел пример Creating a simple python crawler with scrapy и попробовал. Все получилось. Сама по себе идея об оработке файла в процессе парсинга пришла после того, как я вспомнил про CacheMiddleWare...
Item Pipeline
Command line tool
Scrapy creating-projects
xmlfeedspider
csvfeedspider
settings
Scrapy shell
Command line tool
Scrapy creating-projects
xmlfeedspider
csvfeedspider
settings
Scrapy shell
Вопросы, которые возникли после распарсивания csv файла¶
Куда все это сохранить (осовить pipeline)
Процесс дебаггинга влкючен по умолчанию, из вывода на экран все можно посмотреть, а в shell я не смог этим кправлять
Не получилось считать "неправильный" csv файл, для реального файла проще не считывать (или стереть) первых три срочки...
Можно просто скачать весь файл, но к нему надо добавить url (где есть вся информация)... Но куда его добавлять, чтобы сохранить?
Процесс дебаггинга влкючен по умолчанию, из вывода на экран все можно посмотреть, а в shell я не смог этим кправлять
Не получилось считать "неправильный" csv файл, для реального файла проще не считывать (или стереть) первых три срочки...
Можно просто скачать весь файл, но к нему надо добавить url (где есть вся информация)... Но куда его добавлять, чтобы сохранить?
К вопросу о дебаггинге. Можно использовать 'parse' ...?¶
На странице документации Command line tool есть разные инструменты, опции которых нужно изучать, полагаю, что они на все случай жизни подойдут. Еще можно посмотреть к ним исходники:
In [1]:
!chcp 65001
!dir C:\Users\kiss\Anaconda\Lib\site-packages\scrapy\commands
Pipeline - изучить и решить вопросы об обработке файлов Item Pipeline.¶
Интересны несколько вопросов (в свете предыдущего скрапинга csv-файла): первый - как сохранить скачаный текстовый файл целиком, второй - как вырезать стереть из него первые три строчки, третий, как склеить все файлы в один, четвертый, как добавить столбец... Пока все эти задачи ассоциируются с отдельным модулем, который надо писать самому...
Однако, после беглого знакомства с текстом, вспомнилось, что мне нужно посмотреть схему architecture
После чтения про загрузку я понял, что на самом деле мне хочется использовать кэш HttpCacheMiddlewar
Действительно, если просто разрешить кэш, то можно тупо "забыть" про то, что я нагружаю сайты, если обращаюсь к ним несколько раз... Превый раз, когда просто скачиваю сырец CSV, потом я этот сырец очищаю от первых трех строк и тут же добавляю столбец (или столбцы) с данными из response.url
Потом кэш уничтожается и все промежуточные фалы удаляются в два приема (два кэша) ... первый - это сырцы, второй - это парсинг из очищенных сырцов... В противном случае все это надо программировать самому...
Действительно, если просто разрешить кэш, то можно тупо "забыть" про то, что я нагружаю сайты, если обращаюсь к ним несколько раз... Превый раз, когда просто скачиваю сырец 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] ... После выполнения измененного скрипта спайдера в папке проект появился файл:
Я поменял местами процедуры и 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/"
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий