网页抓取解密(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)

优采云 发布时间: 2021-11-28 09:05

  网页抓取解密(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)

  如果给你一个网页链接来抓取特定内容,比如豆瓣电影排名,怎么做?

  其实网页内容的结构和XML很相似,那么我们可以通过解析XML来解析HTML,但是两者的差距还是很大的,好吧,废话不多说,我们开始解析HTML。

  然后有很多用于解析 XML 的库。这里我们选择libxml来解析,因为libxml是C语言接口,我找了一个library-hpple,用objective-c来封装接口。它的地址是,然后网页使用豆瓣电影排名。地址是。

  接下来,构建一个新项目。项目使用ARC,引入libxml2和hpple库,新建实体类movie。完整的项目结构如下:

  

  movie的实现如下,这是一个实体类,根据爬取的网页内容确定

  电影.h

  @interface Movie : NSObject

@property(nonatomic, strong) NSString *name;

@property(nonatomic, strong) NSString *imageUrl;

@property(nonatomic, strong) NSString *descrition;

@property(nonatomic, strong) NSString *movieUrl;

@property(nonatomic) NSInteger ratingNumber;

@property(nonatomic, strong) NSString *comment;

@end

  所以最重要的部分在这里。不管网页的内容是什么,我们都需要先获取网页的内容。下面是通过NSURLConnection获取整个网页的内容。

  - (void)loadHTMLContent

{

NSString *movieUrl = MOVIE_URL;

NSString *urlString = [movieUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString:urlString];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

__weak ViewController *weak_self = self;

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

if (nil == error) {

// NSString *retString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

// NSLog(@"%@", retString);

[weak_self parserHTML:data];

}

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

}];

}

  这里只是简单的访问web内容,一些HTTP和错误处理本文没有讨论,所以这里的代码比较简单,上面代码中有一个parserHTML:方法,就是解析获取到的web内容和解析网页内容之前,我们先拆解xpath。

  假设一个简单的网页内容如下:

  

 

    Some webpage

 

 

    <p class=”normal”>This is the first paragraph

   

  This is the second paragraph. This is in bold.

   </p>

  比如要获取title的内容,那么xpath表达式就是/html/head/title。如果要获取class="special"节点的内容,xpath为/html/body/p[@class=\'special\']。

  所以只要找到合适的xpath,就会得到对应的节点内容,接下来我们看看用hpple解析HTML

  - (void)parserHTML:(NSData *)data

{

if (nil != data) {

TFHpple *movieParser = [TFHpple hppleWithHTMLData:data];

NSString *movieXpathQueryString = @"/html/body/div[@id=\'wrapper\']/div[@id=\'content\']/div[@class=\'grid-16-8 clearfix\']/div[@class=\'article\']/div[@class=\'indent\']/table/tr/td/a[@class=\'nbg\']";

NSArray *movieNodes = [movieParser searchWithXPathQuery:movieXpathQueryString];

for (TFHppleElement *element in movieNodes) {

Movie *m = [[Movie alloc] init];

m.name = [element objectForKey:@"title"];

m.movieUrl = [element objectForKey:@"href"];

for (TFHppleElement *child in element.children) {

if ([child.tagName isEqualToString:@"img"]) {

@try {

m.imageUrl = [child objectForKey:@"src"];

}

@catch (NSException *exception) {

}

}

}

[self.movies addObject:m];

}

[self.movieTableView reloadData];

}

}

  在代码中,找到首页对应节点的路径,然后searchWithXPathQuery得到一个数组。遍历组织数据后,可以在表格视图中显示。具体效果如下:

  

  好了,网页的内容已经抓到了,实际的项目比这个复杂,所以,这只是一个指导性的例子。

  参考:

  注:本文为小涵原创,请支持原创!转载请附上原文链接:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线