Как объединить scrapy и htmlunit для сканирования URL с помощью JavaScript - PullRequest
12 голосов
/ 08 ноября 2011

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

Ответы [ 2 ]

13 голосов
/ 17 ноября 2011

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

Вот некоторые фрагменты из snippets.scrapy.org :

Предоставлено / интерактивноjavascript с помощью gtk / webkit / jswebkit

Предоставленный сканер Javascript со скрапом и селеном RC

1 голос
/ 23 июня 2014

Вот рабочий пример использования безголового веб-драйвера 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

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

Приветствия!

...