2011-11-08 18 views
12

Tôi đang làm việc để thu thập dữ liệu các trang, tuy nhiên, tôi không thể xử lý các trang bằng javascript. Mọi người đề nghị tôi sử dụng htmlunit, vì vậy tôi đã cài đặt nó, nhưng tôi không biết làm thế nào để sử dụng nó ở all.Dose bất cứ ai có thể cho một ví dụ (scrapy + htmlunit) cho tôi? Cảm ơn rất nhiều.Làm cách nào để kết hợp các mẩu tin lưu niệm và htmlunit để thu thập thông tin url bằng javascript

+0

Phế liệu dựa trên Python, cho đến khi Htmlunit dựa trên Java. Phế liệu có thể xử lý Javascript làm việc với splash, xem https://blog.scrapinghub.com/2015/03/02/handling-javascript-in-scrapy-with-splash/ – siomes

Trả lời

1

Dưới đây là một ví dụ làm việc sử dụng selen và phantomjs webdriver không đầu trong một middleware tải xử lý.

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

Tôi muốn khả năng nói nhện khác nhau mà middleware để sử dụng vì vậy tôi thực hiện wrapper này:

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} 

cho wrapper để làm việc tất cả các nhện phải có tối thiểu:

middleware = set([]) 

để bao gồm phần mềm trung gian:

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

Ưu điểm chính để thực hiện theo cách này chứ không phải trong nhện là bạn chỉ thực hiện một yêu cầu. Trong giải pháp tại liên kết thứ hai của reclosedev chẳng hạn: Trình xử lý tải xuống xử lý yêu cầu và sau đó đưa ra phản hồi cho nhện. Con nhện sau đó đưa ra một yêu cầu hoàn toàn mới trong hàm parse_page của nó - Đó là hai yêu cầu cho cùng một nội dung.

Ví dụ khác: https://github.com/scrapinghub/scrapyjs

Chúc mừng!

Các vấn đề liên quan