Twisted HTTP客户端下载整个页面并测量下载时间

时间:2017-09-05 15:57:35

标签: http twisted

我尝试使用Twisted Agent来实现HTTP客户端并下载特定URL的完整网页,最后测量该特定网页的加载时间。不幸的是,我提出的代码并没有遵循HTML标签中的内部URL,所以在从浏览器上的其他网站下载某些内容后需要10秒才能完全加载的网页将花费不到一秒的时间在我的代码中完全加载,这表明我的代码不正确!即使我使用BrowserLikeRedirectAgent和RedirectAgent,结果也是一样的。任何评论都表示赞赏。

def init_http(url):
    userAgent = 'Twisted/%s (httpclient.py)' % (version.short(),)
    agent = BrowserLikeRedirectAgent(Agent(reactor))

    def response_time_calculator(test,t1):
        end_time = time.time()
        response_time = end_time - t1
        print ("Got the Whole page in:  ", response_time)

    start_time = time.time()

    d = agent.request(
        b'GET', str(url), Headers({'user-agent': [userAgent]}))
    def cbResponse(response):
        if response.length is not UNKNOWN_LENGTH:
            print('The response body will consist of', response.length, 'bytes.')
        else:
            print('The response body length is unknown.')
        d = readBody(response)
        d.addCallback(response_time_calculator, start_time)
        return d
    d.addCallback(cbResponse)

1 个答案:

答案 0 :(得分:1)

time.clock仅测量Windows上的挂钟时间(奇怪)。使用time.time测量所有平台上的挂钟时间。

此外,您必须实现您关注链接的部分。 Agent.request完全下载您请求的资源。如果该资源是带有指向其他资源的链接的HTML,则必须解析数据,提取链接并遵循它们。

您可能希望了解scrapy。如果没有,您可以添加一个稍小(功能较少)的依赖项,如html5lib。类似的东西:

    d = readBody(response)
    d.addCallback(load_images)
    d.addCallback(response_time_calculator, start_time)

...

from twisted.internet.defer import gatherResults
import html5lib

def load_images(html_bytes):
    image_requests = []
    doc = html5lib.parse(html_bytes)
    for img in doc.xpath("//img"):
        d = agent.request(img.src)
        d.addCallback(readBody)
        image_requests.append(d)
    return gatherResults(image_requests)

我已经省略了正确的网址解析(即处理img src中的相对链接)并且实际上没有对此进行测试。它可能有很多错误,但希望明确这个想法。