2011-11-08 16 views
12

Estoy trabajando en Scrapy para rastrear páginas, sin embargo, no puedo manejar las páginas con javascript. La gente me sugiere que use htmlunit, así que lo tengo instalado, pero no sé cómo usarlo. ¿Alguien puede dar un ejemplo (scrapy + htmlunit) para mí? Muchas gracias.Cómo combinar scrapy y htmlunit para rastrear URL con javascript

+0

Scrapy está basado en Python, hasta que Htmlunit se basa en Java. Scrapy puede manejar Javascript trabajando con splash, consulte https://blog.scrapinghub.com/2015/03/02/handling-javascript-in-scrapy-with-splash/ – siomes

Respuesta

1

Aquí es un ejemplo de trabajo utilizando el selenio y PhantomJS WebDriver sin cabeza en un middleware descarga manejador.

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')) 

Quería capacidad para contar diferentes arañas, que el middleware de usar por lo que he implementado este contenedor:

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} 

de envoltura para trabajar todas las arañas deben tener como mínimo:

middleware = set([]) 

para incluir un middleware:

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

La principal ventaja de la implementación de esta manera en lugar de en la araña es que sólo termina haciendo una petición. En la solución en el segundo enlace de reclosedev, por ejemplo: el controlador de descargas procesa la solicitud y luego entrega la respuesta a la araña. La araña luego realiza una nueva solicitud en su función parse_page: son dos solicitudes para el mismo contenido.

Otro ejemplo: https://github.com/scrapinghub/scrapyjs

Salud!

Cuestiones relacionadas