精华内容
下载资源
问答
  • 怎样抓取网页内容

    2013-07-21 16:21:00
    如果给你一个网页链接, 来抓取指定的内容, 比如豆瓣电影排行榜, 那要怎样才能做到了? 其实网页内容的结构很是类似于XML, 那么我们就可以用解析XML的方式来解析HTML, 不过两者之间的差距还是很大的, 好了, 废话不多说...

    如果给你一个网页链接, 来抓取指定的内容, 比如豆瓣电影排行榜, 那要怎样才能做到了?

    其实网页内容的结构很是类似于XML, 那么我们就可以用解析XML的方式来解析HTML, 不过两者之间的差距还是很大的, 好了, 废话不多说, 我们开始解析HTML。

    那么解析XML的库比较多, 这里选用libxml来解析, 因为libxml是c语言接口, 找了一个用objective-c包装接口的库-hpple, 它的地址是https://github.com/topfunky/hpple, 那么网页用的是豆瓣电影排行榜, 地址是http://movie.douban.com/chart

    接下来新建工程, 工程采用的ARC, 引进libxml2和hpple库, 新建实体类movie, 完整的项目结构如下: 

    NewImage

    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;
        }];
    }

     

    这里只是简单的获取网页内容, 一些HTTP和错误处理不在此文讨论中, 所以这里的代码比较简单, 在上面的代码中有个parserHTML:的方法, 就是来解析获取的网页内容, 在解析网页内容之前, 先来扯下xpath。

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

    <html>
      <head>
        <title>Some webpage</title>
      </head>
      <body>
        <p class=”normal”>This is the first paragraph</p>
        <p class=”special”>This is the second paragraph. <b>This is in bold.</b></p>
      </body> 
    </html>

    比如想得到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, 得到一个数组, 遍历组织数据就能够在table view中展示了。具体效果如下:

    NewImage

    好了, 网页内容被抓取出来了, 具体的实际项目中都要比这个复杂, so, 这只是个引导的示例。

     

    参考:http://www.raywenderlich.com/14172/how-to-parse-html-on-ios#

    注: 本文由啸寒原著,请支持原著!转载请附上原文链接: http://www.cnblogs.com/xiaohan-wu/p/3203932.html

     

     

    转载于:https://www.cnblogs.com/xiaohan-wu/p/3203932.html

    展开全文
  • 怎样抓取网页中的图片地址呢?

    千次阅读 2006-11-23 16:20:00
    怎样抓取网页中的图片地址呢?所属分类:ASP.NET 提问者:机器人 悬赏分:50 提问时间:2006-8-8 11:37:11 解决时间:等待中… 怎样才能抓取网页中的图片地址呢?比如jpg,gif等格式的。回复: 我知道答案 ...
    怎样抓取网页中的图片地址呢?
    
    所属分类:ASP.NET
    提问者:机器人    悬赏分:50    提问时间:2006-8-8 11:37:11    解决时间:等待中…
    怎样才能抓取网页中的图片地址呢?比如jpg,gif等格式的。
    回复:   我知道答案

        private Hashtable GetImg(string html)
        {
            MatchCollection mm = Regex.Matches(html, @"((http|https|ftp|rtsp|mms):(|){1}(([A-Za-z0-9_-])+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3})(/S*//)((/S)+[.]{1}(bmp|jpg|gif)))", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

            int i = 0;
            bool repeat;
            Hashtable ht = new Hashtable();

            foreach (Match ss in mm)
            {
                if (i == 0)
                {
                    i++;
                    ht.Add(0, ss.ToString());
                }
                else
                {
                    repeat = false;
                    foreach (DictionaryEntry de in ht)
                    {
                        if (ss.ToString().ToLower() == de.Value.ToString().ToLower())
                        {
                            repeat = true;
                            break;
                        }
                    }
                    if (repeat == false)
                    {
                        ht.Add(i, ss.ToString());
                        i++;
                    }
                }
            }

            return ht;
        }

     
    展开全文
  • 在网上找了很多方法,都是只能抓取发出的请求数据,没有响应数据 recv(sock, recvInf, sizeof(recvInf), 0);//接收包 windows环境下,VS2015
  • 前几天我们报道了Google的Matt Cutts确认了adsense的Mediabot的确是会帮助Googlebot抓取网页的消息,但有部分人不相信Matt Cutts,或者不相信他能代表Google官方。作为Matt Cutts的blog的一名忠实读者,我觉得完全没...
    几天我们报道了Google的Matt Cutts确认了adsense的Mediabot的确是会帮助Googlebot抓取网页的消息,但有部分人不相信Matt Cutts,或者不相信他能代表Google官方。作为Matt Cutts的blog的一名忠实读者,我觉得完全没必要花费篇幅再去特别说明Matt Cutts的权威性。我想说的是,Matt Cutts在是Google品质管理部门的一名高级软件工程师,外界所知的是他负责研发阻止Spam与恶性控制排名的技术。因此,信不信当然由你 

      其实上次Matt所透露的仅仅是其中一方面的内容。今天,Matt再次写了一篇非常详细的文章,解释了Google的各种bot是怎样抓取网页的,以及Google最新的BigDaddy在抓取网页方面有什么新的变化等等,内容非常的精彩,所以和大家分享一下。

      首先要介绍的是Google的"crawl caching proxy"(爬行缓存代理)。Matt举了一个ISP与用户的例子来说明它。用户上网时,总是先通过ISP获取网页内容,然后ISP就会把用户访问过的网页缓存起来备用。比如说,当用户A访问了www.kenwong.cn,那么中国电信(或网通等)就会把"幻灭的麦克风"发送给用户A,然后将"幻灭的麦克风"缓存起来,当用户B在下一秒钟里再访问www.kenwong.cn,那么中国电信就会把缓存里的"幻灭的麦克风"发送给用户B,这样就能节省了带宽。

      正如本站之前所报道的那样,Google最新的软件层面的升级(转移至BigDaddy)已经接近完成,因此升级后的Google各方面的能力都将得到加强。这些加强包括了更智能化的googlebot爬行、改良的规范性以及更好的收录网页能力。而在Googlebot爬行抓取网页方面,Google也采取了节省带宽的方法。Googlebot也随着BigDaddy的升级而得到了升级。新的Googlebot已经正式支持了gzip编码,所以如果你的网站开启了gzip编码功能,那么就能节省Googlebot爬行你的网页时所占的带宽。

      除了改良的Googlebot外,升级后的Google将会采用上面所说到的crawl caching proxy来抓取网页,以进一步节省带宽。下面是一个示意图,显示了传统的Googlebot是怎样爬行一个网站的:从上图可见,以Googlebot爬行为主,Server A指的是AdSense,而Server N则可以是Google的blogsearch或其它。我们可以看出,同一个网站,Googlebot与adsense的Mediabot、blogsearch的bot都爬行过了,其中有很多重复的爬行。上图抓取网页的总数一共是23次。我们来看一下升级后的Google所采用的crawl caching proxy又是怎样的情形:
     很明显,因为crawl caching proxy将各种bot的抓取都缓存起来,因此当Googlebot已经抓取过某些网页,而Mediabot或其它bot再次抓取重复的网页时,crawl caching proxy就会发挥作用,直接将缓存里的网页返回给Mediabot等,这样就使得实际爬行次数减少,节省了带宽。

      从Matt的分析可以看出,Google这样做的确是能节省自己及网站的带宽,好处是能让Google的各种bot在一定的时间里爬行更多的网页,以方便收录。我的理解是,虽然好处是相当明显,但坏处也是有的。比如,当一个网站它以AdSense的广告费为生,那么它就需要AdSense的Mediabot不停地光临,以分析它的更新网页的内容,投放更相关的广告。但当这个网站是一个PR值不错的网站,那么Googlebot很可能会天天都来爬行它,这样一来,crawl caching proxy就会把Googlebot的爬行缓存起来,等Mediabot再来爬行的时候,它就直接把缓存的内容返回给Mediabot。这样一来就减少了Mediabot爬行该网站的次数。由于两种bot并不是采用完全相同的工作机制,因此这个网站有可能因此Mediabot的爬行次数的减少而使得显示的adsense广告的相关性减弱。因此,这种改进有可能带来一定的不公平。

    展开全文
  • 目的:获得商品的促销价格(实时价格) 我的思路: 以下面这个链接为例: ...id=42302206603&ns=1&abbucket=11#detail ...但[color=#FF0000]问题是[/color],上面能够显示促销价格的页面,当我把他的地址复制后...
  • 我的目的就想得到网页中vedio播放的地址 用jsoup抓网页代码不完整,好像是因为网页中的vedio使用js生成的,还没生成就抓取了所以抓不到, 有什么开源的爬虫是可以等网页完全加载完成才开始抓取
  • c#怎样抓取html网页数据

    千次阅读 2017-12-09 22:35:28
    若成功取得网页的内容,则以System.IO.Stream形式返回,若失败则产生ProtoclViolationException错 误。 System.IO.Stream respStream = httpResp.GetResponseStream(); /// 返回的内容是Stream形式的,所以可以...
    //方法一
    using System.Text.RegularExpressions;
    
    public static void webClientMethod1()
            {
                WebClient wc = new WebClient();
                wc.Encoding = Encoding.UTF8;
                //以字符串的形式返回数据
                string html = wc.DownloadString("https://www.baidu.com/");
    
                //以正则表达式的形式匹配到字符串网页中想要的数据
                MatchCollection matches = Regex.Matches(html, "<a.*>(.*)</a>");
                //依次取得匹配到的数据
                foreach (Match item in matches)
                {
                    Console.WriteLine(item.Groups[1].Value);
                }
                Console.ReadKey();
            }
    
    
    //方法二
     public static string SendRequest()
            {
                string url = "https://www.baidu.com/";
                Uri httpURL = new Uri(url);
    
                ///HttpWebRequest类继承于WebRequest,并没有自己的构造函数,需通过WebRequest的Creat方法 建立,并进行强制的类型转换   
                HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(httpURL);
                //httpReq.Headers.Add("cityen", "tj");
    
                ///通过HttpWebRequest的GetResponse()方法建立HttpWebResponse,强制类型转换   
                HttpWebResponse httpResp = (HttpWebResponse)httpReq.GetResponse();
    
                ///GetResponseStream()方法获取HTTP响应的数据流,并尝试取得URL中所指定的网页内容   
                ///若成功取得网页的内容,则以System.IO.Stream形式返回,若失败则产生ProtoclViolationException错 误。
                System.IO.Stream respStream = httpResp.GetResponseStream();
    
                ///返回的内容是Stream形式的,所以可以利用StreamReader类获取GetResponseStream的内容
                System.IO.StreamReader respStreamReader = new System.IO.StreamReader(respStream, Encoding.UTF8);
                //从流的当前位置读取到结尾
                string  strBuff = respStreamReader.ReadToEnd();
    
                //简单写法,跟上面的结果一样
                //using (var sr = new System.IO.StreamReader(httpReq.GetResponse().GetResponseStream()))
                //{
                //    var result = sr.ReadToEnd();
                //    Console.WriteLine("微信--" + DateTime.Now.ToString() + "--" + result);
                //}
                respStreamReader.Close();
                respStream.Close();
                return strBuff;
            }
    展开全文
  • Jsoup Java 库是一款非常好用的网页数据抓取...下面举个例子,怎样抓取网页数据。 下面网页是ICD-9-CM (International Classification of Diseases, Ninth Revision, Clinical Modification) 国际疾病分类码 http:/
  • 怎样快速抓取网页中的FLASH动画

    千次阅读 2012-01-15 01:35:06
    1、查看网页源代码,找到SWF文件的绝对地址,然后通过下载工具下载; 2、在浏览器的缓存文件里找; 3、用Flash辅助工具来查找,比如FlashJester Woof v1.0。 ***************************************** 巧抓...
  • 就是我想获得别人网页上的数据,比如说一篇新闻报道。我在百度上查了好久,查出来的都不对,希望高手赐教。最好有事例
  • 转载请注明出处! ... ...有时候因为种种原因,我们须要採集某个站点的数据...本文就用Java给大家演示怎样抓取站点的数据:(1)抓取原网页数据;(2)抓取网页Javascript返回的数据。 一、抓取原网页。 这个样例...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 248
精华内容 99
关键字:

怎样抓取网页