在使用几种不同的方式来提取网站数据之后,我开发了这个简单快速的解决方案,看起来效果很好:
int zip = 13153;
int lowerBound = 10000;
int upperBound = 99999;
bool foundValidZip;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
while (foundValidZip == false) {
zip = lowerBound + arc4random() % (upperBound - lowerBound);
// Do any additional setup after loading the view, typically from a nib.
NSString *urString = [NSString stringWithFormat:@"http://www.zip-info.com/cgi-local/zipsrch.exe?zip=%i&Go=Go",zip];
NSURL *URL = [NSURL URLWithString:urString];
NSData *data = [NSData dataWithContentsOfURL:URL];
// Assuming data is in UTF8.
NSString *html = [NSString stringWithUTF8String:[data bytes]];
NSLog(@"%@",html);
NSMutableArray *names = [self stringsBetweenString:@"</th></tr><tr><td align=center>" andString:@"</font></td>" andText:html];
NSMutableArray *states = [self stringsBetweenString:@"</font></td><td align=center>" andString:@"</font></td><td align=center>" andText:html];
if ([names count] > 0 && [states count] > 0) {
NSString *name = [names objectAtIndex:0];
NSString *state = [states objectAtIndex:0];
self.nameLabel.text = name;
self.stateLabel.text = state;
self.zipLabel.text = [NSString stringWithFormat:@"%i",zip];
foundValidZip = true;
}
else {
foundValidZip = false;
}
}
}
-(NSMutableArray*)stringsBetweenString:(NSString*)start andString:(NSString*)end andText:(NSString*)text {
NSMutableArray* strings = [NSMutableArray arrayWithCapacity:0];
NSRange startRange = [text rangeOfString:start];
for( ;; )
{
if (startRange.location != NSNotFound)
{
NSRange targetRange;
targetRange.location = startRange.location + startRange.length;
targetRange.length = [text length] - targetRange.location;
NSRange endRange = [text rangeOfString:end options:0 range:targetRange];
if (endRange.location != NSNotFound)
{
targetRange.length = endRange.location - targetRange.location;
[strings addObject:[text substringWithRange:targetRange]];
NSRange restOfString;
restOfString.location = endRange.location + endRange.length;
restOfString.length = [text length] - restOfString.location;
startRange = [text rangeOfString:start options:0 range:restOfString];
}
else
{
break;
}
}
else
{
break;
}
}
NSLog(@"%@",strings);
return strings;
}
基本上,这样做的是查询查找与邮政编码相关联的城市的网站,然后获取随机邮政编码的HTML。然后,程序通过在一组独特的前端和后端之间搜索文本来从该HTML数据中提取特定的信息位。我已经使用了这个&#34; cap&#34;一些其他示例应用程序的方法。其中一些实际上并不查询网站,而是从经常更新的静态URL中获取数据。我在这里可以看到的唯一缺陷之一是,如果HTML发生变化,这可能无效。但除此之外,它似乎工作得非常好并且非常快。在我发布我的任何应用程序之前,我想确保大量查询不会损坏网站,或者我和网站管理员都有其他不利之处。这样可以吗?还有更好的选择吗? (不是出于这个特定目的 - 邮政编码 - 但仅限于拉动)
答案 0 :(得分:1)
您正在做的事情称为抓取网站/页面。这是一种通用的方法,但不是理想的方法,并且存在许多陷阱......
一般来说,您最好不要在应用内部使用任何抓取代码,因为如果网站发生变化并且您需要更新,您的应用将需要很长时间才能更改并重新部署到商店。
因此,最好让自己的服务器进行抓取,然后将“已消毒”版本的数据提供给应用,或使用可重新配置的第三方服务(如Kimono,I从来没有使用它,但网站是丰富多彩的)从细节中抽象你的应用程序。
对于用户而言,您的应用/服务就像普通用户一样,因此网站需要能够处理一般用户数量。
如果您不与所涉及的网站建立关系,我同意@ paulw11关于合法性的评论 - 您应该与他们建立关系......