Я работаю над Scrapy для сканирования страниц, однако я не могу обрабатывать страницы с помощью javascript. Люди предлагают мне использовать htmlunit, поэтому я установил его, но я вообще не знаю, как его использовать. Кто-нибудь может привести пример (scrapy + htmlunit) для меня? Большое спасибо.
Как объединить scrapy и htmlunit для сканирования URL-адресов с помощью javascript
Ответы (2)
Для обработки страниц с помощью javascript вы можете использовать Webkit или Selenium.
Вот несколько фрагментов с сайта snippets.scrapy.org:
Визуализация/интерактивный JavaScript с помощью gtk/webkit/jswebkit
Визуализированный сканер Javascript с помощью Scrapy и Selenium RC
Вот рабочий пример использования безголового веб-драйвера 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.
Ваше здоровье!