2011-03-20 59 views
1

所以我正在尝试读取HTML文件的内容以从特定网站上删除某些元数据。在可可模仿浏览器中发出HTTP请求

但是我遇到的问题是,使用可可库调用在objective-c中执行HTTP请求会给我一个不同的HTML文件,然后当我通过Web浏览器或我执行的python调用执行调用时。

这是令人讨厌的原因是我刮了一个在每个请求上生成的密钥。该网站似乎知道,当我通过可可而不是从python库或从浏览器执行请求时。

任何人都可以对此有所了解吗?

这里是下面的Python代码执行我:

self.url = 'http://sample-site.com/1?ax=1ts=123123.12' 
request = urllib2.Request(complete_url) 
response = urllib2.urlopen(request) 
html_data = response.read() 

这里是下面的可可尝试我试过:

  1. NSString * completeUrl = [url stringByAppendingFormat:@"//%d?ax=1&ts=%1.2f", pageNumber, time];

  2. 的另一种尝试:

    NSMutableURLRequest* request = [[[NSMutableURLRequest alloc] initWithURL:hypeURL] autorelease]; 
        [request setValue:userAgent forHTTPHeaderField:@"User-Agent"]; 
        NSURLResponse* response = nil; 
        NSError* error = nil; 
        NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
        NSString *hypeHTML = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
    

可可的尝试正在检索HTML,但HTML包含的关键值我分析了每次刷新时生成的关键值。然而,在使用cocoa执行请求时,每次执行应用程序时键值都不会改变(HTML中的键值相同),在Python中,HTML正确地为每个请求使用不同的键。

感谢

+0

请看看这篇博客我写的描述了这个问题:http://www.fzakaria.com/2011/03/hypemachine-cocoa-woes/ – Setheron 2011-03-23 18:30:53

回答

3

网站可能检测到用户代理和返回基于其不同的内容。
简单地改变用户代理在请求头:

NSString* userAgent = @"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20051111 Firefox/1.5 BAVM/1.0.0"; 
NSURL* url = [NSURL URLWithString:@"http://www.stackoverflow.com/"]; 
NSMutableURLRequest* request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease]; 
[request setValue:userAgent forHTTPHeaderField:@"User-Agent"]; 
NSURLResponse* response = nil; 
NSError* error = nil; 
NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString *result = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
NSLog(@"%@",result); 

有了这个代码,服务器认为你是在Linux :)

获取当前用户代理/查找运行Firefox用户代理为特定的浏览器:
http://www.useragentstring.com/

+0

不似乎已经做到了......他们有没有其他的方法可以搞清楚? – Setheron 2011-03-21 00:27:18

+0

除了一些特定的JavaScript/AJAX技巧之外,服务器没有其他方式来检测浏览器。上面的代码应该正常工作。也许该网站使用AJAX来更新页面?在这种情况下,NSURLConnection返回的东西当然不同于浏览器中的“查看源代码”选项。 – Anne 2011-03-21 17:25:49

+0

他们正在使用Ajax更新页面。那么NSURLConnection会检索那么什么呢?因为它仍然正确地解析页面(我为源代码中的特定标识符(例如id,key等)进行regexing。)。我将使用更全面的信息编辑我的原始文章 – Setheron 2011-03-21 18:06:09

相关问题