2013-07-21 2 views
1

Извините, если вопрос глуп, но я не смог найти ответ.объект ответа в scrapy не завершен

Я пытаюсь подготовить скрипт для извлечения данных из веб-сайта с помощью команды «SCRAPY оболочки»:

  • с помощью веб-браузера, входящего в URL (например, «http://www.testsite.com/data_to_extract»), я получаю данные извлекать. Страница содержит статические данные + динамические данные.

  • Используя команду «scrapy shell http://www.testsite.com/data_to_extract», а затем выдавая команду («view (response)»), я вижу в веб-браузере статические данные страницы, но не динамические данные.

Я подозреваю, что веб-сервер сначала обслуживает статические данные, а затем заполняет динамические данные на странице. Я предполагаю, что это управляется через javascript на веб-странице.

Если мое понимание верное, то, что должно произойти, заключается в том, что scrapy нужно немного подождать, прежде чем возвращать результат.

Не мог бы кто-нибудь помочь мне здесь?

Спасибо!

+0

Scrapy даст то, что вы можете видеть в команде просмотра «браузер» браузера, не обязательно то, что вы видите, интерпретируемое в окне вашего браузера. Scrapy не понимает Javascript, поэтому не AJAX-вызовы, не магия jQuery ... Так что никаких динамических данных. Вы можете посмотреть активность сети с помощью инструментов разработчика браузера и попытаться имитировать вызовы Javascript/AJAX с помощью нового Scrapy Request() для извлечения дополнительного контента, но может быть трудно подражать реальному браузеру с помощью Scrapy. –

+0

Вы также можете посмотреть https : //github.com/scrapinghub/scrapyjs –

ответ

0

Настоящий рабочий пример с использованием селена и phantomjs headless webdriver в промежуточном программном обеспечении загрузчика.

class JsDownload(object): 

@check_spider_middleware 
def process_request(self, request, spider): 
    driver = webdriver.PhantomJS(executable_path='D:\phantomjs.exe') 
    driver.get(request.url) 
    return HtmlResponse(request.url, encoding='utf-8', body=driver.page_source.encode('utf-8')) 

Я хотел способность сказать различные пауки, которые промежуточного слоя использовать так я реализовал эту обертку:

def check_spider_middleware(method): 
@functools.wraps(method) 
def wrapper(self, request, spider): 
    msg = '%%s %s middleware step' % (self.__class__.__name__,) 
    if self.__class__ in spider.middleware: 
     spider.log(msg % 'executing', level=log.DEBUG) 
     return method(self, request, spider) 
    else: 
     spider.log(msg % 'skipping', level=log.DEBUG) 
     return None 

return wrapper 

settings.py:

DOWNLOADER_MIDDLEWARES = {'MyProj.middleware.MiddleWareModule.MiddleWareClass': 500} 

для обертки, чтобы работать все пауки должны имеют как минимум:

middleware = set([]) 

включать промежуточное программное обеспечение:

middleware = set([MyProj.middleware.ModuleName.ClassName]) 

Вы могли бы реализовать это в запросе обратного вызова (в пауке), а затем запрос HTTP будет происходить в два раза. Это не полное доказательство, но оно работает для вещей, которые загружаются на .ready(). Если вы потратите некоторое время на чтение в селен, вы можете дождаться запуска определенного события перед сохранением источника страницы.

Другой пример: https://github.com/scrapinghub/scrapyjs

Ура!

Смежные вопросы