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

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


person HjySix    schedule 08.11.2011    source источник
comment
Scrapy основан на Python, пока Htmlunit не основан на Java. Scrapy может обрабатывать Javascript, работающий с заставкой, см. blog.scrapinghub.com/2015/03/02/   -  person siomes    schedule 20.07.2016


Ответы (2)


Для обработки страниц с помощью javascript вы можете использовать Webkit или Selenium.

Вот несколько фрагментов с сайта snippets.scrapy.org:

Визуализация/интерактивный JavaScript с помощью gtk/webkit/jswebkit

Визуализированный сканер Javascript с помощью Scrapy и Selenium RC

person reclosedev    schedule 17.11.2011
comment
Большое спасибо, они могут быть полезны для меня. - person HjySix; 22.11.2011

Вот рабочий пример использования безголового веб-драйвера selenium и phantomjs в промежуточном программном обеспечении обработчика загрузки.

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

настройки.py:

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

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

middleware = set([])

включить промежуточное ПО:

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

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

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

Ваше здоровье!

person rocktheartsm4l    schedule 23.06.2014