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

суббота, 31 января 2015 г.

Особенности краулера carMailPrice Scrapy и все ссылки для написания Спайдера

Код для этого краулера я писал урывками. Надо было понять 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, то чуть не пропустил серьезную ошибку. Ниже код с ошибкой.

Код неправильного паука с ошибкой

In [2]:
%load "C:\\Users\\kiss\\SkyDrive\\Docs\\mailru\\cars_mail_1\\carmailPrice\\carmailPrice\\spiders\\price_1_0.py"
In []:
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 

Спайдер бойко парсил страницу и выдавал на экран поток из списков вроде этого:

In []:
 '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'],

Во всех списках для каждой модификации (страницы) количество элементов совпадало, и только один список был в три раза длиннее, так парсились вот эти теги:

In []:
<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

In []:
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, потому будем двигаться последовтельно и отложим этот "более сложный вариант" для следующих спайдеров.

И вот "руки дошли" до главной ошибки, благодаря ей я "постиг" механизм итераций. ...Правильнее, конечно, было бы написать, не "постиг", а сформировал первый (черновой) вариант модели итераций. Но модет быть это и называется "постиг". Было пустое место, а теперь есть на что опереться?

Фрагменты и итерации на странице.

А если со страницы мне нужно вырезать изрядное количество фрагментов? Мне нужен итератор. Пока у меня только формируется понимание того, как лучше использовать итераторы. Наверное, поэтому я стремлюсь упростить итераторы и усложнить запросы?

Текст выше я написал еще до выявления ошибки, видно, что я намеревался отложить "постижение" итераций в должгий ящик.

Механизм итераций

  1. Объект 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, в котором содержится вся информация обо всех моделях на странице, потому мы сразу и получаем все данные

In []:
'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'],
In []:
2. Так зачем же мы делаем это внутри цикла?
In []:
for link in link_list:

Это уже лишнее занятие. Получается, что я повторяю одну и ту же команду и каждый раз переприсваиваю один и тот же список. Ошибка, конечно, детская..., но выводы полезные

In []:
3. Метод  XPath выдает список, который сразу можно присвоить элементу словаря списков MyItem
In []:
4. Присвоение внутри цикла нужно только, чтобы избежать сбоев-сдвигов ...Например, между списком наименований и списком цен. 

Теоретически можно организовать парсинг без цикла и контролирвать количество элементов в каждом списке, но что делать при рассоглавовании? Проще в цикле заполнить пустые места пустыми элементами и обеспечить еданое индексирование.

  1. Раньше я полагал, что, испоьзуя метод .xpath, мы вырезаем из страницы (DOM)определенные куски, потом, повторно испоьзуя .xpath, мы вырыезаем фрагменты из этих кусков. Это неправильно.
    Слово "вырезаем" здесь не подходит.
In []:
        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. Правильнее было бы использовать метафору 'ссылка на "селектор"'

In []:
6. Надо помнить, что .// означает self, а ..// parent. А я все время забываю ставить точки...

Код исправленного паука

In [4]:
%load "C:\\Users\\kiss\\SkyDrive\\Docs\\mailru\\cars_mail_1\\carmailPrice\\carmailPrice\\spiders\\price_1_1.py"
In []:
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&amp;fuel=59&amp;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

Фрагменты выдачи "исправленного" паука

In []:
C:\Users\kiss\SkyDrive\Docs\mailru\cars_mail_1\carmailPrice>scrapy crawl line_price_1
In []:
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
In []:
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.']}
In []:
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
)
In []:
...
...
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)


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

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

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