【问题标题】:How to combine scrapy and htmlunit to crawl urls with javascript如何结合scrapy和htmlunit用javascript抓取url
【发布时间】:2011-11-08 08:25:50
【问题描述】:

我正在使用 Scrapy 来抓取页面,但是,我无法使用 javascript 处理页面。 人们建议我使用 htmlunit,所以我安装了它,但我根本不知道如何使用它。任何人都可以给我一个例子(scrapy + htmlunit)吗?非常感谢。

【问题讨论】:

标签: javascript htmlunit scrapy


【解决方案1】:

要使用 javascript 处理页面,您可以使用 Webkit 或 Selenium。

这里有一些来自 sn-ps.scrapy.org 的 sn-ps:

Rendered/interactive javascript with gtk/webkit/jswebkit

Rendered Javascript Crawler With Scrapy and Selenium RC

【讨论】:

  • 非常感谢,他们可能对我有帮助。
【解决方案2】:

这是一个在下载处理程序中间件中使用 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

干杯!

【讨论】:

    猜你喜欢
    • 2022-12-07
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多