0

我正在对网页进行多层次的解析,我使用一页中的信息进行深入分析并抓取“较低”页面进行解析。当我到达我的层次结构的最低级别时,我不再点击新页面,我基本上点击相同的页面(使用不同的参数)并创建 SQL 数据库条目。

如果我不放慢速度(通过在内部循环之前放置一个 sleep(1)),initWithContentsOfURL 最终会返回一种 HTML 存根。这是我用来获取 HTML 节点的代码:

    NSError *err = nil;
    NSString* webStringURL = [sURL stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    NSData *contentData = [[[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: webStringURL] 
                                                         options: 0 
                                                           error: &err] autorelease];   
    NSString *dataString = [[[NSString alloc] initWithData: contentData
                                                  encoding: NSISOLatin1StringEncoding] autorelease];    
    NSData *data = [dataString dataUsingEncoding: NSUTF8StringEncoding];
    TFHpple *xPathDoc = [[[TFHpple alloc] initWithHTMLData: data] autorelease]; 

它适用于 4 级循环。在传真中,它可以 24/7 全天候运行,没有真正的内存泄漏问题。只有当我遇到连接问题时它才会死机。只要我在最里面的循环之前放入 sleep(1) 。

好像太快了,initWithContentsOfURL 跟不上。我想我可以尝试做一些异步的事情,但这不是为了用户消费,直接同步循环工作得很好......几乎。我尝试了不同的方法来减慢速度。定期暂停一秒钟是可行的,但如果我把它拿出来,它会在通过内部循环大约 10 次后开始获取虚假数据。有没有办法正确处理这个问题?

4

1 回答 1

1

我不认为这是一个问题initWithContentsOfURL;相反,我怀疑是服务器或网络无法快速响应。

以下假设是这种情况。

如果你想接收网络错误和/或服务器响应错误,你需要使用NSURLConnection。无法从initWithContentsOfURL. 如果您知道什么是存根页面,或者您知道成功响应中的魔术字符串,您可以NSData对照这些检查返回的内容。

于 2010-10-06T01:40:49.500 回答