2015-07-05 6 views
0

Я пытаюсь использовать Scrapy для царапин - www.paytm.com. На веб-сайте используются запросы AJAX, в виде XHR для отображения результатов поиска.Scrapy Scraper Issue

Мне удалось отследить XHR, и ответ AJAX ПОМОЩИ JSON, но на самом деле это не JSON.

Это ссылка на один из запросов XHR - https://search.paytm.com/search/?page_count=2&userQuery=tv&items_per_page=30&resolution=960x720&quality=high&q=tv&cat_tree=1&callback=angular.callbacks._6. Если вы правильно видите URL-адрес, параметр - page_count - отвечает за показ разных страниц результатов, а параметр - userQuery - отвечает за поисковый запрос, который передается на веб-сайт.

Теперь, если вы видите ответ правильно. На самом деле это не JSON, он похож на JSON (я его оформил на http://jsonlint.com/). Я хочу очистить это, используя SCRAPY (SCRAPY только потому, что, поскольку это фреймворк, он будет быстрее, чем использование других библиотек, таких как BeautifulSoup, потому что использование их для создания скребка, который сбрасывается с такой высокой скоростью, потребует много усилий - это единственная причина, по которой я хочу использовать Scrapy.).

Теперь это мой фрагмент кода, который я использовал для извлечения JSON ответ из URL -:

jsonresponse = json.loads(response.body_as_unicode()) 
    print json.dumps(jsonresponse, indent=4, sort_keys=True) 

На выполнение кода, он бросает мне stating- ошибки:

2015-07-05 12:13:23 [scrapy] INFO: Scrapy 1.0.0 started (bot: scrapybot) 
2015-07-05 12:13:23 [scrapy] INFO: Optional features available: ssl, http11 
2015-07-05 12:13:23 [scrapy] INFO: Overridden settings: {'DEPTH_PRIORITY': 1, 'SCHEDULER_MEMORY_QUEUE': 'scrapy.squeues.FifoMemoryQueue', 'SCHEDULER_DISK_QUEUE': 'scrapy.squeues.PickleFifoDiskQueue', 'CONCURRENT_REQUESTS': 100} 
2015-07-05 12:13:23 [scrapy] INFO: Enabled extensions: CloseSpider, TelnetConsole, LogStats, CoreStats, SpiderState 
2015-07-05 12:13:23 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats 
2015-07-05 12:13:23 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware 
2015-07-05 12:13:23 [scrapy] INFO: Enabled item pipelines: 
2015-07-05 12:13:23 [scrapy] INFO: Spider opened 
2015-07-05 12:13:23 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2015-07-05 12:13:23 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
2015-07-05 12:13:24 [scrapy] DEBUG: Crawled (200) <GET https://search.paytm.com/search/?page_count=2&userQuery=tv&items_per_page=30&resolution=960x720&quality=high&q=tv&cat_tree=1&callback=angular.callbacks._6> (referer: None) 
2015-07-05 12:13:24 [scrapy] ERROR: Spider error processing <GET https://search.paytm.com/search/?page_count=2&userQuery=tv&items_per_page=30&resolution=960x720&quality=high&q=tv&cat_tree=1&callback=angular.callbacks._6> (referer: None) 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 577, in _runCallbacks 
    current.result = callback(current.result, *args, **kw) 
    File "Startup App/SCRAPERS/paytmscraper_scrapy/paytmspiderscript.py", line 111, in parse 
    jsonresponse = json.loads(response.body_as_unicode()) 
    File "/usr/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/json/decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 
2015-07-05 12:13:24 [scrapy] INFO: Closing spider (finished) 
2015-07-05 12:13:24 [scrapy] INFO: Dumping Scrapy stats: 
{'downloader/request_bytes': 343, 
'downloader/request_count': 1, 
'downloader/request_method_count/GET': 1, 
'downloader/response_bytes': 6483, 
'downloader/response_count': 1, 
'downloader/response_status_count/200': 1, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2015, 7, 5, 6, 43, 24, 733187), 
'log_count/DEBUG': 2, 
'log_count/ERROR': 1, 
'log_count/INFO': 7, 
'response_received_count': 1, 
'scheduler/dequeued': 1, 
'scheduler/dequeued/memory': 1, 
'scheduler/enqueued': 1, 
'scheduler/enqueued/memory': 1, 
'spider_exceptions/ValueError': 1, 
'start_time': datetime.datetime(2015, 7, 5, 6, 43, 23, 908135)} 
2015-07-05 12:13:24 [scrapy] INFO: Spider closed (finished) 

Теперь, мой вопрос, как мне очистить такой ответ с помощью Scrapy? Если требуется какой-либо другой код, не стесняйтесь спрашивать в комментариях. Я охотно отдам его!

Просьба представить весь код, связанный с этим. Это было бы хорошо оценено! Может быть, некоторые манипуляции с JSON Response (от python) (как и сравнение строк) также будут работать для меня, если это поможет мне очистить это!

P.S: Я не могу изменять ответ JSON вручную (используя руку) каждый раз, потому что это ответ, который дается веб-сайтом. Итак, предложите программный (питонический) способ сделать это. Предпочтительно, я хочу использовать Scrapy в качестве моей рамки.

ответ

3

Если вы посмотрите на результат не-JSON, то ясно, что он содержит JSON.

Если вы удалите из ответа начальную часть typeof angular.callbacks._6 === "function" && angular.callbacks._6( и );, в конце вы получите действительный JSON, который вы можете проверить с помощью JSONLint.

В конечном счете решение найти первое и последнее появление { и } соответственно, в ответ и извлечь текст внутри (включая те фигурные скобки) и использовать его с json.loads вместо всего результата.

+0

Не нужно вручную извлекать JSON. Просто удалите '& callback = angular.callbacks._6' из запроса – 3zzy

0

Изменение:

https://search.paytm.com/search/?page_count=2&userQuery=tv&items_per_page=30&resolution=960x720&quality=high&q=tv&cat_tree=1&callback=angular.callbacks._6 

к:

https://search.paytm.com/search/?page_count=2&userQuery=tv&items_per_page=30&resolution=960x720&quality=high&q=tv&cat_tree=1 

.. и у вас есть JSON.

2

Paytm предоставляет данные в формате JSON, пожалуйста, проверьте

https://catalog.paytm.com/v1//g/electronics/mobile-accessories/mobiles

Страницы каталога возвращают .json данные, которые состоят название продукта, URL продукта, цена предложения, фактическая цена и данные изображения и т.д ..

Как получить данные по категории:

В приведенном выше URL-адресе вы можете увидеть catalog.paytm.com/v1//g/, свой общий для всех URL-адресов, вам необходимо заменить другие части URL-адреса в следующем формате.

пункт меню> категория> подкатегория.

где Электроника - это пункт меню, а мобильные аксессуары - это категория, а мобильные устройства - подкатегория мобильных аксессуаров.

Когда вы запустите URL-адрес в вышеуказанном формате, paytm вернет данные json, вы можете запросить paytm для большего количества страниц со следующими параметрами.

PAGE_COUNT и items_per_count

пример: catalog.paytm.com/v1//g/electronics/mobile-accessories/mobiles?page_count=2 & items_per_count = 30

в JSon поиска данных для grid_layout, если он недоступен, страница не имеет элементов, вы можете выйти из цикла, иначе обработать данные json и прочитать сведения о продукте.