Как объединить scrapy и htmlunit для сканирования URL-адресов с помощью javascript

Я работаю над Scrapy для сканирования страниц, однако я не могу обрабатывать страницы с помощью javascript. Люди предлагают мне использовать htmlunit, поэтому я установил его, но я не знаю, как его использовать. Любой может дать мне пример (scrapy + htmlunit)? Большое спасибо.

Ответ 2

Ниже приведен рабочий пример использования selenium и 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])

Основным преимуществом его реализации, а не пауком, является то, что вы делаете только один запрос. В решении, например, в reclosedev второй ссылке: обработчик загрузки обрабатывает запрос, а затем передает ответ от паука. Затем паук делает новый запрос в этой функции parse_page. Это два запроса на один и тот же контент.

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

Ура!