簡體   English   中英

如何結合scrapy和htmlunit用javascript抓取網址

[英]How to combine scrapy and htmlunit to crawl urls with javascript

我正在研究Scrapy來抓取頁面,但是,我無法使用javascript處理這些頁面。 人們建議我使用htmlunit,所以我安裝了它,但我根本不知道如何使用它。任何人都可以給我一個例子(scrapy + htmlunit)嗎? 非常感謝。

要使用javascript處理頁面,您可以使用Webkit或Selenium。

這里有一些來自snippets.scrapy.org的片段

使用gtk / webkit / jswebkit渲染/交互式javascript

使用Scrapy和Selenium RC渲染Javascript爬蟲

這是一個在下載處理程序中間件中使用selenium和phantomjs無頭webdriver的工作示例。

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

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM