2017-09-05 36 views
0

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

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

time.clock只测量Windows上的wallclock时间(奇怪)。使用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) 

我省略了正确的URL分辨率(即,处理在IMG SRC相关链接),并没有实际测试过这一点。它可能有许多错误,但希望清楚这个想法。

+0

感谢time.clock,我只需要加载标签,所以他们的地址不能反馈给Twisted代理,有关它的任何解决方法?我宁愿不在我的代码中实现一个新的库,所以使用scrapy并不是我想要的,我寻找一种解决方案来单独处理Twisted和Python。 – DeFoG

+1

如果你不想使用scrapy,你需要做一些事情来解析html,找到img标签,解释它们的来源,并发出新的'Agent.request'调用。 Twisted中没有任何内容会为你做这个链接。 Twisted中也没有真正的html解析器。在stdlib中有一个很老的,不太好的,但我真的推荐你使用'html5lib',它实现了html5规范,并且这是目前解析html的唯一理智方式。 –