Код для этого краулера я писал урывками. Надо было понять Rule(LinkExtractor... Потом пришлось делать паузы для срочных заказов... Работа прерывалась и для того, чтобы освоить RE, XPath. В целом я доволен тем, наскоько быстро я разобрался с отладкой спайдера, поскольку пришлось использовать разнообразные и новые для меня навыки. В этом посте код паука и мои заметки по поводу итераций внутри функции parse_item(self, response)
Ссылки на другие посты, написанные в процессе работы на этим краулером собраны после текста поста. C:\Users\kiss\Anaconda\Tools\Scripts>redemo.py
Что делает этот спайдер¶
На главной странице есть список всех ссылок на страницы фирм. Первый фильтр посылает запросы на страницы фирм (пример https://cars.mail.ru/catalog/bmw/index.html). Н каждой странице фирмы есть данные ссылки на моодификации. Назовем эти страницы страницами модификаций (пример https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/index.html). Спайдер он же краулер (согласно документации SCrapy) проодит по ссылкам к страницам модификаций и вырезает из них данные. Для итераций по блокам для вырезания используется тот же прием, что и в примере dirbot.
Особенности спайдера - использование XPath осей.¶
Поскольку количество ссылок '//a[@class="catalog-agemoditem__equip clear"]' может изменяться для разных модификаций, то пришлось сначала найти все эти ссылки на странице, а потом искать остальные элементы относительно каждой такой ссылки. Это усложнило остальные запросы XPath
Поскольку сначала я не представлял себе механизма итераций по найденным старницам и объектам XPath, то чуть не пропустил серьезную ошибку. Ниже код с ошибкой.
Код неправильного паука с ошибкой¶
%load "C:\\Users\\kiss\\SkyDrive\\Docs\\mailru\\cars_mail_1\\carmailPrice\\carmailPrice\\spiders\\price_1_0.py"
import scrapy
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from carmailPrice.items import CarmailpriceItem
class PriceSpider(CrawlSpider):
name = 'line_price'
# allowed_domains = ['cars.mail.ru']
start_urls = [#'http://www.cars.mail.ru/',
#'file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html',
'file:///C:/Users/kiss/Desktop/carsmail/carsmail/index.html',
]
# Rules for selecting URL like this
# 'file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/3/e92/coupe/index.html'
# 'file://C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html'
rules = (
Rule(LinkExtractor(allow=('^file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html',),\
deny=(r'^http.*',)), follow=True, ),
## Rule(LinkExtractor(allow=('^file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/[a-zA-Z0-9_-]+/index.html',),\
## deny=(r'^http.*',)), follow=True, ),
Rule(LinkExtractor(allow=('^file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/([a-zA-Z0-9_-]+/){2,}index.html',),\
deny=(r'^http.*',)), follow=False, callback='parse_item' ),
)
def parse_item(self, response):
in2=response.xpath('//div[@class="catalog-age__mod__list js-catalog_mod_list"]')
link_list = in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]')
items = []
for link in link_list:
item = CarmailpriceItem()
# Modification ['320d 184hp xDrive AT']
item['modification'] = link_list.xpath('.//\
preceding-sibling::div[@class="catalog-age__mod__item__type clear"] \
/div[@class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_title"]/a/text()').extract()
# Modification link to URI
# https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/specifications/?gear_type=204&fuel=59&modification_id=22939"
item['link_to_spec'] = link_list.xpath('.//\
preceding-sibling::div[@class="catalog-age__mod__item__type clear"] \
/div[@class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_title"]/a/@href').extract()
# Автомат, полный привод, дизель, 7.4 с до 100 км/ч
item['disel'] = link_list.xpath('.//\
preceding-sibling::div[@class="catalog-age__mod__item__note"]/text()').extract()
# Power [u'184 \u043b.\u0441.']
item['power'] = link_list.xpath('.//\
preceding-sibling::div[@class="catalog-age__mod__item__type clear"] \
/div[@class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_hp"]/text()').extract()
#name of line... ['Sport Line SKD', 'Modern Line SKD', 'Luxury Line SKD']
item['name_line'] =link_list.xpath('.//\
span[1]/text()').extract()
# line Price ['1752000'] from <span class="rank"><i>1</i><i>752</i><i>000</i></span>
item['line_price'] =link_list.xpath('.//\
div/span/span[@class="rank"]').extract()
# link to line spec "https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/30439/"
item['link_price'] = link_list.xpath('.//@href').extract()
items.append(item)
return items
Спайдер бойко парсил страницу и выдавал на экран поток из списков вроде этого:
'modification': [u'120d AT',
u'120d MT',
u'120i 170hp AT',
u'120i 170hp MT',
u'123d AT',
u'123d MT',
u'125i AT',
u'125i MT',
u'135i AT',
u'135i MT'],
Во всех списках для каждой модификации (страницы) количество элементов совпадало, и только один список был в три раза длиннее, так парсились вот эти теги:
<span class="rank"><i>1</i><i>752</i><i>000</i></span>
item['link_price'] = link_list.xpath('.//div/span/span[@class="rank"]/i/text()').extract()
Это очень серьезная ошибка, мы ее испрачвим чуть ниже, а пока отметим, что я ее не заметил, потому, что быд занят "тысячей мелочей". Вот таких, например:
Пришлось перечитывать раздел документации о регулярных выражениях (357 мелочь)¶
Фрагмент фильтра (.+?/){2,}index.html для того, чтобы не пропустить catalog/bmw/index.html - здесь только один экономный набор перед слешем... Этот фильтр еще надо будет отлаживать... Хотя, в коде наверху уже другой вариант /([a-zA-Z0-9_-]+/){2,}index.html
Прямой вызов callback='parse_item' (426 мелочь)¶
Как только страница загружена, вызывается функция для ее обработки (пользовательская, т.е. моя). В предыдущих постах есть вариант с двумя функциями обратного вызова. Но мне пока не ясно, как их правильно использовать, чтобы контролировать, в какие ячейки таблицы записываются результаты. В процессе работы на спайдером я не вспомнил о том, что использовать функцию обратного вызова проще прямо из def parse(self, response) Debugging Spiders
import scrapy
from myproject.items import MyItem
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = (
'http://example.com/page1',
'http://example.com/page2',
)
def parse(self, response):
# collect `item_urls`
for item_url in item_urls:
yield scrapy.Request(item_url, self.parse_item)
def parse_item(self, response):
item = MyItem()
# populate `item` fields
# and extract item_details_url
yield scrapy.Request(item_details_url, self.parse_details, meta={'item': item})
def parse_details(self, response):
item = response.meta['item']
# populate more `item` fields
return item
По сути LinkExtractor - это частный случай фнкции parse, потому будем двигаться последовтельно и отложим этот "более сложный вариант" для следующих спайдеров.
И вот "руки дошли" до главной ошибки, благодаря ей я "постиг" механизм итераций. ...Правильнее, конечно, было бы написать, не "постиг", а сформировал первый (черновой) вариант модели итераций. Но модет быть это и называется "постиг". Было пустое место, а теперь есть на что опереться?
Фрагменты и итерации на странице.¶
А если со страницы мне нужно вырезать изрядное количество фрагментов? Мне нужен итератор. Пока у меня только формируется понимание того, как лучше использовать итераторы. Наверное, поэтому я стремлюсь упростить итераторы и усложнить запросы?
Текст выше я написал еще до выявления ошибки, видно, что я намеревался отложить "постижение" итераций в должгий ящик.
Механизм итераций¶
- Объект Items - это словарь списков. Поэтому можно присвоить весь список сразу вот таким способом
item['modification'] = link_list.xpath('.//\ preceding-sibling::div[@class="catalog-agemoditemtype clear"] \ /div[@class="catalog-agemoditemtypetext catalog-agemoditemtype__text_title"]/a/text()').extract()
Действительно, link_list - это объект XPath, в который мы отправили ссылки на блок DIV, в котором содержится вся информация обо всех моделях на странице, потому мы сразу и получаем все данные
'modification': [u'120d AT',
u'120d MT',
u'120i 170hp AT',
u'120i 170hp MT',
u'123d AT',
u'123d MT',
u'125i AT',
u'125i MT',
u'135i AT',
u'135i MT'],
2. Так зачем же мы делаем это внутри цикла?
for link in link_list:
Это уже лишнее занятие. Получается, что я повторяю одну и ту же команду и каждый раз переприсваиваю один и тот же список. Ошибка, конечно, детская..., но выводы полезные
3. Метод XPath выдает список, который сразу можно присвоить элементу словаря списков MyItem
4. Присвоение внутри цикла нужно только, чтобы избежать сбоев-сдвигов ...Например, между списком наименований и списком цен.
Теоретически можно организовать парсинг без цикла и контролирвать количество элементов в каждом списке, но что делать при рассоглавовании? Проще в цикле заполнить пустые места пустыми элементами и обеспечить еданое индексирование.
- Раньше я полагал, что, испоьзуя метод .xpath, мы вырезаем из страницы (DOM)определенные куски, потом, повторно испоьзуя .xpath, мы вырыезаем фрагменты из этих кусков. Это неправильно.
Слово "вырезаем" здесь не подходит.
in2=response.xpath('//div[@class="catalog-age__mod__list js-catalog_mod_list"]')
link_list = in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]')
Иначе не было бы доступа к родительски элементам link_list. Правильнее было бы использовать метафору 'ссылка на "селектор"'
6. Надо помнить, что .// означает self, а ..// parent. А я все время забываю ставить точки...
Код исправленного паука¶
%load "C:\\Users\\kiss\\SkyDrive\\Docs\\mailru\\cars_mail_1\\carmailPrice\\carmailPrice\\spiders\\price_1_1.py"
import scrapy
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from carmailPrice.items import CarmailpriceItem
class PriceSpider(CrawlSpider):
name = 'line_price_1'
# allowed_domains = ['cars.mail.ru']
start_urls = [#'http://www.cars.mail.ru/',
#'file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html',
'file:///C:/Users/kiss/Desktop/carsmail/carsmail/index.html',
]
# Rules for selecting URL like this
# 'file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/3/e92/coupe/index.html'
# 'file://C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html'
rules = (
Rule(LinkExtractor(allow=('^file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html',),\
deny=(r'^http.*',)), follow=True, ),
## Rule(LinkExtractor(allow=('^file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/[a-zA-Z0-9_-]+/index.html',),\
## deny=(r'^http.*',)), follow=True, ),
Rule(LinkExtractor(allow=('^file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/([a-zA-Z0-9_-]+/){2,}index.html',),\
deny=(r'^http.*',)), follow=False, callback='parse_item' ),
)
#import ipdb; ipdb.set_trace()
def parse_item(self, response):
in2=response.xpath('//div[@class="catalog-age__mod__list js-catalog_mod_list"]')
link_list = in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]')
items = []
for link in link_list:
item = CarmailpriceItem()
# Modification ['320d 184hp xDrive AT']
item['modification'] = link.xpath('.//\
preceding-sibling::div[@class="catalog-age__mod__item__type clear"] \
/div[@class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_title"]/a/text()').extract()
# Modification link to URI
# https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/specifications/?gear_type=204&fuel=59&modification_id=22939"
item['link_to_spec'] = link.xpath('.//\
preceding-sibling::div[@class="catalog-age__mod__item__type clear"] \
/div[@class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_title"]/a/@href').extract()
# Автомат, полный привод, дизель, 7.4 с до 100 км/ч
item['disel'] = link.xpath('.//\
preceding-sibling::div[@class="catalog-age__mod__item__note"]/text()').extract()
# Power [u'184 \u043b.\u0441.']
item['power'] = link.xpath('.//\
preceding-sibling::div[@class="catalog-age__mod__item__type clear"] \
/div[@class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_hp"]/text()').extract()
#name of line... ['Sport Line SKD', 'Modern Line SKD', 'Luxury Line SKD']
item['name_line'] =link.xpath('.//span[1]/text()').extract()
# line Price ['1752000'] from <span class="rank"><i>1</i><i>752</i><i>000</i></span>
item['line_price']=''.join(link.xpath('.//div/span/span[@class="rank"]/i/text()').extract())
# Response URL
item['rurl']= response.url
items.append(item)
return items
Фрагменты выдачи "исправленного" паука
C:\Users\kiss\SkyDrive\Docs\mailru\cars_mail_1\carmailPrice>scrapy crawl line_price_1
2015-02-02 07:36:57+0300 [scrapy] INFO: Scrapy 0.24.4 started (bot: carmailPrice)
2015-02-02 07:36:58+0300 [scrapy] INFO: Optional features available: ssl, http11, boto, django
2015-02-02 07:36:58+0300 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'carmailPrice.spiders', 'SPIDER_MODULES': ['carmai
lPrice.spiders'], 'COOKIES_ENABLED': False, 'DOWNLOAD_DELAY': 0.5, 'BOT_NAME': 'carmailPrice'}
2015-02-02 07:36:58+0300 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2015-02-02 07:37:00+0300 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, RotateUserAge
nt, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, ChunkedTransfer
Middleware, DownloaderStats
2015-02-02 07:37:00+0300 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLe
ngthMiddleware, DepthMiddleware
2015-02-02 07:37:00+0300 [scrapy] INFO: Enabled item pipelines: CarmailpricePipeline
2015-02-02 07:37:00+0300 [line_price_1] INFO: Spider opened
2015-02-02 07:37:00+0300 [line_price_1] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2015-02-02 07:37:00+0300 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6025
2015-02-02 07:37:00+0300 [scrapy] DEBUG: Web service listening on 127.0.0.1:6082
2015-02-02 07:37:00+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/index.html> (refer
er: None)
2015-02-02 07:37:01+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/index.html)
2015-02-02 07:37:01+0300 [line_price_1] DEBUG: Filtered duplicate request: <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars
.mail.ru/catalog/bmw/index.html> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
2015-02-02 07:37:01+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/1/e82/coupe/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:02+0300 [line_price_1] DEBUG: Scraped from <200 file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalo
g/bmw/1/e82/coupe/index.html>
{'disel': [u'\n \u0410\u0432\u0442\u043e\u043c\u0430\u0442,\n \u0437\u0430\u0434\u043d\u0438\u0439\xa0\u043f\u0440\u0438\u04
32\u043e\u0434,\n \u0434\u0438\u0437\u0435\u043b\u044c, 7.8\xa0\u0441\xa0\u0434\u043e\xa0100\xa0\u043a\u043c/\u0447\n '],
'line_price': u'1241800',
'link_to_spec': [u'https://cars.mail.ru/catalog/bmw/1/e82/coupe/specifications/?gear_type=204&fuel=59&modification_id=18798
'],
'modification': [u'120d AT'],
'name_line': [u'\u0411\u0430\u0437\u043e\u0432\u0430\u044f'],
'power': [u'177 \u043b.\u0441.']}
2015-02-02 07:37:02+0300 [line_price_1] DEBUG: Scraped from <200 file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalo
2015-02-02 07:37:11+0300 [line_price_1] DEBUG: Scraped from <200 file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalo
g/bmw/3_gran_turismo/f34/hatchback/index.html>
{'disel': [u'\n \u0410\u0432\u0442\u043e\u043c\u0430\u0442,\n \u043f\u043e\u043b\u043d\u044b\u0439\xa0\u043f\u0440\u0438\u04
32\u043e\u0434,\n \u0431\u0435\u043d\u0437\u0438\u043d, 6.2\xa0\u0441\xa0\u0434\u043e\xa0100\xa0\u043a\u043c/\u0447\n '],
'line_price': u'2283000',
'link_to_spec': [u'https://cars.mail.ru/catalog/bmw/3_gran_turismo/f34/hatchback/specifications/?gear_type=204&fuel=222&mod
ification_id=23681'],
'modification': [u'328i xDrive AT'],
'name_line': [u'\u0411\u0430\u0437\u043e\u0432\u0430\u044f'],
'power': [u'245 \u043b.\u0441.']}
2015-02-02 07:37:11+0300 [line_price_1] DEBUG: Scraped from <200 file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalo
g/bmw/3_gran_turismo/f34/hatchback/index.html>
{'disel': [u'\n \u0410\u0432\u0442\u043e\u043c\u0430\u0442,\n \u043f\u043e\u043b\u043d\u044b\u0439\xa0\u043f\u0440\u0438\u04
32\u043e\u0434,\n \u0431\u0435\u043d\u0437\u0438\u043d, 5.3\xa0\u0441\xa0\u0434\u043e\xa0100\xa0\u043a\u043c/\u0447\n '],
'line_price': u'2543000',
'link_to_spec': [u'https://cars.mail.ru/catalog/bmw/3_gran_turismo/f34/hatchback/specifications/?gear_type=204&fuel=222&mod
ification_id=23683'],
'modification': [u'335i xDrive AT'],
'name_line': [u'\u0411\u0430\u0437\u043e\u0432\u0430\u044f'],
'power': [u'306 \u043b.\u0441.']}
2015-02-02 07:37:12+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/z8/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:12+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/z4_m/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:13+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/z4/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:14+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/z3/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:14+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/x6_m/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:15+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/x6/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:16+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/x5_m/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:16+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/x5/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:16+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/x4/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:17+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/x3/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:18+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/x1/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:18+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/m6/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:19+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/m5/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:19+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/m3/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:20+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/m_coupe/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:21+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/8/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:21+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/7/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:22+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/6_gran_coupe/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:23+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/6_coupe/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:23+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/5_gran_turismo/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:24+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/5/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:25+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/4/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:25+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/3_gran_turismo/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:26+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/3/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:26+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/2/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:27+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/1/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:28+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/2/f23_cabrio/cabrio/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html
)
...
...
2015-02-02 07:37:40+0300 [line_price_1] DEBUG: Crawled (200) <GET file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catal
og/bmw/m6/f12_13/coupe/index.html> (referer: file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalog/bmw/index.html)
2015-02-02 07:37:40+0300 [line_price_1] DEBUG: Scraped from <200 file:///C:/Users/kiss/Desktop/carsmail/carsmail/cars.mail.ru/catalo
g/bmw/m6/f12_13/coupe/index.html>
{'disel': [u'\n \u0410\u0432\u0442\u043e\u043c\u0430\u0442,\n \u0437\u0430\u0434\u043d\u0438\u0439\xa0\u043f\u0440\u0438\u04
32\u043e\u0434,\n \u0431\u0435\u043d\u0437\u0438\u043d, 4.2\xa0\u0441\xa0\u0434\u043e\xa0100\xa0\u043a\u043c/\u0447\n '],
'line_price': u'7005000',
'link_to_spec': [u'https://cars.mail.ru/catalog/bmw/m6/f12_13/coupe/specifications/?gear_type=204&fuel=222&modification_id=
22971'],
'modification': [u'4.4 AT'],
'name_line': [u'\u0411\u0430\u0437\u043e\u0432\u0430\u044f'],
'power': [u'560 \u043b.\u0441.']}
2015-02-02 07:37:40+0300 [line_price_1] INFO: Closing spider (finished)
2015-02-02 07:37:40+0300 [line_price_1] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 29665,
'downloader/request_count': 65,
'downloader/request_method_count/GET': 65,
'downloader/response_bytes': 15185251,
'downloader/response_count': 65,
'downloader/response_status_count/200': 65,
'dupefilter/filtered': 1,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2015, 2, 2, 4, 37, 40, 523000),
'item_scraped_count': 235,
'log_count/DEBUG': 303,
'log_count/INFO': 7,
'request_depth_max': 2,
'response_received_count': 65,
'scheduler/dequeued': 65,
'scheduler/dequeued/memory': 65,
'scheduler/enqueued': 65,
'scheduler/enqueued/memory': 65,
'start_time': datetime.datetime(2015, 2, 2, 4, 37, 0, 647000)}
2015-02-02 07:37:40+0300 [line_price_1] INFO: Spider closed (finished)
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий